如果设置了一个变量,为什么还要“结束剧本”?

Why would one want to "end a playbook" if a variable is set?

提问人:Red Cricket 提问时间:11/17/2023 最后编辑:β.εηοιτ.βεRed Cricket 更新时间:11/17/2023 访问量:47

问:

我正在阅读一些看起来像这样的 Ansible 代码:

---
- meta: end_play
  when: centos is defined

- name: Set centos variable
  set_fact:
    centos: "{{ hostvars[item]['ansible_distribution_version'][0:1] }}"
  with_inventory_hostnames: all
  delegate_to: "{{ item }}"
  delegate_facts: true
  run_once: true

我没有人可以问,因为开发人员早已不在了。这是常见的 Ansible 模式吗?
如果是这样,有人可以解释为什么需要这样做吗?他们是试图阻止递归,还是只是看起来很酷?

Ansible的

评论

0赞 β.εηοιτ.βε 11/17/2023
但是,您能否将 YAML 片段带入更多上下文,以获得明确的答案?

答:

3赞 β.εηοιτ.βε 11/17/2023 #1

注意不要混淆剧本游戏
您可以在一个剧本中包含多个重头戏

下面是一个示例 playbook:

- hosts: localhost
  gather_facts: false

  tasks:
    - meta: end_play

    - debug:
        msg: I am not played

- hosts: localhost
  gather_facts: false

  tasks:
    - debug:
        msg: I am still played

由于任务的原因,这仍然会打印第二部剧的任务,尽管不会打印第一部剧的任务:debugmeta

实际输出:

PLAY [localhost] *********************************************************

TASK [meta] **************************************************************

PLAY [localhost] *********************************************************

TASK [debug] *************************************************************
ok: [localhost] => 
  msg: I am still played

所以,是的,最有可能的是,你提供的 YAML 片段是为了确保变量被定义,如果已经定义了,请跳过整个游戏,在进一步的游戏中对变量进行操作。centos

给定剧本:

- hosts: localhost
  gather_facts: false

  tasks:
    - meta: end_play
      when: centos is defined

    - set_fact:
        centos: defined in play 1

- hosts: localhost
  gather_facts: false

  tasks:
    - debug:
        var: centos
  • 第二部戏会让步debug
    ok: [localhost] => 
      centos: defined in play 1
    
  • 但是,当您使用 运行 playbook 时,它会产生--extra-vars "centos='from extra-vars'"
    ok: [localhost] => 
      centos: from extra-vars
    
2赞 Vladimir Botka 11/17/2023 #2

让我谈谈第二项任务

- name: Set centos variable
  set_fact:
    centos: "{{ hostvars[item]['ansible_distribution_version'][0:1] }}"
  with_inventory_hostnames: all
  delegate_to: "{{ item }}"
  delegate_facts: true
  run_once: true

此任务运行一次,并迭代所有主机的set_fact。循环

with_inventory_hostnames: all

等于

loop: "{{ ansible_play_hosts_all }}"

每次迭代都委托给主机,事实也被委托。所有这些设置都与下面的简单任务完全相同

- name: Set centos variable
  set_fact:
    centos: "{{ ansible_distribution_version[0:1] }}"

评论

0赞 Red Cricket 11/19/2023
谢谢弗拉德。是的,关于他们为什么要这样做,这真是一个令人头疼的问题。