Ansible docker\u容器等具有可变密钥的主机

Ansible docker\u容器等具有可变密钥的主机,docker,ansible,ansible-playbook,ansible-2.x,Docker,Ansible,Ansible Playbook,Ansible 2.x,我有一个ansible脚本,通过它我生成了一个docker容器,并向其中添加了几个hosts条目,因为etc\u hosts将key作为主机名和相应的IP地址。在我的例子中,我需要主机名和IP地址都由某个变量驱动,例如 docker_container: name: image-name image: image-to-be-pulled state: started restart_policy: always etc_hosts: "{{ domain_1 }}": "{{ domain

我有一个ansible脚本,通过它我生成了一个docker容器,并向其中添加了几个hosts条目,因为etc\u 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的主机名,有人可以建议如何实现这一点。提前感谢

尝试以下语法:

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 }}"
    }
这将形成类似dict的字符串,ansible的模板将计算为dict。
请注意,每一项都应该被引用,每一对都用逗号分隔。

我成功地使用了

在我的剧本(书)中:

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

从剧本中分离出来的角色

在任务中:

- name: have the container created
  docker_container:
    etc_hosts: "{{ my_etc_hosts | default({}) }}"
在defaults/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,根据手册页,这是不正确的。)

您可能想看看:正如上面共享链接中所解释的,我可以使用set_facts来定义域和ip组合,但该条目将出现在我的主机文件中?以这种方式填充dict,比如,
my_etc_hosts
并设置
etc_hosts:'{my_etc_hosts}}“
调用
docker\u container
时。在我的例子中,hosts文件中有多个条目,如果有多个条目,则需要键值对。请使用以下信息更新您的问题:在调用
docker\u container
之前,您将对存储在何处。如果我们没有定义变量,我可以知道如何处理此问题吗。简而言之,在未定义变量的情况下传递默认值。
{% for host in my_etc_hosts | default([]) %}
    --add-host "{{ host }}":{{ my_etc_hosts[host] }} \
{% endfor %}