Ansible 变量未更新

Ansible 变量未更新

由于条件不匹配,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 的值在注册变量“输出”中更新时不会刷新。

如何将正则表达式剧本中的输出变量传递到 config_mfg_ce.yml 剧本,并为路由器 A 和路由器 B 单独更新输出变量值?

剧本输出:

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

任何帮助深表感谢。

答案1

这不适用于注册变量,因为:

注册变量与事实类似,但有几个关键区别。与事实一样,注册变量是主机级变量。但是,注册变量仅存储在内存中。(Ansible 事实由您配置的任何缓存插件支持。)注册变量仅在当前剧本运行的其余时间内在主机上有效。

Ansible 文档

Ansible 中的变量限制可以通过使用set_fact像这样通过添加一个set_fact已注册的输出:

- set_fact:
    output: "{{ output }}"
    cacheable: yes

相关内容