Ansible concat vars to string

时间:2017-06-30 03:31:41

标签: ansible jinja2 ansible-facts ansible-template

我大部分时间都在努力解决这个问题,但迄今为止都失败了。我正在构建一些手册以自动化Splunk中的功能,并且我正在尝试从库存组E.G.转换主机列表。

[search_head]
1.2.3.4
5.6.7.8

我对游戏调试输出的期望(期望)结果应该是: https://1.2.3.4:8089, https://5.6.7.8:8089

我试图通过针对正在运行的主机运行以下playbook来完成此操作:

---
  - name: Build search head list to initialize the captain
    hosts: search_head
    remote_user: ansible
    vars:
      inventory_file: ./inventory-ec2-single-site
      search_head_uri: "{{ lookup('template', './bootstrap-sh-deployer.j2') }}"
pre_tasks:
  - include_vars: 
      dir: 'group_vars'
      extensions:
        - yml
        - yaml
tasks:
  - name: dump array
    debug:
        msg: "{{ search_head_uri }}"`

使用模板bootstrap-sh-deployer.j2

{%- set search_head_uri = [] %}
{% for host in groups['search_head'] %}
    {%- if search_head_uri.append("https://{{ host }}:8089") %} 
{%- endif %}
{%- if not loop.last %}, {% endif -%}
{%- endfor %}

但是,当前播放返回search_head_uri: ", ",告诉我循环正在运行,但{{ host }}未解析。

2 个答案:

答案 0 :(得分:1)

打开Jinja2表达式或语句后,您应该使用Jinja2语法。您无法嵌套它们(即您无法在{{ }}内使用{% %}。)

{%- if search_head_uri.append("https://" + host + ":8089") %}

答案 1 :(得分:0)

这很有效 - 结合上面的答案来修复jinja格式并使用hostvars来到ansible_nodename

{%- set search_head_uri = [] %}
{% for host in groups['search_head'] %}
    {{ "https://" + hostvars[host]['ansible_nodename'] + ":8089" }}
    {%- if not loop.last %}, {% endif -%}
{%- endfor %}