Ansible vars_prompt 和 msg 用法打印 hello world

Ansible vars_prompt and msg usage prints hello world

根据 Zeitounator 的意见,我更新了原来的问题。以下作品

root@devenv:~/scripts/uia# cat addVlanTest.yml
---
- name: PLAY 111 Add Vlan ;
  hosts: all
  vars_prompt:
    - name: vlanIdToAdd
      prompt: vlan ID to add
      private: no
      default: "50"
  tasks:
    - name: "Debug task Take 1"
      ansible.builtin.debug:
        var: vlanIdToAdd
    - name: "Debug task Take 2"
      ansible.builtin.debug:
        msg: "{{ vlanIdToAdd }}"
    - name: "Debug task Take 3"
      ansible.builtin.debug:
        msg: "Creating vlan {{ vlanIdToAdd }}"

正确: 味精:“正在创建 vlan {{ vlanIdToAdd }}”

不正确: msg:"正在创建 vlan {{ vlanIdToAdd }}"

范围是什么?变量在播放后不存在。如果你需要在不同的游戏中使用它,请保存它。

root@devenv:~/scripts/uia# cat addVlanTest.yml
---
- name: PLAY 111 Add Vlan ;
  hosts: all
  vars_prompt:
    - name: vlanIdToAdd
      prompt: vlan ID to add
      private: no
      default: "50"
  tasks:
    - name: "Debug vars Take 1"
      debug:
        var=vlanIdToAdd
    - name: "Debug vars Take 1"
      set_fact:
        new_vlan_id="{{ vlanIdToAdd }}"
- name: PLAY 112 Add Vlan - IOS;
  hosts: ios
  tasks:
    - name: "Debug vars Take 2"
      debug:
        var=new_vlan_id

正如我在评论中所报告的那样,vars_prompt 仅在给定的剧本中可用,因为这是它们的范围。这在 plabooks variable documentation

中有解释

根据我的建议,您已尝试使用 set_fact。正如您将在同一文档中看到的那样,这些变量的范围仅限于主机,并且仅在具有给定事实的主机上播放任务时才可用。同时,您可以使用 hostvars magic variable

从其他主机访问事实

这是解决这种先有鸡还是先有蛋的问题的一种方法。它可能不是您正在寻找的东西,但希望能为您提供一些最佳解决方案的想法。我试着让它不言自明。

以下 test.yml 剧本:

---
- name: Play dedicated to vars_prompt and storing facts in localhost
  hosts: localhost
  gather_facts: false

  vars_prompt:
    - name: my_prompt
      prompt: enter a value
      private: no

  tasks:
    - name: store prompt in fact
      set_fact:
        my_prompt: "{{ my_prompt }}"

- name: Use fact on host a by directly calling it in a task
  hosts: a
  gather_facts: false

  tasks:
    - name: display the fact
      debug:
        msg: "{{ hostvars['localhost'].my_prompt }}"

- name: Use the fact on host b by first assigning to a play var
  hosts: b
  gather_facts: false

  vars:
    my_prompt: "{{ hostvars['localhost'].my_prompt }}"

  tasks:
    - name: display the fact
      debug:
        msg: "{{ my_prompt }}"

给出:

$ ansible-playbook -i a,b, test.yml 
enter a value: toto

PLAY [Play dedicated to vars_prompt and storing facts in localhost] ************************************************************************************************************************************************

TASK [store prompt in fact] ***************************************************************************************************************************************************************************************
ok: [localhost]

PLAY [Use fact on host a by directly calling it in a task] ********************************************************************************************************************************************************

TASK [display the fact] *******************************************************************************************************************************************************************************************
ok: [a] => {
    "msg": "toto"
}

PLAY [Use the fact on host b by first assigning to a play var] ****************************************************************************************************************************************************

TASK [display the fact] *******************************************************************************************************************************************************************************************
ok: [b] => {
    "msg": "toto"
}

PLAY RECAP ********************************************************************************************************************************************************************************************************
a                          : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
b                          : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

同时,如果这在您的场景中可行,您也可以在清单中的所有主机上设置事实,以便在任何地方重复使用它,这使剧本变得更加简单:

---
- name: Play dedicated to vars_prompt and storing facts on all host (except implicit localhost)
  hosts: all
  gather_facts: false

  vars_prompt:
    - name: my_prompt
      prompt: enter a value
      private: no

  tasks:
    - name: store prompt in fact
      set_fact:
        my_prompt: "{{ my_prompt }}"

- name: Use fact on host a
  hosts: a
  gather_facts: false

  tasks:
    - name: display the fact
      debug:
        msg: "{{ my_prompt }}"

- name: Use the fact on host b
  hosts: b
  gather_facts: false

  tasks:
    - name: display the fact
      debug:
        msg: "{{ my_prompt }}"

- name: Simple demo implicit localhost is not part of the all group and does not have the fact
  hosts: localhost
  gather_facts: false

  tasks:
    - name: show fact is undefined on localhost
      debug:
        var: my_prompt

给出:

$ ansible-playbook -i a,b, test.yml 
enter a value: titi

PLAY [Play dedicated to vars_prompt and storing facts on all host (except implicit localhost)] ********************************************************************************************************************

TASK [store prompt in fact] ***************************************************************************************************************************************************************************************
ok: [a]
ok: [b]

PLAY [Use fact on host a] *****************************************************************************************************************************************************************************************

TASK [display the fact] *******************************************************************************************************************************************************************************************
ok: [a] => {
    "msg": "titi"
}

PLAY [Use the fact on host b] *************************************************************************************************************************************************************************************

TASK [display the fact] *******************************************************************************************************************************************************************************************
ok: [b] => {
    "msg": "titi"
}

PLAY [Simple demo implicit localhost is not part of the all group and does not have the fact] *********************************************************************************************************************

TASK [show fact is undefined on localhost] ************************************************************************************************************************************************************************
ok: [localhost] => {
    "my_prompt": "VARIABLE IS NOT DEFINED!"
}

PLAY RECAP ********************************************************************************************************************************************************************************************************
a                          : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
b                          : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0