将变量传递给 ansible shell 或命令模块
Issue passing variable to ansible shell or command module
我有一个清单文件,它看起来像:
[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 剧本给出结果:
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 个项目,你可以像这样传递它:
- shell: echo {{ groups['swarm_master'][0] }}
register: result
如果不知道会有多少,那么您可以像调试时那样使用 with_items 模块。
我有一个清单文件,它看起来像:
[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 剧本给出结果:
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 个项目,你可以像这样传递它:
- shell: echo {{ groups['swarm_master'][0] }}
register: result
如果不知道会有多少,那么您可以像调试时那样使用 with_items 模块。