ansible változó ellenőrzés

Fórumok

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.

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

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

- 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

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"] }
  - 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: []

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?

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