我正在尝试创建一个可配置和设置服务器及其备用服务器的剧本。清单来自Red Hat Satellite 6.x / Foreman,该剧本正在作为对Ansible AWX / Tower的回叫开始。
AWX使用--limit调用执行回调的特定服务器的剧本。但是我可以使用清单主机名访问整个清单。
要在主服务器和备用服务器之间通用的需要匹配的项目是foreman.location_id或foreman.location_name,foreman.hostgroup_id或foreman.hostgroup_title,foreman.environment_id或foreman.environment_name。这些也作为组成员身份公开给foreman_location_ [locationName],foreman_hostgroup_ [hostgroupTitle],foreman_environment_ [environmentName]。如果所有这些变量或组都匹配,则仅返回两个服务器。
我能够在每个组中找到服务器,例如:
- debug:
msg: "{{ item }}"
loop: "{{ query('inventory_hostnames', 'foreman_location_datacenter,&foreman_environment_production') }}"
但是我还无法弄清楚如何根据当前主机的组动态指定组。
- debug:
msg: "{{ item }}"
loop: "{{ query('inventory_hostnames', 'foreman_location_{{ foreman.location_name | map('trim') }}') }}"
我明白了
FAILED! => {"msg": "template error while templating string: expected token ',', got 'trim'. String: {{ query('inventory_hostnames', 'foreman_location_{{ foreman.location_name | map('trim') }}') }}"}
如果我从修剪周围删除,我什么也收不到。
当我尝试
- debug:
msg: "foreman_location_{{ foreman.location_name | map('trim') | list | join }}"
我得到了正确的字符串。
编辑: 我相信我已经找到了可行的解决方案:
- name: Set Facts
set_fact:
jer_location: "foreman_location_{{ foreman.location_name | map('trim') | list | join | lower }}"
jer_hostgroup: "foreman_hostgroup_{{ foreman.hostgroup_title | map('trim') | list | join | lower | replace('/', '_') }}"
jer_environment: "foreman_environment_{{ foreman.environment_name | map('trim') | list | join | lower }}"
- name: List hosts from variable groups
debug:
msg: "{{ item }}"
loop: "{{ query('inventory_hostnames', '{{ jer_location }},&{{ jer_hostgroup }},&{{ jer_environment }}') }}"
如果有更好的一个,我想听听。
先谢谢您
杰里米