【问题标题】:Ansible through docker, docker host in the inventoryAnsible 通过 docker,库存中的 docker host
【发布时间】:2018-07-11 05:27:22
【问题描述】:

使用来自 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 本地主机,并且可以访问库存和剧本。

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

[executors]
127.0.0.1

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

executors 组是从剧本中引用的组。

我看到 playbook 正在尝试以 root 身份连接(我在附加到容器时默认得到的内容)。在运行容器时指定 -u 似乎与 Ansible 不兼容。

为用户建立本地连接:root

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

有什么想法吗?

【问题讨论】:

    标签: docker ansible


    【解决方案1】:

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

    这在 docker 镜像的文档中有说明:

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

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

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

    问候

    【讨论】:

    • 感谢您的参考:我的用例有点不同,文档有助于澄清它。我知道 docker 容器并不意味着修改主机上的文件,但我认为使用 docker 隔离应用程序是一种很好的做法,即使它是为了配置另一台主机。就我而言,我将使用 SSH localhost,因为一个卷不足以执行 playbook 中的这些命令。这对我来说似乎是一个很好的做法/妥协。谢谢!。
    【解决方案2】:

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

    当您在容器中启动 ansible playbook 时,localhost 将是容器本身的 localhost。这很好,因为 ansible 中的 local_action(s) 在容器本身中运行,并且在主机上进行远程操作。

    这是您的 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 参数,您可以提供密码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-14
      • 1970-01-01
      • 2015-04-25
      • 2016-06-01
      • 1970-01-01
      • 2022-12-28
      • 1970-01-01
      相关资源
      最近更新 更多