неопределенная переменная при использовании import_playbook

#ansible

#ansible

Вопрос:

Это мой сборник для некоторого базового тестирования

 ---
- name: get username and password
  import_playbook: credentials.yaml

- name: Run some commands
  hosts:
    - qfx5100-48s
  roles:
    - Juniper.junos
  vars:
    ansible_python_interpreter: "/opt/ansible/ansible-venv/bin/python"
  connection: local
  gather_facts: no

  tasks:
    - name: get uptime
      juniper_junos_command:
        commands:
          - show system uptime
        provider:
          host: "{{ ansible_host }}"
          port: 22
          user: "{{ username }}"
          passwd: "{{ password }}"
      register: uptime

- name: Run some other commands
  hosts:
    - ex3300-48t
  roles:
    - Juniper.junos
  vars:
    ansible_python_interpreter: "/opt/ansible/ansible-venv/bin/python"
  connection: local
  gather_facts: no

  tasks:
    - name: get uptime
      juniper_junos_command:
            commands:
          - show system alarms
        provider:
          host: "{{ ansible_host }}"
          port: 22
          user: "{{ username }}"
          passwd: "{{ password }}"
      register: alarms

    - name: display uptime
      debug:
        var: uptime.stdout_lines

    - name: display alarms
      debug:
        var: alarms.stdout_lines
  

Когда я запускаю это, я получаю эту ошибку:

«»Задача включает в себя параметр с неопределенной переменной. Ошибка была: ‘пароль’ не определен n N Ошибка, по-видимому, была в ‘/ opt / ansible / commands2.yaml’: строка 15, столбец 7, но может быть и в другом месте файла в зависимости от конкретной синтаксической проблемы. n N Строка-нарушитель выглядит как:nn задачи:n — имя: получить время безотказной работы n ^ здесь n»}»

учетные данные.файл yaml является:

 - name: Get username and password
  hosts: localhost
  vars:
    ansible_python_interpreter: "/opt/ansible/ansible-venv/bin/python"
  connection: local
  gather_facts: no
  vars_prompt:
    - name: username
      prompt: Junos Username
      private: no
    - name: password
      prompt: Junos Password
      private: yes
  

Поскольку есть два воспроизведения, я пытаюсь избежать того, чтобы пользователю дважды запрашивали его имя пользователя и пароль при запуске каждого воспроизведения…

я новичок в ansible, и, скорее всего, я подхожу к этому неправильно, но был бы признателен за некоторые рекомендации здесь.

Спасибо!

Ответ №1:

Переменные, заданные в разделах vars или vars_prompt или vars_files воспроизведения, ограничены этим воспроизведением: они не будут доступны в последующих воспроизведениях. Например.

 ---
- hosts: localhost
  gather_facts: false
  vars:
    example: foo

- hosts: localhost
  gather_facts: false

  tasks:
    - debug:
        var: example|default('<NOT SET>')
  

Выведет:

 TASK [debug] **********************************************************************************************************************************************************************************
ok: [localhost] => {
    "example|default('<NOT SET>')": "<NOT SET>"
}
  

Но если вы установите факт на хосте, используя эту переменную, она будет доступна как hostvar в последующих воспроизведениях. То есть это:

 ---
- hosts: localhost
  gather_facts: false
  vars:
    example: foo

  tasks:
    - set_fact:
        example: "{{ example }}"

- hosts: localhost
  gather_facts: false

  tasks:
    - debug:
        var: example|default('<NOT SET>')
  

Выведет:

 TASK [debug] **********************************************************************************************************************************************************************************
ok: [localhost] => {
    "example|default('<NOT SET>')": "foo"
}
  

В этом примере я могу ссылаться {{ example }} , потому что факт был установлен localhost , и второе воспроизведение также выполняется localhost . В вашем примере, когда вы запускаете воспроизведение credentials.yml на локальном хосте, но пытаетесь использовать значение в воспроизведении, запущенном на другом хосте, вам нужно будет ссылаться на него как:

 {{ hostvars['localhost'].example }}
  

Для полноты ваш credentials.yml будет выглядеть примерно так:

 ---
- hosts: localhost
  gather_facts: false
  vars_prompt:
    - name: username
      prompt: Junos Username
      private: no
    - name: password
      prompt: Junos Password
      private: yes

  tasks:
    - set_fact:
        username: "{{ username }}"
        password: "{{ password }}"
  

И ваш playbook.yml будет выглядеть так:

 ---
- name: get username and password
  import_playbook: credentials.yml

- name: Run some commands
  hosts:
    - qfx5100-48s
  roles:
    - Juniper.junos
  vars:
    ansible_python_interpreter: "/opt/ansible/ansible-venv/bin/python"
  connection: local
  gather_facts: no

  tasks:
    - name: get uptime
      juniper_junos_command:
        commands:
          - show system uptime
        provider:
          host: "{{ ansible_host }}"
          port: 22
          user: "{{ hostvars['localhost'].username }}"
          passwd: "{{ hostvars['localhost'].password }}"
      register: uptime