
Ich habe einen Anwendungsfall, bei dem ich in meiner Inventardatei, beispielsweise inventory.txt, eine Reihe von Hosts habe als
[ios]
a.b.c.d
s.i.s.i
x.x.c.c
Ich muss überprüfen, ob vstack auf jedem dieser Hosts aktiviert ist. Wenn aktiviert, muss ich es als Selbstheilungsprozess deaktivieren.
Mein Playbook:
---
- hosts: all
connection: network_cli
become: true
become_method: enable
tasks:
- name: Verify whether vstack feature is enabled
ios_command:
commands:
- show vstack config | incl Role
vars:
ansible_command_timeout: 30
register: showvstack
- debug:
var: showvstack.stdout
# when: showvstack.stdout is regex("'Role.*'")
#- name: set regex pattern
# set_fact:
# regex_pattern: "^.*Client (SmartInstall enabled).*$"
- name: Check with when condition
debug:
msg: "Vstack Enabled!!!!"
when: showvstack.stdout | join('') | match('Client (SmartInstall enabled)') or showvstack.stdout | join('') | match('Client')
- name: If vstack is enabled on switch disable vstack
ios_config:
lines:
- no vstack
when: showvstack.stdout | join('') | search('Client')
----------------------------------------------------------------------------
Spielergebnis
TASK [Gathering Facts] **********************************************************************************************************************************************************************
ok: [a.b.c.d]
ok: [x.v.b.n]
ok: [z.z.x.c]
TASK [Verify whether vstack feature is enabled] *********************************************************************************************************************************************
ok: [a.b.c.d]
ok: [x.v.b.n]
ok: [z.z.x.c]
TASK [debug] ********************************************************************************************************************************************************************************
ok: [a.b.c.d] => {
"showvstack.stdout": [
"Role: Client (SmartInstall enabled)"
]
}
ok: [x.v.b.n] => {
"showvstack.stdout": [
"Role: NA"
]
}
ok: [z.z.x.c] => {
"showvstack.stdout": [
"Role: Client"
]
}
TASK [Check with when condition] ************************************************************************************************************************************************************
skipping: [a.b.c.d]
skipping: [x.v.b.n]
skipping: [z.z.x.c]
TASK [If vstack is enabled on switch disable vstack] ****************************************************************************************************************************************
skipping: [a.b.c.d]
changed: [x.v.b.n]
changed: [z.z.x.c]
PLAY RECAP **********************************************************************************************************************************************************************************
a.b.c.d : ok=4 changed=1 unreachable=0 failed=0
x.v.b.n : ok=3 changed=0 unreachable=0 failed=0
z.z.x.c : ok=4 changed=1 unreachable=0 failed=0
Da einige Cisco-Switches die Rolle „Client“ und einige Cisco-Switches die Rolle „Client Smart Install aktiviert“ angeben, wird das obige Spiel „vstack vorhanden“ auch für Switches ausgeben, die kein vstack enthalten, da ich nach „Client“ suche und es auch „Role: Client Smartinstall deaktiviert“ verwendet, da die Client-Zeichenfolge darin vorhanden ist. Meine Frage ist, ob es eine bessere Möglichkeit gibt, die Meldung auszugeben, dass „vstack vorhanden“ ist, selbst wenn ich eine Bedingung habe, die besagt, dass „Role: Client Smartinstall deaktiviert“ ist.
Antwort1
Führen Sie einfach den Befehl mit demwhen
bedingt.
tasks
- name: Run show command
ios_command: show vstack config | incl Role
register: showvstack
- name: disable vstack
ios_command: # whatever command disables vstack
when: "'Role: Enabled' in showvstack"
Es wird übersprungen, wenn die Bedingung nicht erfüllt ist.