#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