правильный способ объявить переменную в доступной пьесе

У меня есть следующая пьеса:

  1 ---
  2 - hosts: lxc_hosts
  3   name:  install software on lxc container
  4   tasks:
  5   - name: get list of containers on lxc host {{inventory_hostname}}
  6     shell: >
  7       lxc-ls | more | tr '\n' ',' | sed 's/,$//'
  8     register: containers
  9   - set_fact:
 10       container_list: "{{ containers.stdout.split(',')|select('match', 'server*')|list }}"
 11   - debug: msg="{{item}}"
 12     with_items:
 13       - "{{container_list}}"
 14   - name: Run memory command within "running" container
 15     lxc_container:
 16       name: "{{item}}"
 17       with_items: 
 18         - "{{container_list}}"
 19       container_command: |
 20         df -h
 21       register: memory_check
 22   - debug: msg="{{memory_check.stdout}}"

Это возвращает следующие результаты:

PLAY [install software on lxc container] 
****************************************

TASK [setup]
******************************************************************* 
ok: [10.1.1.1]

TASK [get list of containers on lxc host 10.1.1.1]
************************* 
changed: [10.1.1.1]

TASK [set_fact]
**************************************************************** 
ok: [10.1.1.1]

TASK [debug]
*******************************************************************
ok: [10.1.1.1] => (item=server1-container) => {
    "item": "server1-container", 
    "msg": "server1-container" } 
ok: [10.1.1.1] => (item=server2-container) => {
    "item": "server2-container", 
    "msg": "server2-container" } 
ok: [10.1.1.1] => (item=server3-container) => {
     "item": "server3-container", 
    "msg": "server3-container" }

TASK [Run memory command within "running" container]
*************************** 
fatal: [10.1.1.1]: FAILED! => {"failed": true, "msg": "'item' is undefined"}

NO MORE HOSTS LEFT
*************************************************************   
     to retry, use: --limit @playbooks/inventory_get_containers_on_lxc.retry

PLAY RECAP
*********************************************************************
10.1.1.1               : ok=4    changed=1    unreachable=0    failed=1   

mymachine:/etc/ansible#

Я играл между set_fact и "vars", но, похоже, я не могу этого добиться. Как видите, оператор отладки в строке 11 приводит к списку, который вы видите ниже ... который, похоже, работает ... и который, похоже, доказывает, что я правильно установил переменную. Я не знаю, что еще попробовать.

Спасибо.

ИЗМЕНИТЬ 1

Вот как выглядит мой код для этого конкретного раздела:

 14   - name: Run memory command within "running" container
 15     lxc_container:
 16       name: "{{item}}"
 17     with_items:
 18 #         - "{{ containers.stdout.split(',')|select('match', 'server*')|list }}"
 19         - "{{container_list}}"
 20       container_command: |
 21         df -h
 22     register: memory_check
 23   - debug: msg="{{memory_check.stdout}}"

Когда я запускаю его, я получаю следующее сообщение об ошибке:

ОШИБКА! Синтаксическая ошибка при загрузке YAML.

Ошибка, по-видимому, была в '/etc/ansible/playbooks/lxc_container_test.yml': строка 20, столбец 7, но может быть в другом месте файла в зависимости от точной синтаксической проблемы.

Оскорбительная строка выглядит так:

    - "{{container_list}}"
  container_command: |
  ^ here

Строка 20 имеет отступ на 2 пробела по сравнению со строкой with_items в строке 17.


person Happydevdays    schedule 20.05.2016    source источник


Ответы (3)


Ваш playbook неверен в строке 15-22 (в частности, отступ и кавычки), правильная форма:

lxc_container:
  name: {{ item }}
  container_command: |
    df -h
  register: memory_check
  with_items: container_list
person OpenITeX    schedule 25.09.2016
comment
Для register и with_items необходимо убрать отступ на два пробела, чтобы поставить их в ряд с lxc_container. Я попытался отредактировать сообщение, но stackoverflow не позволяет редактировать 4-символьные пробелы ... - person user187557; 05.04.2019
comment
И {{item}} нужны кавычки, чтобы он не был словарем YAML, например: name: {{item}} - person user187557; 05.04.2019

У задачи Run memory command within "running" container неправильный отступ.

with_items и register - это свойства задачи Ansible, а не свойства модуля lxc_container, поэтому они должны быть встроены в свойства задачи Ansible.

Оригинал:

 14   - name: Run memory command within "running" container
 15     lxc_container:
 16       name: "{{item}}"
          # with_items is a Ansible Task property, so it shouldn't be here
 17       with_items: 
 18         - "{{container_list}}"
 19       container_command: |
 20         df -h
          # register is an Ansible Task property, so it shouldn't be here
 21       register: memory_check

Исправленный:

        # Ansible task properties are intented at this level
 14   - name: Run memory command within "running" container
 17     with_items: "{{container_list}}"
 15     lxc_container:
          # lxc_container properties are indented at this level
 16       name: "{{item}}"
 19       container_command: |
 20         df -h
 21     register: memory_check
person user187557    schedule 05.04.2019

Вот исправленный код. Вы правильно определили переменную .set-fact используется для определения глобальной переменной в пьесе. Только отступ with_items был неправильным. Теперь должно работать

 15     lxc_container:
 16       name: "{{item}}"
 17     with_items:
 18         - "{{container_list}}"
 19       container_command: |
 20         df -h
 21     register: memory_check
 22   - debug: msg="{{memory_check.stdout}}"
person Deepali Mittal    schedule 21.05.2016
comment
Привет. Я попробовал ваше предложение, но получаю синтаксическую ошибку. См. РЕДАКТИРОВАТЬ 1 - person Happydevdays; 23.05.2016
comment
Исправленный синтаксис см. Здесь: stackoverflow.com/a/39685471/6841451 - person OpenITeX; 30.08.2018