如何在不同的剧本中使用变量?

时间:2019-07-04 07:16:37

标签: ansible

如何在其他剧本中使用变量? (2.7.10版)

username.yml

- hosts: host
  vars_prompt:
    - name: username
      prompt: 'Username...'
      private: no
  tasks:
  - name: Show username
    debug:
      msg: "{{username}}"

- import_playbook: dns.yml

dns.yml

- hosts: DNS
  tasks:
    - name: Mesaj
      debug:
         msg: "{{username}}"
  

失败! => {“ msg”:“该任务包含带有未定义变量的选项。错误是:'username'未定义

2 个答案:

答案 0 :(得分:2)

vars_prompt 声明的变量的范围是 play 。使用set_fact在整个剧本中共享此类变量。

  

set_fact模块将键=值对作为变量,以在剧本范围中进行设置。

- hosts: host
  vars_prompt:
    - name: username
      prompt: 'Username...'
      private: no
  tasks:
    - name: Show username
      debug:
        msg: "{{ username }}"
    - set_fact:
        username: "{{ username }}"

在第二局(dns.yml)中,使用hostvars引用在第一局中 host 缓存的变量。

- hosts: DNS
  tasks:
    - name: Mesaj
      debug:
         msg: "{{ hostvars['host'].username }}"

答案 1 :(得分:0)

不打扰dns.yml剧本。因此,您可以传递-e username=myuser并在需要时单独执行。

username.yml

添加具有不同变量名(uname)的事实集并将其传递给剧本(dns.yml)

- hosts: localhost
  vars_prompt:
    - name: username
      prompt: 'Username...'
      private: no
  tasks:
  - name: Show username
    debug:
      msg: "{{username}}"
  - name: Set fact
    set_fact:
      uname: "{{ username }}"

- import_playbook: dns.yml
  vars:
    username: "{{ uname }}"

dns.yml

此剧本不变。

- hosts: DNS
  tasks:
    - name: Mesaj
      debug:
         msg: "{{username}}"