落ち着いて出力されたログを読めば即解決する内容ですが、備忘録としてメモしたいと思います。
##予備知識
Ansibleのコンフィグファイルは以下の順で検索し、見つかった最初のファイルを使用する。それ以外は無視される。
・ANSIBLE_CONFIG (environment variable if set)
・ansible.cfg (in the current directory)
・~/.ansible.cfg (in the home directory)
・/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になっていました。
※world writable directory:世界書き込み可能ディレクトリ?、誰でも書き込みできるということだと思われる(予想)。
##解決
Vagrantfileの共有フォルダ設定に、
mount_optionsでパーミッション設定を追加することで実行できるようになりました。
config.vm.synced_folder "windir", "vmdir" , mount_options: ["dmode=775,fmode=664"]
WARNINGもちゃんと読まなきゃですね。
薄い内容ですが、以上です。
##参考
Ansible Configuration Settings - Avoiding security risks with ansible.cfg in the current directory
Vagrant Synced Folders Permissions
Basic Usage - Synced Folders - Vagrant by HashiCorp