[英]Looping through dictionary values inside Ansible playbook
我有一本Ansible剧本,用于设置Splunk集群,其中一个命令添加了集群成员的服务器列表,
- name: search head init & set CAPTAIN
block:
- command: splunk init shcluster-config -auth admin:changeme \
-mgmt_uri "https://{{ ansible_default_ipv4.address }}:8089" \
-replication_port 8090 -conf_deploy_fetch_url https://{{ deployer_ip }}:8089 -secret {{ cluster['secret'] }}
# set captain
- debug: msg='setting captain'
- command: splunk bootstrap shcluster-captain \
-servers_list "10.185.20.156:8089, 10.185.20.160:8089, 10.185.20.161:8089" -auth admin:changeme
我将所有的配置变量设置在一个文件中,这就是我从中获取它们的位置(例如, cluster['secret']
), config.yaml
varfile看起来像这样,
# Cluster Config
cluster:
secret: abracadabra # secret key
app_name: cluster # adds a custom Splunk App for Cluster config
members:
mrxsplunksh01: 10.185.20.156
mrxsplunksh02: 10.185.20.160
mrxsplunksh03: 10.185.20.161
我无法弄清楚如何解析/循环cluster ['members']字典来获取每个集群成员的IP,所以我不必手动完成这一部分,
- command: splunk bootstrap shcluster-captain \
-servers_list "10.185.20.156:8089, 10.185.20.160:8089, 10.185.20.161:8089" -auth admin:changeme
我尝试了with_items
和with_dict
,但我无法正确解析每个元素。
您不需要任何循环即可实现此目的。
首先,您可以使用Python values()
方法获取字典值列表:
cluster.members.values()
然后,您需要像下面的答案一样修改列表的各个元素:
map('regex_replace', '(.*)', '\\\\1:8089')
最后,您需要将列表转换为字符串,与分裂的元素,
:
join(', ')
合并:
- servers_list "{{ cluster.members.values() | map('regex_replace', '(.*)', '\\1:8089') | join(', ') }}" -auth admin:changeme
我现在正在通过电话回答,所以我还没有验证确切的结果或错别字。
如果command
是用一行编写的,则应将整个参数引号括起来。 我不确定YAML是否需要使用\\
,或者这种方式拆分是否正确。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.