Переменная Ansible не обновляется из-за несогласованных условий. У меня есть приведенная ниже книга, в которой фактически сравниваются два маршрутизатора (в основном пары) для текущей конфигурации, и если есть совпадение или несоответствие, он должен сообщить.
---
-
hosts: '{{d1}}'
gather_facts: no
connection: network_cli
tasks:
- name: Task1 - Fetching running configuration of device A
cli_command:
command: show run
#output: json
register: runA
#- debug:
# msg: "{{runA.stdout_lines}}"
-
hosts: '{{d2}}'
gather_facts: no
connection: network_cli
tasks:
- name: Task2 - Fetching running configuraiton of device B
cli_command:
command: show run
#output: json
register: runB
#- debug:
# msg: "{{runB.stdout_lines}}"
- hosts: localhost
gather_facts: no
roles:
- ansible-network.network-engine
vars:
runconfA: "{{hostvars[d1]['runA']['stdout']}}"
runconfB: "{{hostvars[d2]['runB']['stdout']}}"
atomic_update_mismatch: false
tasks:
#- debug:
# msg: "{{hostvars[d1]['runA']['stdout']}}"
- name: Task3 - Parse Atomic Update from Running config of device A
command_parser:
file: "parsers/atomic_update.yaml"
content: "{{ runconfA }}"
- name: Task4 - Save Atomic Update output
set_fact:
atomic_update_deviceA: "{{output}}"
- name: Task5 - Parse Atomic Update from Running config of device B
command_parser:
file: "parsers/atomic_update.yaml"
content: "{{ runconfB }}"
- name: Task6 - Save Atomic Update output
set_fact:
atomic_update_deviceB: "{{output}}"
- debug:
msg:
- "atomic update from device a: {{atomic_update_deviceA}}"
- "atomic update from device b: {{atomic_update_deviceB}}"
- name: Task7 - Compare output from both devices
set_fact:
atomic_update_mismatch: true
when: atomic_update_deviceA != atomic_update_deviceB
- debug:
msg: "does running config has atomic update mismatch: {{atomic_update_mismatch}}"
#msg: "check if {{atomic_update_deviceA}} == {{atomic_update_deviceB}}"
#- "Atomic Update of device B: {{atomic_update_deviceB}}"
Существует еще одна книга воспроизведения, которая содержит регулярное выражение, где я узнаю, используя регулярное выражение, при сопоставлении помещает результат в переменную и возвращает переменную в первую книгу воспроизведения
---
#- debug: var=runconfA
- name: Match atomic update from running-config
export: yes
pattern_match:
match_all: yes
#match_greedy: yes
#regex: ".*\\b(atomic)\\b.*"
regex: "^.*\\batomic\\b.*$"
register: output
Выполните следующую команду: ansible-playbook config_mfg_ce.yml -i inventory.txt --extra-vars "d1 = A d2 = B"
где d1 - маршрутизатор A, а d2 - маршрутизатор B.
Когда я запускаю это, если у нас есть атомарное совпадение в маршрутизаторе A, но не в маршрутизаторе B, он все равно обновляется как «нет несоответствия», что неверно, это связано с тем, что выходная переменная обновляет значение / результат маршрутизатора A также для маршрутизатора B и не обновляется, когда значение маршрутизатора B обновляется в зарегистрированной переменной output.
Как я могу передать выходную переменную из playbook регулярных выражений в playbook config_mfg_ce.yml с отдельным обновленным значением выходной переменной для маршрутизатора A и маршрутизатора B?
Выход Playbook:
PLAY [A] ************************************************************************************************************************************************************
TASK [Task1 - Fetching running configuration of device A] ***********************************************************************************************************************************
ok: [A]
PLAY [B] ***********************************************************************************************************************************************************
TASK [Task2 - Fetching running configuraiton of device B] ***********************************************************************************************************************************
ok: [B]
PLAY [localhost] ****************************************************************************************************************************************************************************
TASK [Task3 - Parse Atomic Update from Running config of device A] **************************************************************************************************************************
[DEPRECATION WARNING]: set_available_variables is being deprecated. Use "@available_variables.setter" instead.. This feature will be removed in version 2.13. Deprecation warnings can be
disabled by setting deprecation_warnings=False in ansible.cfg.
fatal: [localhost]: FAILED! => {"msg": "invalid directive in parser: set_fact"}
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=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
Любая помощь очень ценится.
Это не будет работать с зарегистрированной переменной, потому что:
Зарегистрированные переменные похожи на факты с некоторыми ключевыми отличиями. Как и факты, зарегистрированные переменные являются переменными уровня хоста. Однако зарегистрированные переменные хранятся только в памяти. (Ansible факты поддерживаются любым подключаемым модулем кеширования, который вы настроили.) Зарегистрированные переменные действительны только на хосте для остальной части текущего запуска playbook.
Это ограничение переменных в Ansible можно смягчить, используя set_fact
как это, добавив set_fact
для зарегистрированного выхода:
- set_fact:
output: "{{ output }}"
cacheable: yes