繁体   English   中英

在Ansible剧本中循环浏览字典值

[英]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_itemswith_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM