使用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用户都可以执行它们,这对我来说毫无意义。
有什么想法吗?
答案 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接口。
一些额外的提示: