Переменная, у которой есть путь к текущей исполняемой ansible-playbook?

109

Есть ли доступная переменная, у которой есть абсолютный путь к текущей исполняемой ansible-playbook?

некоторый контекст: я запускаю / создаю сценарий ansible localhostдля настройки докера mysql и хочу смонтировать том данных относительно сценария ansible.

Например, предположим, что я проверяю репозиторий, ~/branch1/а затем запускаю, ansible-playbook dev.ymlя думал, что он должен сохранить том в ~/branch1/.docker_volume/. Если я запустил его, ~/branch2он должен настроить громкость на ~/branch2/.docker_volume/.

Джош Унгер
источник
2
Интересный вопрос, о котором я никогда не задумывался. Однако тот факт, что вы спрашиваете об этом, указывает на то, что вы, возможно, делаете что-то очень неправильно.
Антонис Христофидес,
Я согласен, я уточню @AntonisChristofides
Джош Унгер

Ответы:

192

Вы можете использовать playbook_dirпеременную.

Сева Поляков
источник
2
Я столкнулся с аналогичной проблемой, и ваш ответ решил ее. Спасибо. Однако я не смог найти ни одного места, где playbook_dirзадокументирована переменная. Не могли бы вы указать мне на документацию. ИЛИ, не могли бы вы объяснить, как вы узнали об этой переменной?
slayedbylucifer
3
Я нахожу это в коде ansible: github.com/ansible/ansible/blob/…
Сева Поляков
2
ТАКЖЕ есть интересное репо github.com/lorin/ansible-quickref со всеми переменными.
Сева Поляков
46

Кажется, не существует переменной, которая содержит именно то, что вы хотите.

Однако, цитируя документы :

Также доступен inventory_dirпуть к каталогу, в котором находится файл хоста инвентаризации Ansible, inventory_fileэто путь и имя файла, указывающие на файл хоста инвентаризации Ansible.

playbook_dir содержит базовый каталог playbook.

И, наконец, role_pathвернет путь к текущей роли (начиная с версии 1.8). Это будет работать только внутри роли.

В зависимости от вашей настройки $ pwdможет быть достаточно тех или иных решений.

Cray
источник
2

К сожалению, нет. Фактически, абсолютный путь немного бессмысленен (и потенциально сбивает с толку) в контексте того, как работает Ansible. Вкратце, когда вы вызываете playbook, то для каждой задачи Ansible физически копирует модуль, связанный с задачей, во временный каталог на целевой машине, а затем вызывает модуль с необходимыми параметрами. Таким образом, абсолютный путь на целевой машине - это всего лишь временный каталог, который содержит только несколько временных файлов и даже не включает полную книгу воспроизведения. Кроме того, знание полного пути к файлу на сервере Ansible практически бесполезно на целевом компьютере, если вы не реплицируете все дерево каталогов Ansible на целевых объектах.

Чтобы увидеть все переменные, определенные Ansible, вы можете просто выполнить следующую команду :

$ ansible -m setup hostname

По какой причине вы думаете, что вам нужно знать абсолютный путь к пьесе?

Брюс П.
источник
Спасибо, Брюс, я изменил свой вопрос, чтобы уточнить, что я пытался сделать.
Джош Унгер
6
Абсолютный локальный путь вовсе не бессмысленен. Например, его можно использовать для запуска любых локальных команд и / или запроса других локальных файлов или служб, которые не могут быть напрямую включены в конфигурацию ansible. Тот факт, что у ansible есть local_actionмодуль, означает, что для этого есть законные варианты использования.
Cray
1

Я использовал такой сценарий, чтобы проверить свои роли на местном уровне:

---
- hosts: localhost
  roles:
     - role: .

но это перестало работать с Ansible v2.2.

Я отлаживал вышеупомянутое решение

---
- hosts: all
  tasks:
    - name: Find out playbooks path
      shell: pwd
      register: playbook_path_output
    - debug: var=playbook_path_output.stdout

и он создал мой домашний каталог, а не "текущий рабочий каталог"

Я согласился с

---
- hosts: all
  roles:
    - role: '{{playbook_dir}}'

в соответствии с решением выше.

Эндрю Ротштейн
источник
1

Для этой цели нет встроенной переменной, но вы всегда можете узнать абсолютный путь к плейбуку с помощью команды «pwd» и зарегистрировать ее вывод в переменной.

- name: Find out playbook's path
  shell: pwd
  register: playbook_path_output
- debug: var=playbook_path_output.stdout

Теперь путь доступен в переменной playbook_path_output.stdout

Hyt
источник
7
В этом случае pwdне возвращает путь сценария playbook. Он возвращает текущий каталог процесса (обычно ansible-playbook). Эти два параметра не обязательно должны быть одинаковыми и зависят от того, каким образом был вызван анзибль.
Cray
5
@Cray правильный. Тем не менее, я просто хотел упомянуть, что Ansible уже готовит для вас эту переменную: debug: var=ansible_env.PWD(это дает мне каталог, из которого я выполнял ansible-playbookна моем локальном компьютере, и домашний каталог на удаленных серверах)
NS du Toit
4
В качестве альтернативы текущий каталог можно найти с помощью:{{ lookup('env','PWD') }}
isedwards