我有一个我在Docker容器中部署的Rails应用程序。我想从Docker容器进行开发,因此它将在环境之间保持一致。
我有一个Ansible playbook,可以启动远程服务器上的Docker容器,并且工作正常。我以为我会使用相同的Ansible任务启动容器并在Mac上将它们链接在一起。
然而,当我对我的本地实例运行playbook时,我得到的错误如下:
fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "msg": "`docker-py` doesn't seem to be installed, but is required for the Ansible Docker module."}
似乎问题是Ansible正在为Mac做本地ssh,但我需要它连接到docker-machine。
如何使用Ansible在我的Mac上运行的Docker容器上运行任务?
答案 0 :(得分:1)
问题确实是Ansible正在尝试ssh到我的本地机器。当您在Mac上运行Docker时,它会创建一个虚拟机,当您在终端中运行docker ps
之类的命令时,它将针对在该虚拟机上运行的Docker Engine运行。
我最终遵循了本文中的建议:Using Vagrant and Docker Machine Together.我基于ubuntu / trusty64图像创建了一个带有vagrant的新VM,然后我使用docker create
启用它以与Docker一起使用。然后我将此VM的IP添加到我的Ansible清单文件中,如下所示:
192.168.99.101 ansible_user=vagrant ansible_ssh_private_key_file=/path/to/virtualbox/private_key
这有点尴尬,因为没有办法让这个新VM成为Docker Toolbox使用的默认VM,但是否则它是控制虚拟机主机操作系统的好方法。
我正在尝试再次使用docker-compose,因为我认为它可能对本地开发更好,但是能够运行相同的playbook来部署到任何环境都很好。
答案 1 :(得分:0)
当您编写ansible时,您需要确定它在何处运行
- hosts: HOSTS_TO_RUN_FOLLOWING_TASKS
tasks:
- name: NAME_OF_TASK
shell: SHELL_CMD
当你想在同一个ansible中的不同主机上运行时,你只需要再次写这个:
- hosts: NEW_HOST_TO_RUN_TASKS
tasks:
- name: NAME_OF_TASK
shell: SHELL_CMD
如果你把" localhost"在"主持人中:"然后它将在本地主机上运行。
如果要在特定主机上运行,请运行命令/etc/ansible/hosts --refresh-cache
并使用结果中的标记。
例如,如果结果是
"tag_Name_Production":
[
"124.125.125.121",
"124.125.125.122",
"124.125.125.123"
]
并且你想在所有这些上运行命令只需使用:
- hosts: tag_Name_Production
tasks:
- name: NAME_OF_TASK
shell: SHELL_CMD