循环通过Ansible playbook中的字典值

问题描述 投票:0回答:1

我有一个设置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_itemswith_dict,我无法让它正确地解析每个元素。

dictionary ansible config var
1个回答
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是否需要使用\,或者如果这种方式分割是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.