在剧本中更改主机组时 Ansible 不会重新加载 group_vars

Ansible does not reload group_vars when changing host group in a playbook

我已经在 ansible 存储库中填写了一个问题,但我想确认这确实是一个错误,我没有做错任何事情。 https://github.com/ansible/ansible/issues/14945

似乎在 group_vars 中定义的变量在 playbook 中更改主机组时未重新加载。

这是我使用 ansible 2.0.1.0 的剧本

├── inventory
│   └── dev
│       ├── group_vars
│       │   ├── all
│       │   ├── backend
│       │   └── backoffice
│       └── hosts
├── playbook.yml
└── roles
    └── deploy
        └── tasks
            └── main.yml

主机库存:

[shop]
weenect.dev ansible_user=vagrant

[backend]
weenect.dev ansible_user=vagrant

[backoffice]
weenect.dev ansible_user=vagrant

为每个主机组执行的部署角色中的任务:

---
- debug: msg="{{ deploy_source_folder }}"

而这个变量的值:

inventory/dev/group_vars/all 的内容:

---
deploy_source_folder: "default"

inventory/dev/group_vars/backend 的内容:

---
deploy_source_folder: "backend"

inventory/dev/group_vars/backoffice 的内容:

---
deploy_source_folder: "backoffice"

执行我的剧本时,预期结果为:

Debug of deploy_source_folder for backend : "backend"
Debug of deploy_source_folder for backoffice : "backoffice"
Debug of deploy_source_folder for shop : "default"

但我有:

Debug of deploy_source_folder for backend : "backend"
Debug of deploy_source_folder for backoffice : "backend"
Debug of deploy_source_folder for shop : "backend"

在与 Ansible 的@abadger 讨论后:https://github.com/ansible/ansible/issues/14945,我对 Ansible 有了更多的了解。

房东首先是 class 公民。这意味着它们会在您所有的剧本中加载一次。所以即使你的主机出现在多个库存组中,它们也只会有一个配置。

解决方案是为每个清单组中的每个主机添加别名。例如:

[shop]
shop ansible_host=localhost

[backend]
backend ansible_host=localhost

[backoffice]
backoffice ansible_host=localhost

有了这个,每个主机将是不同的公民,即使他们针对同一服务器。

注意:您可以将 ansible_host 的值更改为不同的主机名。