当前位置: 首页 > 知识库问答 >
问题:

ansible在使用动态库存时返回不正确的VAR

暴奕
2023-03-14

在ansible 2.2.0.0、2.2.1.0和2.1.4.0上测试

我有一个清单脚本,它在运行时返回这个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"
    }
  }
}

我写的剧本是用来部署应用程序的。库存中的VAR对于组来说是唯一的,即每个服务都有自己的lb池和http端口。另外,一台主机上可以有多个应用程序。以下是剧本喜欢的内容:

---
- hosts: all
  remote_user: deployment
  become: true
  become_method: sudo
  become_user: root
  gather_facts: yes
  serial: 1
  roles:
    - app-deploy
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,我从componentB-service_ci vars中获取nginxpool和httpport的值。我阅读了文档,但不明白这是如何发生的?这是一个bug,还是我不明白ansible在这里是如何工作的?

共有1个答案

南门飞扬
2023-03-14

我想重点是,ansible首先建立完整的目录,然后搜索符合您限制的游戏。

由于主机(host1.example.com)属于指定相同变量的两个组,因此在设置清单时信息会混淆。host1.example.comhttpport变量的内容可以来自componenta-group或componentb-group。

在建立清单之后,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"
    }
  }
}
 类似资料:
  • 我想将日期字符串从“2016-09-23T09:14:52.555000000”格式解析为“23-SEP-2016”格式。 这是我的密码: 问题是如果我用这句台词 SimpleDateFormat oracleDateFormat=新的SimpleDateFormat(“yyyy-MM-dd'T'kk:MM:ss.S”); 输出为(不正确的日期值): 而如果用这条线 oracleDateForma

  • 我正在使用Ansible来设置EC2实例并部署一个应用程序。有一个hosts脚本,它收集标签、相关服务器和分组信息。我想把这些动作作为一个剧本来运行,所以 如果需要,将创建新实例 主机脚本加载清单(包括服务器的事实) 部署剧本有效 但我还没找到一个命令让它翻倍。

  • 所以我当前处于“America/Los_Angeles”时区(PDT)中,但是当我创建一个新的moment对象并通过moment tz将其时区设置为我所在的时区('America/Los_Angeles'),如下所示: 错误的时间被返回。具体来说就是提前8个小时。所有其他时区也会出现这种情况。 我是不是从根本上误解了这是怎么工作的? 谢谢你的帮助!

  • 我很清楚关于这个话题有多个问题,但我就是弄不懂它的意思。问题似乎是没有将新值添加到@cacheable列表中。 调试完问题后,我发现问题似乎出在钥匙上。 下面是代码片段 所以当我调用save方法时,用于缓存的关键字是incrementing integer,或者1,2,3...但是当我尝试获取所有文档时,缓存使用SimpleKey[]作为键。如果我尝试为@Cacheable使用相同的键,我会得到S

  • 问题内容: def size_of_dir(dirname): print(“Size of directory: “) print(os.path.getsize(dirname)) 是有问题的代码。dirname是一个目录,其中包含 130个 文件,每个文件约 1kb 。当我调用此函数时,它返回 4624 ,这 不是 目录的大小…为什么? 问题答案: 此值(4624B)代表的大小 文件 是 描

  • 我正在使用postgis计算两个地理坐标之间的距离。 它返回给我53536.743496517米,大约等于54公里,但实际距离是103公里,我通过http://boulter.com/gps/distance/ 我在询问中是否做错了什么?