访问具有变量名的ansible host_var



我正在尝试使用变量获取host_var并获取警告消息,有更好的方法可以实现吗?

我的库存是

dev_cluster:
hosts:
host-vm01:
install:
httpd: true
zookeeper: true
mysqld: true
host-vm02:
install:
httpd: true
zookeeper: true
mysql: true
host-vm03:
install:
httpd: true
mysql: false

这是我的When块,component_name是调用播放时将发生变化的额外变量。

- name: ADD HOST
add_host:
name: "{{ inventory_hostname }}"
group: component_name_group
delegate_to: localhost
changed_when: false
when: 
- hostvars[inventory_hostname].install.{{ component_name }} is defined
- hostvars[inventory_hostname].install.{{ component_name }}

下面是我收到的警告信息。

[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: hostvars[inventory_hostname].install.{{ component_name }} is defined
[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: hostvars[inventory_hostname].install.{{ component_name }}

我尝试了各种各样的可能性,但现在已经没有选择了。

The conditional check 'hostvars[inventory_hostname].install.[component_name] is defined'
The conditional check 'hostvars[inventory_hostname].install.'component_name' is defined'

如果我把单引号或双引号放错了。请帮助

感谢

在第一次播放中创建组component_name_group,并在第二次播放中使用它。

例如,下面的剧本

shell> cat playbook.yml
- name: "Create group component_name_group"
hosts: all
gather_facts: false
vars:
host_install: "{{ dict(ansible_play_hosts_all|
zip(ansible_play_hosts_all|
map('extract', hostvars, 'install'))) }}"
hosts_component: "{{ host_install|dict2items|json_query(_query) }}"
_query: "[?value.{{ component_name|d('none') }}].key"
tasks:
- block:
- assert:
that: hosts_component|length > 0
fail_msg: Nothing to install.
- add_host:
name: "{{ item }}"
groups: component_name_group
loop: "{{ hosts_component }}"
run_once: true
- name: "Install {{ component_name }}"
hosts: component_name_group
gather_facts: false
tasks:
- debug:
msg: "Install {{ component_name }} on {{ inventory_hostname }}"

创建字典host_install

host_install:
host-vm01:
httpd: true
mysqld: true
zookeeper: true
host-vm02:
httpd: true
mysql: true
zookeeper: true
host-vm03:
httpd: true
mysql: false

并且,例如,给定component_name=httpd,创建主机列表并将它们添加到组中

hosts_component:
- host-vm01
- host-vm02
- host-vm03

第二次播放然后安装实用程序

shell> ansible-playbook playbook.yml -e component_name=httpd
PLAY [Create group component_name_group] *****************************
...
PLAY [Install httpd] *************************************************
TASK [debug] *********************************************************
ok: [host-vm01] => 
msg: Install httpd on host-vm01
ok: [host-vm02] => 
msg: Install httpd on host-vm02
ok: [host-vm03] => 
msg: Install httpd on host-vm03
...

最新更新