如何使用执行期间生成的变量动态设置 Ansible playbook 中的主机字段?

Mar*_*hev 1 variables ansible ansible-awx devops

我正在尝试使用 Ansible 提供的变量机制在家测试一些东西,我即将在我的工作项目之一中实现该机制。所以,现在已经搜索了一段时间,但似乎我无法让它那么容易地工作,即使到处都有其他人的解决方案。

我现在将通过在家中演示我的测试目录和文件结构来代表我的项目逻辑。情况如下,我有以下剧本:

main.yaml
pl1.yaml
pl2.yaml
Run Code Online (Sandbox Code Playgroud)

./main.yaml 的内容:

  - import_playbook: /home/martin/ansible/pl1.yaml
  - import_playbook: /home/martin/ansible/pl2.yaml
Run Code Online (Sandbox Code Playgroud)

./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 }}"
Run Code Online (Sandbox Code Playgroud)

./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 }}"
Run Code Online (Sandbox Code Playgroud)

整个想法是在比赛之间在球场hosts有一个工作变量。我们该怎么做呢?

如果我不将whichHost变量定义为额外的参数,剧本根本不会运行,没关系,我每次都可以这样做,但在执行过程中我希望该变量是可管理和可更改的。在上面的测试用例中,我希望在 main.yaml 中包含的 play/playbook 中的任何地方都使用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
Run Code Online (Sandbox Code Playgroud)

set_fact似乎也不是很有帮助。任何帮助将不胜感激!

Mar*_*hev 5

好吧,我实际上很快就想通了。

因此,我们肯定需要一个事实任务,保存实际的数据/输出:

- hosts: localhost
  tasks:
  - name: Saving variable
    set_fact:
      whichHost: "{{ whichHostAd.stdout }}"
Run Code Online (Sandbox Code Playgroud)

之后,当你想调用其他主机中的var并播放时,我们必须提供主机和事实:

"{{ hostvars['localhost']['whichHost'] }}"
Run Code Online (Sandbox Code Playgroud)

就像我上面的测试一样,但没有['ansible_facts']