結論
- Ansibleは暗黙的に
localhost
のインベントリ情報が作成されている -
localhost
をインベントリで定義した場合、暗黙的に宣言されている変数も追加しておく必要がある - トラブル回避のために、プロジェクト開始当初から明示的にlocalhostを定義するのがおすすめ
事象
AnsibleでvCenterのようなAPIを使った操作をする際、vCenterログイン情報はグループvcenter
に記載して実際の作業はlocalhost
というパターンがよくあります。
タスクごとにdelegate_to: localhost
を書くことでも対応はできるのですが全タスクに書くのがとても面倒です。
そういったとき、グループvcenter
にホストlocalhost
を含めることでPlaybook側は、hosts: vcenter
のみ記載するだけでよく、delegate_to: localhost
もなくPlaybookがスッキリします。
具体的には以下のような記載
---
- hosts: vcenter
gather_facts: false
tasks:
- name: vcenter VM作成
community.vmware.vmware_guest:
~~
---
all:
children:
vcenter:
hosts:
localhost:
しかし、このまま動かすとSSHでアクセスしようとして以下のようなエラーが出てしまいます。
PLAY [vcenter] ******************************************************************************************************************************************************************************************************************************
TASK [vCenter VM作成] ***********************************************************************************************************************************************************************************************************************
fatal: [localhost]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: root@localhost: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", "unreachable": true}
PLAY RECAP **********************************************************************************************************************************************************************************************************************************
localhost : ok=0 changed=0 unreachable=1 failed=0 skipped=0 rescued=0 ignored=0
解決方法
Ansibleはlocalhostが定義されていないときに、わざわざlocalで接続しに行くlocalhostを作成しています。
明示的にlocalhostが定義された場合、上記の設定がなくなりAnsibleのデフォルト接続方法であるSSHで接続しに行ってエラーが起きています。
そのため、暗黙的なlocalhostで定義されていた情報を明示的に書いてあげることで解決ができます。
記載場所は色々ありますが、今回は手っ取り早くhost_vars/localhost.yml
を作成してそこに以下の変数を定義します。
暗黙的に宣言されている変数
---
ansible_connection: local
ansible_python_interpreter: "{{ ansible_playbook_python }}"
余談
初歩的な内容ではありますが、localhostへのアクセスはよく使われるポイントであり、初心者が詰まりやすいポイントです。
また、環境差異が起きやすいポイントでもあります。
例えば、Ansible実行サーバが自身のSSH公開鍵を~/.ssh/authorized_keys
に登録しているなどしているとエラーなく通ってしまいます。
テスト環境では、うまく行ったのに本番環境ではうまくいかなかった。などが起こってしまうので、最初から明示的にlocalhostを定義しておいた方がトラブルなくなるのではないかと筆者は考えます。