Ansible-查找与多个变量或组成员身份匹配的主机

时间:2019-01-14 20:09:34

标签: ansible

我正在尝试创建一个可配置和设置服务器及其备用服务器的剧本。清单来自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 }}') }}"

如果有更好的一个,我想听听。

先谢谢您

杰里米

0 个答案:

没有答案