Получить значение на основе определенной строки в Ansible

Я хотел бы получить значение на основе ключевого слова, упомянутого в файле yaml правил. Если ключевое слово в rules.yaml указано как ОБЖ, оно должно получить значение po_id, соответствующее той же подсети во входном файле и правилах yaml, а если ключевое слово ВРП, то оно должно получить значение pog_id, соответствующее той же подсети. в файле ввода и правил yaml. Ожидаемый результат, как показано ниже.

Input.yml

[
    {
        
        "po_id": "11155588779966",
        "pog_id": "1115558871321649",
        "subnetname": "DNS",
        "netname": "Test1"
    },
    {  
        "po_id": "99996688778855",
        "pog_id": "1115558812345",
        "subnetname": "NTP",
        "netname": "Test2"
    },
    {
        "po_id": "123456789101112",
        "pog_id": "111555880321624",
        "subnetname": "NET",
        "netname": "Test3"  
    }
]

правила.yml

rules:
         -    rule number: "1" 
              destCidr: "OBJ({{DNS}}) , 10.22.22.0/24"
                  

         -    rule number: "2"
              destCidr: "OBJ({{ NTP }}) , 10.33.33.0/24"
              

         -    rule number: "3"
              destCidr: "OBJ({{ NET }}), GRP({{ NTP }}) , 10.33.33.0/24"

Ожидаемый результат

[
    {
        "rule number": "1",
        "destCidr": "OBJ(11155588779966), 10.22.22.0/24 "
    },
    {
        "rule number": "2",
        "destCidr": "OBJ(99996688778855), 10.33.33.0/24"
    },
    {    
        "rule number": "3",
        "destCidr": "OBJ(123456789101112), GRP(1115558812345), 10.33.33.0/24 "
    }
]

@Frenchy Это вопрос, связанный с решением, которое вы недавно предоставили. Не могли бы вы сообщить мне, какие изменения необходимы для получения вышеуказанного ожидаемого результата. заранее спасибо

Vinny 22.03.2022 09:54
Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
1
1
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

с той же логикой: вы указываете, хотите ли вы po_id or pog_id предмет

- name: "make this working"
  hosts: localhost
  vars:
    input: "{{ lookup('file', './input.yml') | from_json }}"
    rules:
      - rule number: "1" 
        destCidr: "OBJ({{po_id.DNS}}) , 10.22.22.0/24"
      - rule number: "2"
        destCidr: "OBJ({{ po_id.NTP }}) , 10.33.33.0/24"
      - rule number: "3"
        destCidr: "OBJ({{ po_id.NET }}), GRP({{ pog_id.NTP }}) , 10.33.33.0/24"
  tasks:
    - set_fact:
        po_id: >- 
           {{
             input |items2dict(key_name='subnetname',
                                              value_name='po_id')
           }}

    - set_fact:
        pog_id: >- 
            {{
              input |items2dict(key_name='subnetname',
                                              value_name='pog_id')
            }}  
    - set_fact:
        ruleoutpout: "{{ rules }}"

    - debug:
        var: ruleoutpout

результат:

ok: [localhost] => {
    "ruleoutpout": [
        {
            "destCidr": "OBJ(11155588779966) , 10.22.22.0/24",
            "rule number": "1"
        },
        {
            "destCidr": "OBJ(99996688778855) , 10.33.33.0/24",
            "rule number": "2"
        },
        {
            "destCidr": "OBJ(123456789101112), GRP(1115558812345) , 10.33.33.0/24",
            "rule number": "3"
        }
    ]
}

здесь вы должны указать, используете ли вы po_id or pog_id .. если вы не хотите уточнять это, вы должны использовать пользовательский фильтр ... если вы этого хотите, я предлагаю вам открыть новый вопрос, попросив создать пользовательский фильтр .. в этом случае нечего уточнять, просто сохраните DNS, NET, NTP и его пользовательский фильтр, который выполняет работу после того, как у нас есть OBJ, GRP или другие.

Другие вопросы по теме