发出将变量传递给ansible shell或命令模块的命令

发出将变量传递给ansible shell或命令模块的命令,ansible,ansible-inventory,Ansible,Ansible Inventory,我有一个清单文件,看起来像: [swarm_master] ubuntu01 --- - debug: msg="{{ item }}" with_items: - "{{ groups['swarm_master'] }}" - shell: echo {{ groups['swarm_master'] }} register: result - debug: var=result.cmd - set_fact: advertise_address: "{{

我有一个清单文件,看起来像:

[swarm_master]
ubuntu01
---
- 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
我的main.yml文件如下所示:

[swarm_master]
ubuntu01
---
- 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关键字通过分组进行迭代显示正确的值。

这是因为当您传入该组时,即使有一个项目,它仍然是一个列表,因此您将获得该列表格式和值。如果您知道组中只有一个项目,您可以这样传递:

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

如果你不知道会有多少个,那么你可以像调试一样使用with_items模块。

我也会这么说,但是OP会以
[ubuntu]
而不是
[u'ubuntu']
结束。但从我在上面看到的情况来看,这似乎是一个unicode字符串的问题。不过,不知道OP是如何以unicode字符串结束的。