Ошибка передачи переменной в файл include_task, имеющий add_host в Ansible - PullRequest
0 голосов
/ 26 сентября 2019

Я имею дело с порядком вложенных циклов для построения динамического хоста с использованием 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

Запрос решения этой проблемы и объяснение нескольких вопросов, которые у меня есть.

  1. Dest_ip читается и отлично работает с методом .split (,) внутри файла include_task get_hosts.yml, когда другие переменные, такие как install_dir_pass, не работают.

  2. Когда 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 }}"

1 Ответ

0 голосов
/ 26 сентября 2019

Как это очень хорошо объяснено в вашем сообщении об ошибке:

  • Существует конфликт имен между item каждого из вложенных циклов.
  • Вы должны установить loop_var имя в опции loop_control для разрешения конфликта в любом из циклов.

Я предлагаю вам сделать это на include_task, чтобы он решил проблемудля любого другого цикла внутри вашего включенного файла.Поскольку я понятия не имею, что именно содержит ваш command_result.stdout_lines, я использовал в приведенном ниже примере имя переменной my_result, которое вы должны изменить в соответствии с вашей ситуацией.Обратите внимание, что эта переменная будет доступна непосредственно во включаемом файле, если это необходимо.

   - name: Add hosts
     include_tasks: "{{ playbook_dir }}/gethosts.yml"
     vars:
       dest_ip: "{{ my_result.split('\t')[0] }}"
       file_dets: "{{ my_result.split('\t')[1] }}"
       USER_pass:  "{% if my_result.split('\t')[3] == 'FrontEnd' %}user1{% elif my_result.split('\t')[3] == 'BackEnd' %}user2{% else %}{% endif %}"
       ansible_host: localhost
       install_dir_pass: "{{ my_result.split('\t')[2] }}"
     with_items: "{{ command_result.stdout_lines }}"
     loop_control:
       loop_var: my_result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...