はじめに
先日、関連付けされていない NSG を Azure CLI で洗い出してまとめ削除するという記事を投稿しました。
これを 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
- 削除対象の NSG は
id
ではなく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
できました。