问题描述
想要使用Ansible连接到一台Windows机器并运行win_ping
模块。他在网上查找了一些教程,列出了一些关键步骤:
- 创建目录
./windows
- 在
./windows
中创建文件hosts
- 创建目录
./windows/group_vars
- 在
./windows/group_vars
中创建文件windows.yml
- 在
windows.yml
中插入Windows凭据的若干变量
但是这些教程并没有明确指定这些文件应该放在哪里,相对于.
来说。用户尝试将这个目录结构放在/etc/ansible/
,但不幸的是,Ansible似乎没有识别到这些文件。用户还尝试了不同的文件位置,但都没有成功。
用户想知道如何让Ansible引用他创建的目录。他认为ansible.cfg
可能会有解决方法,但他只知道如何将其指向默认的清单文件。有趣的是,即使在基本清单文件中添加了一个名为“windows”的组,并在该组中调用Ansible,它仍然显示找不到主机。用户还取消了ansible.cfg
中的清单位置的注释,指向/etc/ansible/hosts
,但当调用ansible windows -m ping
(或win_ping
)时,仍然显示找不到主机。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1:将group_vars放在playbook目录下
在大多数典型情况下,您可以将group_vars
与playbook.yml
放在一起。根据您发布的示例,使用第二种方法,要引用这些文件,您需要在命令中添加-i
选项:
ansible windows -m ping -i ./windows
方案2:理解Ansible文件结构最佳实践
可以参考一些GitHub仓库,如enginyoyen/ansible-best-practices,它不仅在您的情况下有所帮助,还有助于理解完整的Ansible项目中的playbook/inventory/role/task等差异。
一些要点如下:
- 您的变量应该放在
/group_vars/
中,例如,/group_vars/windows.yml
将自动被分配给您指定给windows组的主机。 - 您还可以包含文件,如
/host_vars/win_host_1.yml
,这些文件只会被特定的主机读取。 - 在您的清单文件中定义了
/group_vars/
中的组(请注意是复数),比如:
[windows]
win_host1.example.com
win_host2.example.com - 清单文件的命名通常是
/production.yml
和/staging.yml
,以确保代码在不同状态的环境中部署到(理想情况下)相同的环境中。
另外,角色是由执行某项任务所需的任务组成的文件,比如/roles/install_nginx.yml
。Playbooks的命名通常是/playbooks/win_hosts.yml
,它的作用只是将清单文件中的组与您希望这些组中的主机运行的角色匹配。
方案3:手动管理容器启动顺序
如果需要更加精细的控制,您可以编写脚本或使用工具来手动控制容器的启动顺序。以下是一个简单的bash脚本示例,可以在容器A启动后启动容器B:
#!/bin/bash
# 启动容器A
docker run -d --name container_a your_image_a
# 等待容器A完全启动
while ! docker exec container_a echo "Container A is ready"; do
sleep 1
done
# 启动容器B
docker run -d --name container_b your_image_b
在上面的示例中,我们首先使用docker run
命令启动容器A,并将其命名为container_a
。然后,使用一个循环来等待容器A完全启动(这里是通过在容器内运行echo
命令来测试)。一旦容器A准备就绪,我们再使用docker run
命令启动容器B,并将其命名为container_b
。
请注意,这种方法需要一些手动管理和监控容器的状态,以确保启动顺序的正确性。