ansible template add value to list -

13,633

Solution 1

It seems you've made this substantially more complicated than necessary. Why not something like this?

$ ansible-playbook -i hosts play.yml

PLAY [localhost] **************************************************************

TASK: [template src='servername.j2' dest=tmp/servername-{{item.target}}] ******
changed: [localhost] => (item={'target': 'actual.domain.com', 'aliases': ['alias1.domain.com', 'alias2.domain.com']})

PLAY RECAP ********************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0

Contents of files

$ tail -n 1000 `find ./ -type f`

==> .//hosts <==
[localhost]
localhost ansible_connection=local


==> .//play.yml <==
- hosts: localhost
  gather_facts: false
  vars:
    servers:
      - target: "actual.domain.com"
        aliases:
          - "alias1.domain.com"
          - "alias2.domain.com"
  tasks:
    - template: src='servername.j2' dest=tmp/servername-{{item.target}}
      with_items: servers


==> .//servername.j2 <==
server_name {{ item.target }} {{ item.aliases|join(" ") }}


==> .//tmp/servername-actual.domain.com <==
server_name actual.domain.com alias1.domain.com alias2.domain.com

Solution 2

Why not simply concatenate target and aliases and then run join(' ') on the result?

{% set servername = [ item.target ] %}
{% set aliases = item.aliases if item.aliases is defined else [] %}
{% set ignored = servername.extend(aliases) %}
servername: {{ servername | join(' ') }}
Share:
13,633
Admin
Author by

Admin

Updated on June 21, 2022

Comments

  • Admin
    Admin almost 2 years

    based on the following ansible playbook values ..

    target:  "actual.domain.com"
    aliases:
      - "alias1.domain.com"
      - "alias2.domain.com"
    

    I am trying to setup an ansible template to produce the nginx server_name which in this case should be:

    server_name: "actual.domain.com alias1.domain.com alias2.domain.com"
    

    so , I tried the following jinja2 script ...

    {% if item.aliases is defined %}
        {% set servername = [ item.target ] %}
        {% for alias in item.aliases.iteritems() %}
           {% if alias|length > 0 %}
               {% servername|join(' '), alias %}  # <= line 30
           {% endif %}
        {% endfor %}
        server_name {{ servername }};
     {% else %}
         server_name {{ item.target }};
     {% endif %}
      ....
    

    but it's failing , line number: 30, error: Encountered unknown tag 'servername'

    where could I be wrong ?

    thanks for help and HNY !

  • Admin
    Admin over 9 years
    thanks ... even if Dan's answer is the one I implemented ... your answer give me some hints on jinja2 scripting...
  • Admin
    Admin over 9 years
    thanks ! I'm not yet very fluent with it .. but it's true that it can be made simpler ... got it !
  • tedder42
    tedder42 over 9 years
    note the implicit answer is in here- pulling server_name out, since it's constant text, not a variable containing a dict.
  • Craig Ringer
    Craig Ringer over 8 years
    set ignored = . Ugh. The {% do %} block would make that less ugly, but Ansible doesn't seem to enable it.