Ansible通过docker,库存中的docker主机

Ansible通过docker,库存中的docker主机,docker,ansible,Docker,Ansible,使用from Docker Hub,我正在尝试运行ansible playbook,该playbook将配置运行容器的机器 例如,我运行以下命令: docker run --net="host" -v <path_inventory>:/inventory -v <path_playbook>:/playbook.yml williamyeh/ansible:ubuntu16.04 ansible-playbook -vvvv -i /inventory /playboo

使用from Docker Hub,我正在尝试运行ansible playbook,该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
docker run--net=“host”-v:/inventory-v:/playbook.yml williamyeh/ansible:ubuntu16.04 ansible playbook-vvv-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
[执行人]
127.0.0.1
[遗嘱执行人:VAR]
ansible_连接=本地
ansible_用户=
ansible_变为True
组执行者是从剧本中引用的执行者

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

为用户建立本地连接:root

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


有什么想法吗?

此映像旨在作为其他映像的基础,并利用ansible作为提供映像需求的一种方式,而不是仅使用Dockerfile

docker图像的文档中说明了这一点:

主要用作配置上其他软件堆栈的基础映像 某些指定的Linux发行版

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

考虑到docker的优点是它将主机与容器隔离,因此您无法从容器访问主机文件(绑定的任何卷除外)。否则,这将是一个安全问题


关于

我能够使用ansible在docker容器中配置主机。然而,我没有使用docker主机网络,而是使用docker网桥网络

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

这是docker运行示例的修改版本:

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

[executors:vars]
ansible_connection=ssh
ansible_user=<my_host_user>
ansible_become=True
容器将使用ssh连接到主机上的docker接口

其他一些提示:

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

感谢您的参考:我的用例有点不同,文档有助于澄清它。我知道,一个DoCKER容器并不意味着修改主机上的文件,但我认为一个好的做法是使用DOCKER隔离一个应用程序,即使它意味着配置另一个主机。在我的例子中,我将SSH localhost,因为一个卷不足以执行playbook中的这些命令。对我来说,这似乎是一个很好的做法/妥协。非常感谢。
ip addr show docker0