Ошибка передачи переменной в ansible оболочку или командный модуль - PullRequest
0 голосов
/ 11 октября 2019

У меня есть файл инвентаря, который выглядит так:

[swarm_master]
ubuntu01

мой файл main.yml выглядит так:

---
- debug: msg="{{ item }}" 
  with_items:
    - "{{ groups['swarm_master'] }}"

- shell: echo {{ groups['swarm_master'] }}
  register: result

- debug: var=result.cmd

- set_fact:
    advertise_address: "{{ groups['swarm_master'] }}"

- shell: echo {{ advertise_address }}
  register: result2

- debug: var=result2.cmd

- command: "echo {{ groups['swarm_master'] }}"
  register: result3

- debug: var=result3.cmd

Ansible playbook дает результат:

PLAY [Apply docker role] ***********************************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************************************
ok: [ubuntu01]

TASK [swarm : debug] ***************************************************************************************************************************************************************************************
ok: [ubuntu01] => (item=ubuntu01) => {
    "msg": "ubuntu01"
}

TASK [swarm : shell] ***************************************************************************************************************************************************************************************
changed: [ubuntu01]

TASK [swarm : debug] ***************************************************************************************************************************************************************************************
ok: [ubuntu01] => {
    "result.cmd": "echo [u'ubuntu01']"
}

TASK [swarm : set_fact] ************************************************************************************************************************************************************************************
ok: [ubuntu01]

TASK [swarm : shell] ***************************************************************************************************************************************************************************************
changed: [ubuntu01]

TASK [swarm : debug] ***************************************************************************************************************************************************************************************
ok: [ubuntu01] => {
    "result2.cmd": "echo [u'ubuntu01']"
}

TASK [swarm : command] *************************************************************************************************************************************************************************************
changed: [ubuntu01]

TASK [swarm : debug] ***************************************************************************************************************************************************************************************
ok: [ubuntu01] => {
    "result3.cmd": [
        "echo", 
        "[uubuntu01]"
    ]
}

PLAY RECAP *************************************************************************************************************************************************************************************************
ubuntu01                   : ok=9    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

Почему ansible добавляет в передаваемую переменную скобки и букву 'u'? Это показано в результатах отладки. Итерация по группам с ключевым словом with_items показывает правильные значения.

1 Ответ

0 голосов
/ 11 октября 2019

Это происходит потому, что когда вы передаете эту группу, даже с одним элементом, он остается списком, поэтому вы получаете форматирование этого списка вместе со значением. Если вы знаете, что в группе будет только 1 элемент, вы можете передать его следующим образом:

- shell: echo {{ groups['swarm_master'][0] }}
  register: result

Если вы не знаете, сколько их будет, вы можете использоватьмодуль with_items, как вы сделали с отладкой.

...