Ansible docker_container etc_hosts with variable key

时间:2016-08-30 10:12:53

标签: docker ansible ansible-playbook ansible-2.x

我有一个ansible脚本,我通过它生成一个docker容器并向其添加几个主机条目,因为etc_hosts将key作为主机名和相应的IP地址。在我的情况下,我需要让主机名和IP地址由某个变量驱动,例如

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 }}"  

当我进行上述配置时,它会以

的形式输入主机文件
xx.xx.xx.xxx {{ domain_1 }}

理想情况下,主机文件应该包含针对IP的主机名,有人可以建议我如何实现这一点。提前致谢

2 个答案:

答案 0 :(得分:5)

试试这个语法:

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 }}"
    }

这将形成类似字母的字符串,ansible的临时工将评估为dict 请注意,每个项目都应引用,并且用逗号分隔对。

答案 1 :(得分:0)

我在...上取得了成功

在我的剧本(书)中:

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

(与接受的答案相比,没有“>”字符)

与剧本分开的角色是...

在任务中:

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

默认值/main.yml:

my_etc_hosts: {}

另外(上述任务不需要,但是另一个模板任务的一部分):

在带有jinja2的模板中:

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

(作为一个加号,您将看到如何处理一个IP地址的两个主机名:“ fqdn alias1”。如果您将它们拆分成两个值,它们将在/ etc / hosts中以相同IP形成两行,根据手册页是不正确的。)