Ansible-ben meg kellene oldjam, hogy összekombináljak 3 változót tagek függvényében.
Változók
core-access=eth1,eth2,eth3
wifi=eth4,eth5
core=eth6
Jelenleg ez a tasklista:
- name: Create/update vlan with core-access and wifi tag
community.routeros.command:
commands:
- /interface bridge vlan add tagged={{ core-access }},{{ wifi }} \
with_dict: "{{ global_vlan_list }}"
loop_control:
loop_var: item
when:
- host_vlans is not defined
- item.value.type is defined
- '"core-access" in item.value.type'
- '"access" not in item.value.type'
- '"wifi" in item.value.type'
- name: Create/update vlan with access and wifi tag
community.routeros.command:
commands:
- /interface bridge vlan add tagged={{ access }},{{ wifi }} \
with_dict: "{{ global_vlan_list }}"
loop_control:
loop_var: item
when:
- host_vlans is not defined
- item.value.type is defined
- '"core-access" not in item.value.type'
- '"access" in item.value.type'
- '"wifi" in item.value.type'
- name: Create/update vlan with access-core, access and wifi tag
community.routeros.command:
commands:
- /interface bridge vlan add tagged={{ core-acces }},{{access}},{{ wifi }} \
with_dict: "{{ global_vlan_list }}"
loop_control:
loop_var: item
when:
- host_vlans is not defined
- item.value.type is defined
- '"core-access" in item.value.type'
- '"access" in item.value.type'
- '"wifi" in item.value.type'
Meg lehet ezt oldani egyetlen egy task-ak?
Jelenleg 6-al oldom meg, de ha pl lenne egy 4. tag is, akkor az már káosz lenne.
- 1103 megtekintés
Hozzászólások
A megoldhatosagtol fuggetlenul en nem bonyolitanam tul a taskokat a minel jobb atlathatosag miatt, mert fel ev, egy ev utan mar magad sem tudod mit miert csinaltal :)
zolo
- A hozzászóláshoz be kell jelentkezni
Hat e a global vlan list-bol szerveznem inkabb at ugy, hogy az utaljon arra milyen tag-ek kellenek.
De az is megoldas ha marad minden igy, csak nem a tag-elest csinalod a vizsgalatokban, hanem letrehozol egy uj var-t a global-vlan-list alapjan amiben benne hogy mik a tagek es utana csak ezen kell vegigszaladni. De ettol nem lesz kisebb a kodod csak kicsit szetszeded a tageles eldonteset es magat a tagelest.
like:
- name: "szetszedes ccess-core+access+wifi"
ansible.builtin.set_fact:
alltags_map: "{{ alltags_map + [{ 'itemuid': item.value.tokomtudja, 'tags': " ide gyon az osszes"}] }}"
vars:
alltags_map: []
with_dict: "{{ global_vlan_list | sort(attribute='whatever') }}"
loop_control:
label: "{{ item }}"
meg kell a when stb
Valahogy ossze kell fesulni a kettot, de mint mondtam a sok valastasi lehetoseg miatt a kodod nem lesz kisebb a jelenlegi metodussal
- A hozzászóláshoz be kell jelentkezni
- hosts: localhost
vars:
interfaces:
core-access: ['eth1', 'eth2', 'eth3']
wlan: ['eth4', 'eth5']
access: ['eth6']
global_vlan_list:
1: { type: ["core-access", "access", "wlan"] }
2: { type: [] }
3: { type: ["core-access", "access"] }
tasks:
- name: Create/update vlan
debug:
msg: "interface bridge vlan add tagged={{ item.value.type | map('extract', interfaces) | flatten | join(',') }}"
with_dict: "{{ global_vlan_list }}"
when: item.value.type | map('extract', interfaces) | flatten
- A hozzászóláshoz be kell jelentkezni
ez gyonyoru
- A hozzászóláshoz be kell jelentkezni
Ez igen...
ilyesmire gondoltam, de nem gondoltam, hogy ilyen szépen meg lehet oldani.
- A hozzászóláshoz be kell jelentkezni
bookmarked
- A hozzászóláshoz be kell jelentkezni
Egy esetre nem működik a megoldás, mégpedig ha a type-nál egy az interfaces alatt nem definált típus is meg van adva.
Elvileg ennek kiküszöbölésére van a when, de mégis lefut a debug hibával.
vars:
interfaces:
core-access: ['eth1', 'eth2', 'eth3']
wlan: ['eth4', 'eth5']
access: ['eth6']
global_vlan_list:
1: { type: ["core-access", "access", "wlan"] }
2: { type: [] }
3: { type: ["core-access", "access", "other"] }
- A hozzászóláshoz be kell jelentkezni
- name: Create/update vlan
debug:
msg: "interface bridge vlan add tagged={{ item.value.type | select('match', interfaces | join('|')) | map('extract', interfaces) | flatten | join(',') }}"
with_dict: "{{ global_vlan_list }}"
when: item.value.type | select('match', interfaces | join('|')) | map('extract', interfaces) | flatten
Vagy vedd fel az interfaces-be az other-t is üresen: []
- A hozzászóláshoz be kell jelentkezni
Kösz ezt is, működik. Az nekem is ment, hogy üresen definiáltam, de 10+ switchnél nehezen karbantartható.
Itt van összerakva:
- A hozzászóláshoz be kell jelentkezni
Van még egy ansible problémám amire nem tudom ha létezik szebb megoldás.
Van pl ez a két taszk:
- name: DEBUG Create/update vlan
debug:
msg:
- "interface bridge vlan add tagged={{ item.value.type | select('match', interfaces | join('|')) | map('extract', interfaces) | flatten | join(',') }}"
with_dict: "{{ global_vlan_list }}"
when: item.value.type | select('match', interfaces | join('|')) | map('extract', interfaces) | flatten
tags:
- debug
- name: Create/update vlan
community.routeros.command:
commands:
- "interface bridge vlan add tagged={{ item.value.type | select('match', interfaces | join('|')) | map('extract', interfaces) | flatten | join(',') }}"
with_dict: "{{ global_vlan_list }}"
when: item.value.type | select('match', interfaces | join('|')) | map('extract', interfaces) | flatten
tags:
- prod
Az első kiírja a 2.ban végrehajtott parancsot.
Meg lehet az oldani, hogy csak 1 taszkom legyen, ami ha van debug tag, akkor csak kiírja a parancsot, ha nincs, akkor meg futtatja?
- A hozzászóláshoz be kell jelentkezni
a dry-run opciok miert nem jok ha csak ki akarod iratni?
- A hozzászóláshoz be kell jelentkezni
-vvv opcióval végeredményben a --check is kiírja a parancsot, csak elég sok más infót is mellé pakol.
- A hozzászóláshoz be kell jelentkezni
nem kell a -vvv csak a check, mindenre mehet a "check_mode: false" csak arra ne amit ki akarsz iratni a check modban, trukkos kis szerkezet, olvasd el a doksit. A -vvv tok mast csinal. vagy szarod le mindent irjon ki check modban, de ami tenyleg lefutna ott berakod a "when: not ansible_check_mode"-ot, stb stb
- A hozzászóláshoz be kell jelentkezni