通过docker,docker主机在库存中回答

时间:2017-11-21 08:14:20

标签: docker ansible

使用Docker Hub中的this docker image,我正在尝试运行一个ansible playbook来配置运行容器的机器。

举个例子,我运行这个:

docker run --net="host" -v <path_inventory>:/inventory -v <path_playbook>:/playbook.yml williamyeh/ansible:ubuntu16.04 ansible-playbook -vvvv -i /inventory /playbook.yml

使用此选项,我可以ping localhost,并且可以访问库存和剧本。

库存配置为使用本地连接:

[executors]
127.0.0.1

[executors:vars]
ansible_connection=local
ansible_user=<my_user_in_docker_host>
ansible_become=True

执行者是从剧本中引用的。

我看到剧本正在尝试以root身份连接(默认情况下,当我连接到容器时)。运行容器时指定 -u 似乎与Ansible不相符。

  

&LT; 127.0.0.1&GT;建立用户的本地连接:root

...在成功本地连接后,出现错误,抱怨任何命令不可用。鉴于root用户或非root用户都可以执行它们,这对我来说毫无意义。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

此图像旨在作为其他图像的基础,并将ansible的优势作为一种配置图像要求的方式,而不是仅使用Dockerfile。

这在docker image的文档中有说明:

  

主要用作配置其他软件堆栈的基本映像   一些指定的Linux发行版。

将其视为基本映像,以比使用其他选项(VM,Vagrant ......)更轻松的方式执行CI任务

考虑到docker的好处是它将主机与容器隔离开来,因此您无法从容器中访问主机文件(除了您绑定的任何卷)。否则,这将是一个安全问题。 See Here

问候

答案 1 :(得分:0)

我能够使用ansible从docker容器中配置主机。但是,我没有使用docker主机网络,而是使用docker bridge网络。

当您在容器中启动ansible playbook时,localhost将成为容器本身的本地主机。这很好,因为ansible中的local_action在容器本身中运行,而在主机上运行远程操作。

这是docker run示例的修改版本:

docker run -v <path_inventory>:/inventory -v <path_playbook>:/playbook.yml williamyeh/ansible:ubuntu16.04 ansible-playbook -vvvv -i /inventory/playbook.yml

您不应将清单配置为使用localhost或本地连接,而是使用主机(计算机)并通过ssh连接。这是一个例子:

[executors]
<my_host_ip>

[executors:vars]
ansible_connection=ssh
ansible_user=<my_host_user>
ansible_become=True

假设您的docker容器在默认网桥中运行,您可以使用以下命令找到my_host_ip:

ip addr show docker0 

容器将使用ssh连接到主机上的docker接口。

一些额外的提示:

  • ssh需要在docker0接口上监听
  • iptables / nftables需要提供从ansible容器到docker0接口的ssh访问
  • Ansible默认使用密钥通过ssh连接。通过使用ansible-playbook命令的-k和/或-K参数,您可以改为提供密码。