具有动态变量的 Ansible 循环任务
Ansible loop task with dynamic variable
我想使用 Ansible 在主机上动态设置 DNS 主地址。
下面的主机组应该可以使用 X 主机进行扩展,并且应该继续使用 "dns entry loop"(请参阅下面的列表)。
我的 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
您的范围中正元素过多:索引 3 不存在
由于您希望支持 X 数量的服务器,而不是固定硬编码值,因此可以为您的组中存在的服务器数量动态创建范围
range( -1, groups[environment_name + '-ad-server'] | length -1 ) | list
我想使用 Ansible 在主机上动态设置 DNS 主地址。 下面的主机组应该可以使用 X 主机进行扩展,并且应该继续使用 "dns entry loop"(请参阅下面的列表)。
我的 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
您的范围中正元素过多:索引 3 不存在
由于您希望支持 X 数量的服务器,而不是固定硬编码值,因此可以为您的组中存在的服务器数量动态创建范围
range( -1, groups[environment_name + '-ad-server'] | length -1 ) | list