Ansible en genereren van unieke IDs voor objecten

Pagina: 1
Acties:

Vraag


  • pizzaboertje
  • Registratie: Juni 2004
  • Laatst online: 07-06 18:14
Ik ben op dit moment als hobby project bezig om mijn Fortigate firewall te automatiseren. Bijna alles werkt al. Ik loop alleen tegen een issue aan waarbij ik nieuwe firewall policies moet aanmaken. Dit werkt voor 99% goed maar de uitdaging waar ik tegenaan loop is gerelateerd aan het genereren van een unieke policyID per firewall policy object. Dit is namelijk noodzakelijk.

Om het probleem even terug te brengen naar de kern heb ik het volgende ook even bij ChatGPT neergelegd :)

Ik heb een directory met variables in de vorm van yaml bestanden. Deze zijn opgeslagen in de directory /vars. Deze hebben dezelfde structuur en ik heb onderstaand een tweetal voorbeelden geplaatst (met de relevante zaken)

Voorbeeld 1
code:
1
2
3
4
5
policies:
  - name: "RODC->RWDC"
    action: "accept"
  - name: "RWDC->RODC"
    action: "accept"


Voorbeeld 2
code:
1
2
3
policies:
  - name: "STEPSTONE->RODC"
    action: "accept"


In totaal heb ik dus een drietal firewall objecten:
  • RODC->RWDC
  • RWDC->RODC
  • STEPSTONE->RODC
Voor deze objecten wil ik een unieke policyID genereren (via een API call haal ik al het laatste ID op vanuit de Fortigate). Voor dit voorbeeld heb ik het even iets simpeler gemaakt:

Mijn playbook
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
---
- name: Generate unique policy IDs from YAML files
  hosts: localhost
  gather_facts: no
  tasks:
    - name: Find all YAML files in the /vars folder
      find:
        paths: ../vars
        patterns: "*.yml"
      register: yaml_files

    - name: Load all YAML files
      include_vars:
        file: "{{ item.path }}"
      with_items: "{{ yaml_files.files }}"
      register: loaded_vars

    - name: Initialize policy ID counter
      set_fact:
        policy_id_counter: 1000

    - name: Generate unique policy IDs for all policies
      set_fact:
        policies_with_ids: "{{ policies_with_ids | default([]) + [{'name': item.name, 'policy_id': policy_id_counter}] }}"
      loop: "{{ loaded_vars.results | selectattr('ansible_facts.policies', 'defined') | map(attribute='ansible_facts.policies') | flatten }}"
      vars:
        policy_id_counter: "{{ policy_id_counter + loop.index }}"  # Increment based on loop index

    - name: Output policies with their unique policy IDs
      debug:
        msg: "Policy: {{ item.name }}, Policy ID: {{ item.policy_id }}"
      loop: "{{ policies_with_ids }}"


Nu had ik eigenlijk op onderstaande uitkomst gehoopt:
Policy: StepStone->RODC, Policy ID: 1000
Policy: RODC->RWDC, Policy ID: 1001
Policy: RWDC->RODC, Policy ID: 1002

Maar helaas krijgen alle objecten hetzelfde ID: 1000

code:
1
2
3
4
5
6
7
8
9
ok: [localhost] => (item={'name': 'StepStone->RODC', 'policy_id': 1000}) => {
    "msg": "Policy: StepStone->RODC, Policy ID: 1000"
}
ok: [localhost] => (item={'name': 'RODC->RWDC', 'policy_id': 1000}) => {
    "msg": "Policy: RODC->RWDC, Policy ID: 1000"
}
ok: [localhost] => (item={'name': 'RWDC->RODC', 'policy_id': 1000}) => {
    "msg": "Policy: RWDC->RODC, Policy ID: 1000"
}


Relevante software en hardware die ik gebruik
- Ansible op WSL (Ubuntu)

Wat ik al gevonden of geprobeerd heb
Heel veel ChatGPT :-) Helaas komt ChatGPT er ook niet meer uit. Ik verwacht zelf dat er ergens een loop verkeerd staat.

Wie o wie kan mij een duwtje in de juiste richting geven?

[ Voor 16% gewijzigd door pizzaboertje op 11-09-2024 17:25 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • lordgandalf
  • Registratie: Februari 2002
  • Laatst online: 03-06 13:24
loopt je loop wel ? en zo ja veranderd loop.index wel ?

Steam: Profile / Socialclub: Profile / Uplay: minedwarf / Origin: lordgandalf3