Ansible-从dict条目和concat读取子键到字符串

Ansible-从dict条目和concat读取子键到字符串,ansible,ansible-template,Ansible,Ansible Template,我对Ansible很陌生,来自Puppet,我真的很喜欢它。 我正在尝试从服务器管理端口编译一个字符串 Vars文件: webservers: ws1: listen_address: "webserver1.mydomain" admin_port: "7779" http_port: "7777" ssl_port: "4443" ws2: listen_addre

我对Ansible很陌生,来自Puppet,我真的很喜欢它。 我正在尝试从服务器管理端口编译一个字符串

Vars文件:

webservers:
  ws1:
    listen_address: "webserver1.mydomain"
    admin_port: "7779"
    http_port: "7777"
    ssl_port: "4443"
  ws2:
    listen_address: "webserver2.mydomain"
    admin_port: "7779"
    http_port: "7777"
    ssl_port: "4443"
我正在模板化一组定制的配置文件,因此我尝试将两个侦听端口转换为以下格式:

ports=7779,7779
我试过:

vars:    
  webserver_admin_ports: "{{lookup('subelements', webservers, 'admin_port', {'skip_missing': True})}}"
但我遇到了这个问题:

Error was a <class 'ansible.errors.AnsibleError'>, original message: the key admin_port should point to a list, got '7779'"}
错误是一条原始消息:密钥管理端口应指向列表,获得“7779”}
我相信这不会太棘手,而且数据结构足够简单,可能有1到10台服务器

在Puppet中,我会在模板中这样做,但在ansible中,传递var似乎更好


谢谢,

对于有类似问题的人,这是我的解决方案。 在模板中,执行查找,可以使代码更干净:

{%- set serverNames = [] -%}
{%- set adminPorts = [] -%}
{%- set listenAddresses = [] -%}
{%- set httpPorts = [] -%}
{%- for server in webserver_meta -%}
  {{- serverNames.append(server) -}}
  {{- adminPorts.append(webserver_meta[server].admin_port) -}}
  {{- listenAddresses.append(webserver_meta[server].listen_address) -}}
  {{- httpPorts.append(webserver_meta[server].http_port) -}}
{%- endfor %}
serverNames={{ serverNames|join(',') }}
serverAdminPorts={{ adminPorts|join(',') }}
serverListenAddress={{ listenAddresses|join(',') }}
serverHttpPorts={{ httpPorts|join(',') }}