具有动态变量的Ansible循环任务

时间:2019-04-04 14:24:56

标签: loops variables ansible ansible-2.x

我想使用Ansible动态设置主机上的DNS主地址。 下方的主机组应可扩展为X主机,并且仍应继续使用此“ dns入口循环”(请参见下方的列表)。

我的Ansible库存中有以下服务器:

[yst-ad-server]
server1
server2
server3

我要为此服务器设置DNS条目,如下所示:

Server:     Primary DNS:
server1 --> server3
server2 --> server1
server3 --> server2

没有循环,我的任务正在工作,看起来像这样:

- name: Select all AD Servers (but the first in group) and set their DNS server to the first server in group (usually the master)
  win_dns_client:
    adapter_names: '*'
    ipv4_addresses: "{{ hostvars[groups[environment_name + '-ad-server'][-1]].ansible_host }}"
  when: inventory_hostname == groups[environment_name + '-ad-server'][0]

(Environment_Name是我在运行剧本时设置的变量。在这种情况下,我将使用“ -e environemnt_name = yst”来与上述广告资源组匹配。)
这部分获取server3的IP(组中的最后一个,因此我使用-1),并将其设置在组中的第一个主机(0)上,即当前主机的主机名匹配时为server1。

经过一些研究和测试,我现在处于这一点:

- name: name
  win_dns_client:
    adapter_names: '*'
    ipv4_addresses: "{{ hostvars[groups[environment_name + '-ad-server'][item]].ansible_host }}"
  when: inventory_hostname == groups[environment_name + '-ad-server'][item + 1]
  loop: "{{ range(-1, 3)|list }}"

不幸的是,这不起作用。 我得到的错误是:

The conditional check 'inventory_hostname == groups[environment_name + '-ad-server'][item + 1]' failed. The error was: error while evaluating conditional (inventory_hostname == groups[environment_name + '-ad-server'][item + 1]): list object has no element

1 个答案:

答案 0 :(得分:1)

您的范围有太多积极因素:索引3不存在

由于您要支持X台服务器,而不是固定硬编码值,因此请根据组中存在的服务器数量动态创建范围

`range(-1,groups [environment_name +'-ad-server'] | length -1)|列表