我有一个剧本,里面有两个剧本,一个是本地剧本,一个是远程剧本。我有两个清单,一个用于测试,一个用于生产。每个清单都为远程组定义了一个变量,但我想在本地剧本中使用该变量而不使用委托。这可行吗?我该怎么做?
剧本示例:
- hosts: local
tasks:
# ... lots of local build steps here
- command: tar -czf {{ archive_name }} /build_dir
- hosts: remote
tasks:
- unarchive: src={{ archive_name }} dest=/deploy_dir
测试库存:
[local]
127.0.0.1
[remote]
test.example.com
[remote:vars]
archive_name=/tmp/test-build.tgz
生产库存:
[local]
127.0.0.1
[remote]
www.example.com
[remote:vars]
archive_name=/tmp/production-build.tgz
此示例失败,因为{{ archive_name }}
没有为该local
组定义。
解决这个问题将有以下限制:
- 我无法将其放入文件中,
group_vars
因为我有具有相同组名的不同库存。 - 我宁愿不委托构建过程任务,而是使用单独的方案。
- 我想将变量保留在库存文件中,而不是动态加载其他文件。
我目前看到的唯一选择是{{ archive_name }}
为该local
组重新定义,但这很容易出错。
答案1
您应该能够archive_name
通过以下方式访问的值hostvars
:
- hosts: local
tasks:
# ... lots of local build steps here
- command: tar -czf {{ hostvars[groups['remote'][0]]['archive_name'] }} /build_dir
- hosts: remote
tasks:
- unarchive: src={{ hostvars[groups['remote'][0]]['archive_name'] }} dest=/deploy_dir