Как убедиться, что имя пула dhcp существует, прежде чем обновлять параметры с помощью ansible

#networking #ansible #network-programming #ansible-template #cisco-ios

Вопрос:

Вот мой план действий. Когда я выполняю его, команда ip dhcp-пул {{ item.name }} не проверяйте, существует это имя или нет. Я использую параметр «соответствие: точное», но он не работает. Итак, могу ли я использовать оператор if в сборнике игр ansible или есть способ проверить имя пула перед выполнением команд. Я использую «когда» в сборнике пьес, чтобы проверить, есть ли item.name определено, но это также не работает.

 
---
- name: "UPDATE DHCP OPTIONS FOR FNAC-FRANCHISE SWITCHES"
  hosts: all
  gather_facts: false
  vars:
    xx: ["ip dhcp pool VOICEC_DHCP","ip dhcp pool DATA","ip dhcp pool VIDEO_DHCP ","ip dhcp pool WIFI_USER"," ip dhcp pool WIFI_ADM", ]

  tasks:
    - name: "CHECK"
      ios_command:
        commands:
          - show run | include ip dhcp pool
      register: output

    - name: DISPLAY THE COMMAND OUTPUT
      debug:
        var: output.stdout_lines

    - name: transform output
      set_fact:
        pools: "{{ item | regex_replace('ip dhcp pool ', '') }}"
      loop: "{{ output.stdout_lines }}"

    - name: "UPDATE DHCP OPTIONS IN POOL DATA amp; WIFI_USER"
      ios_config:
        lines:
          - dns-server 10.0.0.1
          - netbios-name-server 10.0.0.1
          - netbios-node-type h-node
        parents: ip dhcp pool {{ item.name }}
        match: exact
      loop: "{{ pools }}"

 

Вот результат, который у меня есть

 ok: [ITG] => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "stdout": ["ip dhcp pool VIDEO_DHCPnip dhcp pool WIFI_ADMnip dhcp pool VOICEC_DHCPnip dhcp pool DATAnip dhcp pool WIFI_USER"], "stdout_lines": [["ip dhcp pool VIDEO_DHCP", "ip dhcp pool WIFI_ADM", "ip dhcp pool VOICEC_DHCP", "ip dhcp pool DATA", "ip dhcp pool WIFI_USER"]]}

TASK [DISPLAY THE COMMAND OUTPUT] *********************************************************************************************************************************************
ok: [ITG] => {
    "output.stdout_lines": [
        [
            "ip dhcp pool VIDEO_DHCP",
            "ip dhcp pool WIFI_ADM",
            "ip dhcp pool VOICEC_DHCP",
            "ip dhcp pool DATA",
            "ip dhcp pool WIFI_USER"
        ]
    ]
}

TASK [transform output] *******************************************************************************************************************************************************
ok: [ITG] => (item=[u'ip dhcp pool VIDEO_DHCP', u'ip dhcp pool WIFI_ADM', u'ip dhcp pool VOICEC_DHCP', u'ip dhcp pool DATA', u'ip dhcp pool WIFI_USER']) => {"ansible_facts": {"pools": ["VIDEO_DHCP", "WIFI_ADM", "VOICEC_DHCP", "DATA", "WIFI_USER"]}, "ansible_loop_var": "item", "changed": false, "item": ["ip dhcp pool VIDEO_DHCP", "ip dhcp pool WIFI_ADM", "ip dhcp pool VOICEC_DHCP", "ip dhcp pool DATA", "ip dhcp pool WIFI_USER"]}

 

Есть коммутаторы, имя пула которых WIFI_USER не существует, и я не хочу создавать его в коммутаторе, если строка «родители: пул ip dhcp {{ item.name }}» не совпадает.

Комментарии:

1. сделайте регистрацию, чтобы записать вывод задачи и показать, что у вас есть, когда имя существует и не существует..к вашему сведению, вы могли бы добавить check_mode: да, чтобы просто проверить вывод, но ничего не изменилось

2. не уверен, что check_mode: да работает с командой linux, есть ли команда, которая могла бы указать, существует ли пул? может быть, пул DHCP Sh IP? или Показать пул IP DHCP?

3. Да, мы можем использовать «показать ip-пул dhcp <имя пула>», чтобы проверить, существует ли он

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

5. [ "ip dhcp pool VOICEC_DHCP", "ip dhcp pool DATA", "ip dhcp pool VIDEO_DHCP ", "ip dhcp pool WIFI_USER", " ip dhcp pool WIFI_ADM", ] ` это результат выполнения команды

Ответ №1:

если я смоделирую ваше возвращаемое значение:

 - name: vartest
  hosts: localhost
  vars: #d use just to test
    xx: ["ip dhcp pool VOICEC_DHCP","ip dhcp pool DATA","ip dhcp pool VIDEO_DHCP ","ip dhcp pool WIFI_USER"," ip dhcp pool WIFI_ADM", ]    

  tasks:
    - name: trap output
      ios_config:
      parents: show ip dhcp pool
      register: output

    - name: transform output
      set_fact:
        pools: "{{ pools | default([])   [item | regex_replace('ip dhcp pool ', '')] }}"
      loop: "{{ output.stdout_lines[0]  }}"  #you adapt following the result output.stdout or something else

   - name: "UPDATE DHCP OPTIONS IN POOL DATA amp; WIFI_USER"
     ios_config:
       commands:
         - dns-server <ip-addr>
         - netbios-name-server <ip-addr>
         - netbios-node-type h-node
       parents: ip dhcp pool {{ item }}
     loop: "{{ pools }}"
 

Комментарии:

1. Как я могу использовать его в своем учебнике, пожалуйста ?

2. я отредактировал свой ответ, чтобы дать вам представление о том, как использовать результат команды

3. У меня эта ошибка : ОШИБКА! противоречивые заявления о действиях: ios_config, родители

4. я не знаю правильного синтаксиса для отображения пула, вам нужно адаптировать задачу для выполнения с помощью этого.. я не знаю, нужно ли вам использовать модуль ios_config или простую команду linux

5. я изменил цикл, но ваша ошибка была перед этой задачей