Я имею дело с порядком вложенных циклов для построения динамического хоста с использованием add_host.
Outer Loop: with_items: "{{ command_result.stdout_lines }}" // gets me the list of users
Inner Loop: with_items: "{{ dest_ip.split(',') }}" // gets me the list of IP addresses seperated by comma (,)
Приведенный ниже список воспроизведения отлично работает.
- name: Add hosts
include_tasks: "{{ playbook_dir }}/gethosts.yml"
vars:
dest_ip: "{{ item.split('\t')[0] }}"
file_dets: "{{ item.split('\t')[1] }}"
USER_pass: "anystring"
# USER_pass: "{% if item.split('\t')[3] == 'FrontEnd' %}user1{% elif item.split('\t')[3] == 'BackEnd' %}user2{% else %}{% endif %}"
ansible_host: localhost
install_dir_pass: "anystring"
# install_dir_pass: "{{ item.split('\t')[2] }}"
with_items: "{{ command_result.stdout_lines }}"
Ниже приведен мой файл include_task gethost.yml:
---
- name: Generate JSON data
add_host:
name: "{{ item }}"
groups: dest_nodes
ansible_user: "{{ USER_pass }}"
install_dir: "{{ install_dir_pass }}"
with_items: "{{ dest_ip.split(',') }}"
Я получаю приведенную ниже ошибку, если я раскомментирую либо USER_pass, либо install_dir_pass и прокомментирую существующее значение:
ЗАДАНИЕ [Создать данные JSON] *********************************************************************************************************************************** Путь к задаче: / приложение / развертывание / gethosts.yml: 2 [ПРЕДУПРЕЖДЕНИЕ]: переменная цикла 'item' уже используется.Вам следует установить значение loop_var
в параметре loop_control
для задачи на другое значение, чтобы избежать конфликтов переменных и непредвиденного поведения.
fatal: [localhost]: FAILED!=> {"msg": "Задача включает параметр с неопределенной переменной. Ошибка была: у объекта списка нет элемента 2 \ n \ nОшибка, по-видимому, находится в /app/deployment/gethosts.yml ': строка 2, столбец 4, но может \ n находиться в другом месте файла, в зависимости от точной проблемы синтаксиса. \ n \ nВредной строкой является: \ n \ n --- \ n - name: генерировать данные JSON \ n
^здесь \ n "}
НЕТ БОЛЬШЕ ХОСТОВ ВЛЕВО
ВОСПРОИЗВЕДЕНИЕ ************************************************************************************************************************************************** localhost: ok = 12 изменено = 1 недоступно = 0
не удалось = 1 пропущено = 0 спасено = 0 проигнорировано = 0
Запрос решения этой проблемы и объяснение нескольких вопросов, которые у меня есть.
Dest_ip читается и отлично работает с методом .split (,) внутри файла include_task get_hosts.yml, когда другие переменные, такие как install_dir_pass, не работают.
Когда USER_pass и install_dir_pass получают простую строку «AnyString», это работает и отлично читается внутри get_hosts.yml, где, как будто им присвоены значения, используя item.split ('\ t') [] ошибки playbook как выше.
Я уже тестировал с помощью отладки, что все записи в command_result хороши и значения должны быть заполнены правильно, как показано ниже.
- debug:
msg: "{{ item.split('\t')[0] }}"
# msg: "{{ item.split('\t')[1] }}"
#msg: "{{ item.split('\t')[2] }}"
# msg: "{{ item.split('\t')[3] }}"
with_items: "{{ command_result.stdout_lines }}"