在运行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

广告
将在 10 秒后关闭
bannerAds