从 Python 在 Ansible 中动态分配主机属性
Assigning the hosts attribute dynamically in Ansible from Python
我正在将 Ansible 与 Python 和 MySQL 数据库集成。我的用例的一部分是给 Ansible 一个组名,将该组名发送到 python,后者执行数据库读取和 returns 与该组名对应的 IP 列表。
为了进行测试,我想 ping 返回的 IP。
这是我实现相同目标的剧本:
name: run a cmd
hosts: localhost
connection: local
tasks:
name: runs a python script with a parameter
shell: python /pythonScripts/AnsibleDBRead.py <someGroupName>
register: py_ret
- set_fact:
ip_list: "{{py_ret.stdout}}"
- debug: var=hostvars['localhost']['ip_list'] # option to set messages here as well but not both together
name: png the hosts returned
hosts: hostvars['localhost']['ip_list'] #this does not work
#hosts: [ "127.0.0.1", "54.147.177.9"] #this works same value but hardcoded
tasks:
- debug: var=hostvars['localhost']['ip_list'] # able to print the value
我试图将 ip_list
中存储的值设置为 hosts:
以进行第二次播放,但没有成功。我得到的错误是没有匹配的主机。这是 n 运行 硬编码部分注释时的输出。忽略脚本的格式。
PLAY [run a cmd] ***************************************************************
TASK [setup] *******************************************************************
ok: [localhost]
TASK [runs a python script with a parameter] ***********************************
changed: [localhost]
TASK [set_fact] ****************************************************************
ok: [localhost]
TASK [debug] *******************************************************************
ok: [localhost] => {
"hostvars['localhost']['ip_list']": [
"127.0.0.1",
"54.147.177.9"
]
}
PLAY [png the hosts returned] **************************************************
skipping: no hosts matched
PLAY RECAP *********************************************************************
localhost : ok=4 changed=1 unreachable=0 failed=0
根据我所阅读的内容,我应该能够使用 hostvars
在另一部剧中访问在一部剧中声明的变量。感谢任何帮助。
经过反复试验,我认为这对你有用:
- name: ping the hosts returned
hosts: "{{ hostvars['localhost']['ip_list'] | join(',') }}"
tasks:
- debug:
这似乎是一个已知问题:pass array as "hosts" in playbook #16051 和解决方法。
我正在将 Ansible 与 Python 和 MySQL 数据库集成。我的用例的一部分是给 Ansible 一个组名,将该组名发送到 python,后者执行数据库读取和 returns 与该组名对应的 IP 列表。 为了进行测试,我想 ping 返回的 IP。
这是我实现相同目标的剧本:
name: run a cmd
hosts: localhost
connection: local
tasks:
name: runs a python script with a parameter
shell: python /pythonScripts/AnsibleDBRead.py <someGroupName>
register: py_ret
- set_fact:
ip_list: "{{py_ret.stdout}}"
- debug: var=hostvars['localhost']['ip_list'] # option to set messages here as well but not both together
name: png the hosts returned
hosts: hostvars['localhost']['ip_list'] #this does not work
#hosts: [ "127.0.0.1", "54.147.177.9"] #this works same value but hardcoded
tasks:
- debug: var=hostvars['localhost']['ip_list'] # able to print the value
我试图将 ip_list
中存储的值设置为 hosts:
以进行第二次播放,但没有成功。我得到的错误是没有匹配的主机。这是 n 运行 硬编码部分注释时的输出。忽略脚本的格式。
PLAY [run a cmd] ***************************************************************
TASK [setup] *******************************************************************
ok: [localhost]
TASK [runs a python script with a parameter] ***********************************
changed: [localhost]
TASK [set_fact] ****************************************************************
ok: [localhost]
TASK [debug] *******************************************************************
ok: [localhost] => {
"hostvars['localhost']['ip_list']": [
"127.0.0.1",
"54.147.177.9"
]
}
PLAY [png the hosts returned] **************************************************
skipping: no hosts matched
PLAY RECAP *********************************************************************
localhost : ok=4 changed=1 unreachable=0 failed=0
根据我所阅读的内容,我应该能够使用 hostvars
在另一部剧中访问在一部剧中声明的变量。感谢任何帮助。
经过反复试验,我认为这对你有用:
- name: ping the hosts returned
hosts: "{{ hostvars['localhost']['ip_list'] | join(',') }}"
tasks:
- debug:
这似乎是一个已知问题:pass array as "hosts" in playbook #16051 和解决方法。