我想向文件中添加一些行(它们是/etc/ntp.conf中的ntp服务器)。不幸的是,由于各种原因,我不能使用模板。所以我有一个这样的变量:
vars:
- dns:
- "{ 'region': 'syd', 'dns_servers': ['1.2.3.4', '2.3.4.5', '3.4.5.6' ] }"
- "{ 'region': 'lon', 'dns_servers': ['2.2.2.2', '3.3.3.3', '4.4.4.4' ] }"
- "{ 'region': 'ny', 'dns_servers': ['5.5.5.5', '6.6.6.6', '7.7.7.7' ] }"
- ntp:
- { 'region': 'syd', 'ntp_servers': ['syd1.pool.ntp.org','syd2.pool.ntp.org','syd2.pool.ntp.org'] }
- { 'region': 'lon', 'ntp_servers': ['lon1.pool.ntp.org','lon2.pool.ntp.org','lon2.pool.ntp.org'] }
- { 'region': 'ny', 'ntp_servers': ['ntp1.pool.ntp.org','ntp2.pool.ntp.org','ntp2.pool.ntp.org'] }所以这里有两个列表: dns和ntp。每个列表都包含一个区域->服务器映射字典。
我想遍历列表(在本例中是ntp列表),依次为每个ntp服务器添加一行。我发现了一个循环结构的loop_control参数,它允许我在ntp_servers列表中设置一个偏移量。
下面是我循环遍历字典中列表元素的一次尝试:
- name: Replace ntp servers in /etc/ntp.conf
debug:
msg: "{{ item[loop_count] }}"
loop: "{{ ntp['region']['ntp_servers'] }}"
loop_control:
index_var: loop_count
when: item.region == region(顺便说一句,您对使用'i‘作为循环计数器变量有何感想?)
我知道使用模板会容易得多,并且lineinfile是一种反模式,但我受到我控制范围之外的问题的约束。
我遇到的问题是,我想循环遍历ntp_servers数组的项,但我的循环遍历了ntp字典。我尝试了各种组合,但怀疑我使用了错误的数据结构--有人能给我一些建议吗?
谢谢
发布于 2018-05-14 19:46:05
我看到了vars结构的一个问题。您应该从ntp和dns变量声明中删除连字符:
vars: ntp:.....dns:.....
此外,dns列表元素中的双引号使元素被认为是字符串,ntp看起来没问题。
要在列表中获得ntp变量的所有9个ntp服务器,以便可以在循环中进行处理,您可以使用表达式(可以随意删除sum(start=[])和最终的list转换,然后将它们添加回来,以了解我使用它们的原因):
"{{ ntp | map(attribute='ntp_servers') | list | sum(start=[]) | list }}"
示例攻略:
- hosts: localhost
gather_facts: false
vars:
ntp:
- { 'region': 'syd', 'ntp_servers': ['syd1.pool.ntp.org','syd2.pool.ntp.org','syd2.pool.ntp.org'] }
- { 'region': 'lon', 'ntp_servers': ['lon1.pool.ntp.org','lon2.pool.ntp.org','lon2.pool.ntp.org'] }
- { 'region': 'ny', 'ntp_servers': ['ntp1.pool.ntp.org','ntp2.pool.ntp.org','ntp2.pool.ntp.org'] }
tasks:
- name: print
debug:
msg: "{{ item }}"
with_items:
- "{{ ntp | map(attribute='ntp_servers') | list | sum(start=[]) | list }}"输出:
TASK [print] ********************************************************************************************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "syd1.pool.ntp.org"
}
ok: [localhost] => (item=None) => {
"msg": "syd2.pool.ntp.org"
}
ok: [localhost] => (item=None) => {
"msg": "syd2.pool.ntp.org"
}
ok: [localhost] => (item=None) => {
"msg": "lon1.pool.ntp.org"
}
ok: [localhost] => (item=None) => {
"msg": "lon2.pool.ntp.org"
}
ok: [localhost] => (item=None) => {
"msg": "lon2.pool.ntp.org"
}
ok: [localhost] => (item=None) => {
"msg": "ntp1.pool.ntp.org"
}
ok: [localhost] => (item=None) => {
"msg": "ntp2.pool.ntp.org"
}
ok: [localhost] => (item=None) => {
"msg": "ntp2.pool.ntp.org"
}
PLAY RECAPhttps://stackoverflow.com/questions/50324075
复制相似问题