[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ドキュメント
广告
将在 10 秒后关闭
bannerAds