在运行ansible-playbook时,当前目录下的ansible.cfg可能因权限问题而无法被读取
只要冷静地阅读输出的日志,就能够立即解决问题,但作为备忘录,我想将其记录下来。
备用知识
Ansible的配置文件会按照以下顺序进行搜索,并使用第一个找到的文件。其他文件会被忽略。
– ANSIBLE_CONFIG(如果设置了环境变量)
– ansible.cfg(在当前目录)
– ~/.ansible.cfg(在用户主目录)
– /etc/ansible/ansible.cfg
事件
当前目录存在 ansible.cfg 文件,但使用的是 /etc/ansible/ansible.cfg 文件。
因此,SSH 配置等未被加载,导致了 UNREACHABLE 错误的发生。
以下是执行日志
※由于某些原因,目录名称等已更改为适当的值。
$ ansible-playbook -i hosts/dev -vvv myansible.yml
[WARNING] Ansible is being run in a world writable directory (/home/vagrant/aaaa), ignoring it as an ansible.cfg source. For more information see https://docs.ansible.com/ansible/devel/reference_appendices/config.html#cfg-in-world-writable-dir
ansible-playbook 2.7.0rc2
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/home/vagrant/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible-playbook
python version = 2.7.5 (default, Aug 4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)]
Using /etc/ansible/ansible.cfg as config file
Parsed /home/vagrant/aaaa/hosts/dev/inventory inventory source with ini plugin
PLAYBOOK: myansible.yml ********************************************************************************************************************************************************************************************************
1 plays in myansible.yml
PLAY [hoge] *******************************************************************************************************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************
task path: /home/vagrant/aaaa/myansible.yml:5
<testtest> ESTABLISH SSH CONNECTION FOR USER: None
<testtest> SSH: EXEC ssh -C -o ControlMaster=auto -o ControlPersist=60s -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/home/vagrant/.ansible/cp/224abd3d7d testtest '/bin/sh -c '"'"'echo ~ && sleep 0'"'"''
<testtest> (255, '', 'ssh: Could not resolve hostname testtest: Name or service not known\r\n')
fatal: [testtest]: UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: ssh: Could not resolve hostname testtest: Name or service not known\r\n",
"unreachable": true
}
to retry, use: --limit @/home/vagrant/aaaa/myansible.retry
PLAY RECAP ***********************************************************************************************************************************************************************************************************************
testtest : ok=0 changed=0 unreachable=1 failed=0
正如我在开头写的那样,日志中有原因。(这是一个友好的设计,甚至给出了文档的URL)
[WARNING] Ansible is being run in a world writable directory (/home/vagrant/aaaa),
ignoring it as an ansible.cfg source.
For more information see https://docs.ansible.com/ansible/devel/reference_appendices/config.html#cfg-in-world-writable-dir
由于以 world writable directory 运行,似乎被忽略了。
文档中还提到了可能产生严重的安全风险。
似乎是使用了在Vagrant中创建的VirtualBox上的Linux作为工作场所,并通过与Windows共享文件夹来执行的,才发生了这样的情况。
经过实际确认,我发现共享文件夹的权限设置为777。
※ 可全球写入的目录:指的是任何人都可以进行写入操作(猜测)。
化解问题
通过在Vagrantfile的共享文件夹设置中使用mount_options来添加权限设置,现在可以执行了。
config.vm.synced_folder "windir", "vmdir" , mount_options: ["dmode=775,fmode=664"]
警告我们必须要好好阅读。虽然内容较浅,但就是这样。
请参阅
Ansible 配置设置 – 使用当前目录中的 ansible.cfg 避免安全风险
Vagrant 同步文件夹权限
基本使用方法 – 同步文件夹 – HashiCorp 的 Vagrant