使用动态库存时 ansible returns 不正确的变量
ansible returns incorrect vars when using dynamic inventory
测试于:ansible 2.2.0.0、2.2.1.0 和 2.1.4.0
我有一个库存脚本 returns 这个 json 当 运行 (为了举例而最小化):
{
"componentA-service_ci": {
"hosts": [
"host1.example.com",
"host2.example.com"
],
"vars": {
"httpport": "8100",
"nginxpool": "componentA_pool"
}
},
"componentB-service_ci": {
"hosts": [
"host1.example.com",
"host3.example.com"
],
"vars": {
"httpport": "9999",
"nginxpool": "componentB_pool"
}
}
}
我正在编写的剧本用于部署应用程序。清单中的变量对于组是唯一的,即每个服务都有自己的 lb 池和 http 端口。一台主机上也可以有多个应用程序。这就是剧本喜欢的内容:
---
- hosts: all
remote_user: deployment
become: true
become_method: sudo
become_user: root
gather_facts: yes
serial: 1
roles:
- app-deploy
角色中的任务只是打印出变量 nginxpool 和 httpport。
我运行剧本是这样的:
ansible-playbook deploy.yml -i inventory.py --limit componentA-service_ci
预期结果:
TASK [app-deploy : debug] ******************************************************
ok: [host1.example.com] => {
"msg": "pool componentA_pool port 8100"
}
TASK [app-deploy : debug] ******************************************************
ok: [host2.example.com] => {
"msg": "pool componentA_pool port 8100"
}
实际结果:
TASK [app-deploy : debug] ******************************************************
ok: [host1.example.com] => {
"msg": "pool componentB_pool port 9999"
}
TASK [app-deploy : debug] ******************************************************
ok: [host2.example.com] => {
"msg": "pool componentA_pool port 8100"
}
--limit
的工作原理是 ansible 部署在为 componentA-service_ci 列出的主机上,但对于 host1.example.com 我从 [=40= 获取 nginxpool 和 httpport 的值] 变种。我阅读了 documentation 但不明白这是怎么发生的?这是一个错误还是我只是不了解 ansible 在这里是如何工作的?
我认为重点是,ansible 首先构建完整的库存,然后搜索符合您限制的播放。
由于主机 (host1.example.com
) 属于指定相同变量的两个组,因此在设置清单时信息会混淆。 host1.example.com
的 httpport
变量的内容可能来自 componentA
组或 componentB
组。
构建清单后,ansible 尝试将播放限制为包含来自指定限制组的主机的播放
重命名您的变量,使变量名称是唯一的,然后在播放中使用特定组内的特定变量名称:
{
"componentA-service_ci": {
"hosts": [
"host1.example.com",
"host2.example.com"
],
"vars": {
"componentA_httpport": "8100",
"componentA_nginxpool": "componentA_pool"
}
},
"componentB-service_ci": {
"hosts": [
"host1.example.com",
"host3.example.com"
],
"vars": {
"componentB_httpport": "9999",
"componentB_nginxpool": "componentB_pool"
}
}
}
现在主机host1.example.com
有四个变量componentA_httpport
、componentA_nginxpool
和componentB_httpport
、componentB_nginxpool
。
测试于:ansible 2.2.0.0、2.2.1.0 和 2.1.4.0
我有一个库存脚本 returns 这个 json 当 运行 (为了举例而最小化):
{
"componentA-service_ci": {
"hosts": [
"host1.example.com",
"host2.example.com"
],
"vars": {
"httpport": "8100",
"nginxpool": "componentA_pool"
}
},
"componentB-service_ci": {
"hosts": [
"host1.example.com",
"host3.example.com"
],
"vars": {
"httpport": "9999",
"nginxpool": "componentB_pool"
}
}
}
我正在编写的剧本用于部署应用程序。清单中的变量对于组是唯一的,即每个服务都有自己的 lb 池和 http 端口。一台主机上也可以有多个应用程序。这就是剧本喜欢的内容:
---
- hosts: all
remote_user: deployment
become: true
become_method: sudo
become_user: root
gather_facts: yes
serial: 1
roles:
- app-deploy
角色中的任务只是打印出变量 nginxpool 和 httpport。
我运行剧本是这样的:
ansible-playbook deploy.yml -i inventory.py --limit componentA-service_ci
预期结果:
TASK [app-deploy : debug] ******************************************************
ok: [host1.example.com] => {
"msg": "pool componentA_pool port 8100"
}
TASK [app-deploy : debug] ******************************************************
ok: [host2.example.com] => {
"msg": "pool componentA_pool port 8100"
}
实际结果:
TASK [app-deploy : debug] ******************************************************
ok: [host1.example.com] => {
"msg": "pool componentB_pool port 9999"
}
TASK [app-deploy : debug] ******************************************************
ok: [host2.example.com] => {
"msg": "pool componentA_pool port 8100"
}
--limit
的工作原理是 ansible 部署在为 componentA-service_ci 列出的主机上,但对于 host1.example.com 我从 [=40= 获取 nginxpool 和 httpport 的值] 变种。我阅读了 documentation 但不明白这是怎么发生的?这是一个错误还是我只是不了解 ansible 在这里是如何工作的?
我认为重点是,ansible 首先构建完整的库存,然后搜索符合您限制的播放。
由于主机 (host1.example.com
) 属于指定相同变量的两个组,因此在设置清单时信息会混淆。 host1.example.com
的 httpport
变量的内容可能来自 componentA
组或 componentB
组。
构建清单后,ansible 尝试将播放限制为包含来自指定限制组的主机的播放
重命名您的变量,使变量名称是唯一的,然后在播放中使用特定组内的特定变量名称:
{
"componentA-service_ci": {
"hosts": [
"host1.example.com",
"host2.example.com"
],
"vars": {
"componentA_httpport": "8100",
"componentA_nginxpool": "componentA_pool"
}
},
"componentB-service_ci": {
"hosts": [
"host1.example.com",
"host3.example.com"
],
"vars": {
"componentB_httpport": "9999",
"componentB_nginxpool": "componentB_pool"
}
}
}
现在主机host1.example.com
有四个变量componentA_httpport
、componentA_nginxpool
和componentB_httpport
、componentB_nginxpool
。