Змінна, яка має шлях до поточної книги, яка виконує ансибуль?


109

Чи існує змінна ansible, яка має абсолютний шлях до поточної програми, яка виконується?

деякий контекст: я запускаю / створюю ansible-скрипт проти localhostналаштування докера mysql і хочу встановити об'єм даних відносно скрипта ansible.

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


2
Цікаве запитання, про яке я ніколи не замислювався. Однак той факт, що ви його просите, є показником того, що ви можете робити щось дуже неправильно.
Антоніс Христофідес

Я погоджуюсь, я докладно розкрию @AntonisChristofides
Джош Унгер

Відповіді:


192

Ви можете використовувати playbook_dirзмінну.


2
Я зіткнувся з подібним питанням, і ваша відповідь вирішила це. Дякую. Однак я не зміг знайти жодного місця, де playbook_dirзадокументована змінна. Підкажіть, будь ласка, документацію. АБО, чи можете ви пояснити, як ви дізналися про цю змінну?
вбивствоблуцифер

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рішень або базованого рішення може бути достатньо.


2

На жаль, немає. Насправді абсолютний шлях дещо безглуздий (і потенційно заплутаний) у контексті того, як працює Ansible. У двох словах, коли ви викликаєте ігрову книжку, то для кожного завдання 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


7
У цьому випадку pwdне повертається шлях сценарію ігрової книги. Він повертає поточний каталог процесу (як правило ansible-playbook). Двоє не повинні бути однаковими і залежати від точного способу, на який викликали відповідальність.
Cray

5
@Cray правильний. Без уваги, я просто хотів зазначити, що Ansible вже готує для вас цю змінну: debug: var=ansible_env.PWD(це дає мені каталог, з якого я виконував ansible-playbookсвою локальну машину, і домашній каталог на віддалених серверах)
NS du Toit

4
Крім того, поточний каталог можна знайти за {{ lookup('env','PWD') }}
адресою
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.