てくなべ (tekunabe)

ansible / network / automation

[Ansible] ipaddr フィルターで特定の範囲のIPアドレスを抽出する

■ はじめに

Ansible には、IP アドレスに対してさまざまフィルターをかける ipaddrというフィルタープラグインがあります。

過去記事参考: [ipaddr フィルターでプレフィックス表記とネットマスク表記を変換する)

このフィルターを使って、IPアドレスのリストの中から、特定の範囲のIPアドレスだけを抽出する方法を試します。

  • 動作確認環境: Ansible 2.8.4
  • 要 netaddr (pip install netaddr でインストール)

■ サンプル

簡単なサンプルで説明します。

Playbook

検証する Playbook は以下の通りです。

target_list に定義されているIPアドレスの中で ip_range (192.168.12.0/24) に含まれているものだけを debug モジュールで出力します。

---
- hosts: localhost
  connection: local
  gather_facts: no

  # 各種変数の定義
  vars: 
    ip_range: 192.168.12.0/24     # この範囲のIPアドレスだけ抽出したい
    target_list:                  # 調べたいIPアドレスのリスト
        - 192.168.12.0            # 範囲内
        - 192.168.12.1            # 範囲内
        - 192.168.12.254          # 範囲内
        - 192.168.12.255          # 範囲内
        - 192.168.15.0
        - 192.168.15.1
        - 192.168.15.254
        - 192.168.15.255

  # タスクの定義
  tasks:
    - name: net range test
      debug:
        msg: "{{ item }} は {{ ip_range }} の範囲内です"
      loop: "{{ target_list | ipaddr(ip_range) }}" # フィルター後にループ

実行結果

Playbook を実行します。

$ ansible-playbook -i localhost, test.yml 

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

TASK [net range test] *********************************************************************************************
ok: [localhost] => (item=192.168.12.0) => {
    "msg": "192.168.12.0 は 192.168.12.0/24 の範囲内です"
}
ok: [localhost] => (item=192.168.12.1) => {
    "msg": "192.168.12.1 は 192.168.12.0/24 の範囲内です"
}
ok: [localhost] => (item=192.168.12.254) => {
    "msg": "192.168.12.254 は 192.168.12.0/24 の範囲内です"
}
ok: [localhost] => (item=192.168.12.255) => {
    "msg": "192.168.12.255 は 192.168.12.0/24 の範囲内です"
}

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

192.168.12.0/24 の範囲内の IP アドレスだけ抽出されました。ループ前に抽出されるので、 そもそも 192.168.15.0 などはループの対象にはならず、skipped としても表示されません。

もしループ後に抽出したい場合は、以下の記事のように when で判断するのが良いと思います。このあたりはお好みで。

qiita.com

なお、192.168.12.0/24 ではなく 192.168.12.0/255.255.255.0 のようなマスク表記でも正常に抽出されました。 192.168.12.0/24192.168.13.0/24 のような範囲同士の比較、抽出もできるようようです。

■ まとめ

ipaddr フィルターで特定の範囲のIPアドレスを抽出する方法をご紹介しました。

ipaddr フィルタープラグインには、他にもさまざまな機能がありますので、IP アドレスに対してなにか加工したい場合は、このフィルターを調べてみると良いかもしれません。