[Ansible]要小心隐式的localhost
结论
-
- Ansibleは暗黙的にlocalhostのインベントリ情報が作成されている
localhostをインベントリで定義した場合、暗黙的に宣言されている変数も追加しておく必要がある
トラブル回避のために、プロジェクト開始当初から明示的にlocalhostを定義するのがおすすめ
事件
在使用Ansible执行像vCenter这样的API操作时,通常会将vCenter登录信息保存在名为vcenter的组中,并将实际操作设为localhost。
虽然可以通过在每个任务中写入delegate_to: localhost来解决这个问题,但是每个任务都这样写很麻烦。
在这种情况下,通过将本地主机包含在vcenter主机组中,在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
解决方案 (jiě jué àn)
当Ansible在未定义localhost时,它会创建一个extra的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,以避免不必要的麻烦。
请提供相关链接。
- 暗黙的なlocalhostドキュメント