Akhil
Akhil

Reputation: 1254

Ansible docker_container etc_hosts with variable key

I've an ansible script through which I spawn a docker container and add few hosts entries to it, since etc_hosts takes key as host name and corresponding IP address. In my case I need to have both host name and IP address to be driven by some variable, for instance

docker_container:
name: image-name
image: image-to-be-pulled
state: started
restart_policy: always
etc_hosts:
  "{{ domain_1 }}": "{{ domain_1_ip }}"
  domain_2 : "{{ domain_2_ip }}"
  domain_3 : "{{ domain_3_ip }}"  

When I make above configuration then it makes an entry to host file as

xx.xx.xx.xxx {{ domain_1 }}

Ideally the the host file should contain host name against the IP, can someone suggest how can i achieve this. Thanks in advance

Upvotes: 5

Views: 8955

Answers (2)

klaus thorn
klaus thorn

Reputation: 230

I had success with...

in my play(book):

- vars:
    my_etc_hosts: 
      {
        "host1.example.com host1": 10.3.1.5,
        "host2.example.com host2": 10.3.1.3
      }

(no ">" character, compared to the accepted answer)

Separated from the playbook, the role with...

in the task:

- name: have the container created
  docker_container:
    etc_hosts: "{{ my_etc_hosts | default({}) }}"

in defaults/main.yml:

my_etc_hosts: {}

Additionally (not needed by the task above, but part of another template task):

in a template, with jinja2:

{% for host in my_etc_hosts | default([]) %}
    --add-host "{{ host }}":{{ my_etc_hosts[host] }} \
{% endfor %}

(As a plus, you see how two hostnames for one IP address can be handled: "fqdn alias1". If you instead split them into two values, they will form two lines in /etc/hosts with the same IP, which is not correct according to the man page.)

Upvotes: 1

Konstantin Suvorov
Konstantin Suvorov

Reputation: 68239

Try this syntax:

docker_container:
  name: image-name
  image: image-to-be-pulled
  state: started
  restart_policy: always
  etc_hosts: >
    {
      "{{ domain_1 }}": "{{ domain_1_ip }}",
      "domain_2" : "{{ domain_2_ip }}",
      "domain_3" : "{{ domain_3_ip }}"
    }

This will form dict-like string that ansible's templator will evaluate into dict.
Pay attention, that every item should be quoted and pairs are separated by commas.

Upvotes: 7

Related Questions