我有一个设置Splunk群集的Ansible手册,其中一个命令添加了一个群集成员的服务器列表,
- 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
我无法弄清楚如何解析/循环集群['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
,我无法正确解析每个元素。
答案 0 :(得分:2)
你不需要任何循环来实现这一目标。
首先,您可以使用Python values()
method获取字典值列表:
cluster.members.values()
然后您需要修改列表中的各个元素,例如this answer:
map('regex_replace', '(.*)', '\\1:8089')
最后,您需要将列表转换为字符串,将元素与,
分开:
join(', ')
组合:
- servers_list "{{ cluster.members.values() | map('regex_replace', '(.*)', '\\1:8089') | join(', ') }}" -auth admin:changeme
我现在正在接听电话,所以我还没有确认确切的结果或错字。
如果将command
写成一行,你应该将整个论点引用到\
。我不确定YAML是否需要data.frame
,或者这种方式分割是否正确。