我有一个设置Splunk集群的Ansible playbook,其中一个命令添加了一个集群成员的服务器列表,
- 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
,我无法让它正确地解析每个元素。
您不需要任何循环来实现此目的。
values()
method获取字典值列表:
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是否需要使用\
,或者如果这种方式分割是正确的。