てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Azure/Ansible] 関連付けされていない NSG を Ansible で洗い出してまとめ削除する

はじめに

先日、関連付けされていない NSG を Azure CLI で洗い出してまとめ削除するという記事を投稿しました。

tekunabe.hatenablog.jp

これを Ansible でもやってみようとおもって、やってみました。

  • 環境
    • ansible-core 2.12.1
    • azure.azcollection 1.14.0

前提環境

前回の記事と同じです。

どのサブネット、どのネットワークインターフェースにも関連づいていない NSG は以下の 2つです。

  • nsg_free01
  • nsg_free02

Playbook

以下のような Playbook を書きました。

---
- hosts: localhost
  gather_facts: false
  connection: local

  vars:
    resource_group: sakana

  tasks:
    # 指定したリソースグループ内の NSG を一通り取得
    - name: Get all NSG
      azure.azcollection.azure_rm_securitygroup_info:
        resource_group: "{{ resource_group }}"
      register: res_free_nsg

    # 関連付けされていない NSG を抽出
    - name: Get free NSG
      ansible.builtin.set_fact:
        free_nsg_list: "{{ res_free_nsg.securitygroups | json_query(query_string) }}"
      vars:
        query_string: "[?!network_interfaces && !subnets].name"
    
    # 関連付けされていない NSG の名前をデバッグ表示
    - name: Debug free NSG
      ansible.builtin.debug:
        msg: "{{ free_nsg_list }}"

    # 関連付けされていない NSG を削除
    - name: Delete free NSG
      azure.azcollection.azure_rm_securitygroup:
        resource_group: "{{ resource_group }}"
        name: "{{ item }}"
        state: absent
      loop: "{{ free_nsg_list }}"

Azure CLI との大きな違いは以下の2つかと思います。

  • NSG の情報のキーはキャメルケースではなくアンダーバーつなぎなので networkInterfaces ではなく network_interfaces
  • 削除対象の NSGid ではなく name で指定可能

一方、JMESPATH (Ansibleフィルターとしては json_query)を使う点は同じにしました。

実行

PLAY [localhost] ******************************************************************

TASK [Get all NSG] ***************************************************************
ok: [localhost]

TASK [Get free NSG] ***************************************************************
ok: [localhost]

TASK [Debug free NSG] *************************************************************
ok: [localhost] => {
    "msg": [
        "nsg_free01",
        "nsg_free02"
    ]
}

TASK [Delete free NSG] ************************************************************
changed: [localhost] => (item=nsg_free01)
changed: [localhost] => (item=nsg_free02)

PLAY RECAP ************************************************************************
localhost                  : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

できました。