service:ansible
Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
service:ansible [26.08.2025 17:47] – [Выбор каталога шаблона в зависимости от группы хоста] viacheslav | service:ansible [02.10.2025 06:46] (текущий) – [Windows] viacheslav | ||
---|---|---|---|
Строка 499: | Строка 499: | ||
==== Шаблоны Jinja2 ==== | ==== Шаблоны Jinja2 ==== | ||
+ | <WRAP round tip 60%> | ||
+ | Чтобы избавить себя от возни с лишними строками и отступами в формируемом файле, нужно добавить в шаблон .j2 | ||
+ | <code python> | ||
+ | #jinja2: lstrip_blocks: | ||
+ | </ | ||
+ | |||
+ | > First, I’ll give you an easy, by far more preferable, way of taming whitespace and then we’ll dig into the more involving methods. | ||
+ | > So here it comes: | ||
+ | > //Always render with trim_blocks and lstrip_blocks options enabled.// | ||
+ | > That’s it, the big secret is out. Save yourself trouble and tell Jinja2 to apply trimming and stripping to all of the blocks. | ||
+ | [[https:// | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
Это движок для подстановки переменных или для динамического формирования конфигурационных файлов. Ссылка на переменную идёт в любом файле yaml в двойных фигурных скобках. | Это движок для подстановки переменных или для динамического формирования конфигурационных файлов. Ссылка на переменную идёт в любом файле yaml в двойных фигурных скобках. | ||
<code yaml> | <code yaml> | ||
Строка 578: | Строка 593: | ||
https:// | https:// | ||
https:// | https:// | ||
+ | |||
+ | === Условия === | ||
+ | В зависимости от значения '' | ||
+ | |||
+ | Задача | ||
+ | <code yaml> | ||
+ | - name: demo the template | ||
+ | hosts: localhost | ||
+ | gather_facts: | ||
+ | vars: | ||
+ | setting: a_val | ||
+ | feature: | ||
+ | enabled: true | ||
+ | another_setting: | ||
+ | tasks: | ||
+ | - name: pause with render | ||
+ | pause: | ||
+ | prompt: "{{ lookup(' | ||
+ | </ | ||
+ | Шаблон | ||
+ | <code python> | ||
+ | setting = {{ setting }} | ||
+ | {% if feature.enabled %} | ||
+ | feature = True | ||
+ | {% else %} | ||
+ | feature = False | ||
+ | {% endif %} | ||
+ | another_setting = {{ another_setting }} | ||
+ | </ | ||
+ | |||
+ | == Встроенное условие == | ||
+ | <code yaml> | ||
+ | - name: demo the template | ||
+ | hosts: localhost | ||
+ | gather_facts: | ||
+ | vars: | ||
+ | api: | ||
+ | v2: true | ||
+ | tasks: | ||
+ | - name: pause with render | ||
+ | debug: | ||
+ | msg: "API = cinder{{ ' | ||
+ | </ | ||
+ | Выведет '' | ||
+ | |||
+ | === Цикл с фильтрацией элементов === | ||
+ | Если в data_dirs есть список значений, | ||
+ | <code yaml> | ||
+ | - name: demo the template | ||
+ | hosts: localhost | ||
+ | gather_facts: | ||
+ | vars: | ||
+ | data_dirs: | ||
+ | - Ыыы | ||
+ | - Зьзьзь | ||
+ | - Жжжжж | ||
+ | - ЪУЪ | ||
+ | tasks: | ||
+ | - name: pause with render | ||
+ | pause: | ||
+ | prompt: "{{ lookup(' | ||
+ | </ | ||
+ | |||
+ | Шаблон с отсевом значения ''/'', | ||
+ | <code python># data dirs | ||
+ | {% for dir in data_dirs if dir != "/" | ||
+ | {% if loop.first -%} | ||
+ | data_dir = {{ dir }}{{ ',' | ||
+ | {% else -%} | ||
+ | {{ dir }}{{ ',' | ||
+ | {% endif -%} | ||
+ | {% else -%} | ||
+ | # no data dirs found | ||
+ | {% endfor -%} | ||
+ | </ | ||
+ | |||
+ | Способы доступа к индексу цикла | ||
+ | ^Переменная ^Описание ^ | ||
+ | |loop.index |Текущая итерация данного цикла (начиная с 1) | | ||
+ | |loop.index0 |Текущая итерация данного цикла (начиная с 0) | | ||
+ | |loop.revindex |Общее число итераций до окончания данного цикла (начиная с 1) | | ||
+ | |loop.revindex0 |Общее число итераций до окончания данного цикла (начиная с 0) | | ||
+ | |loop.first |Булево True если это первая итерация | | ||
+ | |loop.last |Булево True если это последняя итерация | | ||
+ | |loop.first |Общее число элементов в данной последовательности | | ||
+ | https:// | ||
+ | |||
==== Динамические переменные ==== | ==== Динамические переменные ==== | ||
Используются для нескольких ОС, где разные пути к конфигам и один и тот же пакет называется по-разному, | Используются для нескольких ОС, где разные пути к конфигам и один и тот же пакет называется по-разному, | ||
Строка 795: | Строка 897: | ||
</ | </ | ||
+ | ===== Windows ===== | ||
+ | Особый подход, | ||
+ | |||
+ | Inventory.\\ | ||
+ | <code ini> | ||
+ | [server1] | ||
+ | server1.example.com ansible_connection=winrm ansible_port=5985 ansible_winrm_transport=ntlm | ||
+ | </ | ||
+ | <WRAP round important 80%> | ||
+ | Если возникает ошибка '' | ||
+ | Если используется WinRM HTTPS (порт 5986), то бывает полезным добавить опцию '' | ||
+ | </ | ||
+ | |||
+ | Пример ad-hoc | ||
+ | <code bash> | ||
+ | ansible all -i ' | ||
+ | </ | ||
+ | |||
+ | |||
+ | Пример задачи. Для Windows лучше оборачивать переменные с путями в одинарные кавычки, | ||
+ | <code yaml> | ||
+ | - name: Remove {{ deploy_dir }} | ||
+ | win_file: | ||
+ | path: '{{ deploy_dir }}' | ||
+ | state: absent | ||
+ | |||
+ | - name: Create {{ deploy_dir }} | ||
+ | win_file: | ||
+ | path: '{{ deploy_dir }}' | ||
+ | state: directory | ||
+ | |||
+ | - name: Copy autotests to {{ deploy_dir }} | ||
+ | win_copy: | ||
+ | src: autotest/ | ||
+ | dest: '{{ deploy_dir }}' | ||
+ | |||
+ | #- name: Dir files | ||
+ | # win_shell: | | ||
+ | # dir ~ | ||
+ | # dir '{{ deploy_dir }}' | ||
+ | # test-path '{{ run_bat }}' | ||
+ | # register: dir_result | ||
+ | |||
+ | #- debug: | ||
+ | # var: dir_result.stdout_lines | ||
+ | |||
+ | - name: Run {{ run_bat }} | ||
+ | win_shell: '{{ run_bat }}' | ||
+ | args: | ||
+ | executable: cmd | ||
+ | chdir: '{{ run_bat_dir }}' | ||
+ | </ | ||
====== Конкретные задачи ====== | ====== Конкретные задачи ====== | ||
===== Копирование с одного удалённого сервера на другой ===== | ===== Копирование с одного удалённого сервера на другой ===== | ||
Строка 1304: | Строка 1458: | ||
[[https:// | [[https:// | ||
+ | ===== Получение списка дочерних групп в группе ===== | ||
+ | Для копирования шаблонов из подкаталогов. Группа с дочерними в инвентори: | ||
+ | <file ini hosts.txt> | ||
+ | [queue_servers: | ||
+ | a_servers | ||
+ | b_servers | ||
+ | c_servers | ||
+ | d_servers | ||
+ | </ | ||
+ | |||
+ | Роль: | ||
+ | <file yaml roles/ | ||
+ | - name: Dump hosts to json file | ||
+ | command: | ||
+ | cmd: ansible-inventory -i hosts.txt --list --output hosts.json | ||
+ | delegate_to: | ||
+ | |||
+ | - name: Json file to variable | ||
+ | include_vars: | ||
+ | file: hosts.json | ||
+ | name: hosts | ||
+ | |||
+ | - debug: | ||
+ | msg: "{{ item }}/ | ||
+ | loop: "{{ hosts.queue_servers.children }}" | ||
+ | </ | ||
+ | Результат выполнения: | ||
+ | < | ||
+ | ok: [k3.workgroup] => (item=a_servers) => { | ||
+ | " | ||
+ | } | ||
+ | ok: [k3.workgroup] => (item=b_servers) => { | ||
+ | " | ||
+ | } | ||
+ | ok: [k3.workgroup] => (item=c_servers) => { | ||
+ | " | ||
+ | } | ||
+ | ok: [k3.workgroup] => (item=d_servers) => { | ||
+ | " | ||
+ | } | ||
+ | </ | ||
====== Ошибки, | ====== Ошибки, | ||
Строка 1351: | Строка 1546: | ||
[[https:// | [[https:// | ||
[[https:// | [[https:// | ||
- | [[https:// | + | [[https:// |
+ | [[https:// | ||
service/ansible.1756230476.txt.gz · Последнее изменение: — viacheslav