循环通过Ansible playbook中的字典值

时间:2017-12-27 23:26:18

标签: dictionary ansible config var

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

1 个答案:

答案 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,或者这种方式分割是否正确。