Ansible concat vars в строку

Я провел большую часть дня, пытаясь решить эту проблему, и до сих пор потерпел неудачу. Я создаю несколько сборников игр для автоматизации функций в Splunk и пытаюсь преобразовать список хостов из группы инвентаризации EG.

[search_head]
1.2.3.4
5.6.7.8

Мой ожидаемый (желаемый) результат отладочного вывода игры должен быть: https://1.2.3.4:8089, https://5.6.7.8:8089

Я пытаюсь выполнить это, запустив следующую пьесу на работающем хосте:

---
  - 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 }} не разрешается.


person AlmostGosu    schedule 30.06.2017    source источник


Ответы (2)


После того, как вы откроете выражение или оператор Jinja2, вы должны использовать синтаксис Jinja2. Вы не можете вкладывать их друг в друга (т. е. вы не можете использовать {{ }} внутри {% %}).

{%- if search_head_uri.append("https://" + host + ":8089") %}
person techraf    schedule 30.06.2017
comment
Круто, ошибка перестала вылетать. Теперь я пытаюсь получить ansible_nodename с каждого хоста в файле inventory. {%- set search_head_uri = [true] %} {% for host in groups['search_head'] %} {%- if search_head_uri.append("https://" + [host][ansible_nodename] + ":8089") %} {% endif -%} {%- if not loop.last %}, {% endif -%} {%- endfor %} - person AlmostGosu; 30.06.2017
comment
Ошибки с: fatal: [1.2.3.4]: FAILED! => { "failed": true, "msg": "the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: {{ lookup('template', './bootstrap-sh-deployer.j2') }}: 'list object' has no attribute u'ip-1-2-3-4'\n\nThe error appears to have been in '/Users/christophergarrett/dev/splunk-ansible/deploy_ec2_testing.yml': line 16, column 9, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n tasks:\n - name: dump array\n ^ here\n" } - person AlmostGosu; 30.06.2017
comment
Если у вас другая проблема, задайте другой вопрос. Прежде подумайте, почему вы заключили host в квадратные скобки. - person techraf; 30.06.2017

Это сработало - комбинация ответа выше для исправления форматирования 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 %}
person AlmostGosu    schedule 30.06.2017