variables - 如何使用执行期间生成的变量动态设置 Ansible playbook 中的 hosts 字段?
问题描述
我正在尝试使用 Ansible 提供的变量机制在家里测试一些东西,我将在我的一个工作项目中实现它。所以,现在已经搜索了一段时间,但似乎我无法让它如此轻松地工作,即使在这里和那里使用其他人的解决方案也是如此。
我现在将通过在家中演示我的测试目录和文件结构来代表我的项目逻辑。情况就是这样,我有以下剧本:
main.yaml
pl1.yaml
pl2.yaml
./main.yaml 的内容:
- import_playbook: /home/martin/ansible/pl1.yaml
- import_playbook: /home/martin/ansible/pl2.yaml
./pl1.yaml 的内容:
- name: Test playbook 1
hosts: localhost
tasks:
- name: Discovering the secret host
shell: cat /home/martin/secret
register: whichHostAd
- debug:
msg: "{{ whichHostAd.stdout }}"
- name: Discovering my hostname
shell: hostname
register: myHostnameAd
- set_fact:
whichHost: "{{ whichHostAd.stdout }}"
myHostname: "{{ myHostnameAd.stdout }}"
cacheable: yes
- name: Test playbook 1 part 2
hosts: "{{ hostvars['localhost']['ansible_facts']['whichHost'] }}"
tasks:
- name: Structuring info
shell: hostname
register: secretHostname
- name: Showing the secret hostname
debug:
msg: "{{ secretHostname.stdout }}"
./pl2.yaml 的内容:
- name: Test Playbook 2
hosts: "{{ whichHost }}"
tasks:
- name: Finishing up
shell: echo "And here am i again.." && hostname
- name: Showing var myHostname
debug:
msg: "{{ myHostname.stdout }}"
整个想法是在两场比赛之间的场地上有一个工作变量。hosts
我们如何做到这一点?
如果我不将whichHost变量定义为额外的 arg,则剧本根本不会运行,这没关系,我每次都可以这样做,但在执行期间我希望该变量可管理和可更改。在上面的测试用例中,我希望在main.yaml中包含的剧本/剧本中到处使用 whichHost,特别是为了反映 pl1.yaml 中第一个任务的输出(或whichHostAd.stdout变量的输出),所以我可以在 pl2.yaml 中确定我要定位的主机。
根据文档,我至少应该能够访问它hostvars
(如在我的剧本中),但这是我在尝试上述示例时得到的输出:
ERROR! The field 'hosts' has an invalid value, which includes an undefined variable. The error was: 'dict object' has no attribute 'whichHost'
The error appears to have been in '/home/martin/ansible/pl1.yaml': line 22, column 3, but may
be elsewhere in the file depending on the exact syntax problem.
The offending line appears to be:
- name: Test playbook 1 part 2
^ here
set_fact
似乎也不是很有帮助。任何帮助将不胜感激!
解决方案
好吧,其实我很快就明白了。
所以,我们肯定需要一个事实任务,保存实际的数据/输出:
- hosts: localhost
tasks:
- name: Saving variable
set_fact:
whichHost: "{{ whichHostAd.stdout }}"
之后,当您要在其他主机和播放中调用 var 时,我们必须提供主机和事实:
"{{ hostvars['localhost']['whichHost'] }}"
就像我上面的测试一样,但没有['ansible_facts']
推荐阅读
- python - 功率谱密度-scipy.signal
- javascript - Wicket:弹出内容不会出现在 Chrome 浏览器中
- python - python Sklearn中的SVC分类器支持向量类
- php - 方括号是否使变量为空?
- python - 根据条件复制数据帧的行
- javascript - Uncaught Invariant Violation:超过最大更新深度
- python - 如何使用来自未绑定队列的消息进行多处理
- sql-server - SQL Server 触发器自动填充整个列
- android - 安装 React Navigation 和手势处理程序后出错
- html - 无法在导航栏中查看切换按钮