Ansibleを使ってサブネットマスクの範囲に対象のIPがあるか調べる


概要

Ansibleを使って、対象のIPがサブネットマスク付きのIPに該当する場合は処理を実行するを実現したくて、その方法を教えてもらったので備忘録として作成。

netaddrを使う

pythonのライブラリの一つみたいです。
インストールがされていない方は下記コマンドでインストールしてください。

# pip install netaddr

もし証明書関連のエラーが出てインストール出来ない場合はpip.confファイルを作成して再度インストールを実行してみてください。ここの記事が参考になると思います。

使ってみる

いただきもののコードですが、下記コードを使って本当にサブネットマスク指定でヒットするか確認してみます。

---
- hosts: localhost
  tasks:
    - name: net range test
      debug:
        msg: "{{ item }} は範囲内です"
      loop:
        - 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
      when: (item | ipaddr("192.168.12.0/24"))

ipaddrのところでIPの範囲を指定しています。
上記コードだと、192.168.12.0〜192.168.12.255の範囲のIPだけがヒットしてメッセージ付きで出力されるはず。

実行結果(一部抜粋)

TASK [net range test] *********************************************************************************************************************************
ok: [localhost] => (item=192.168.12.0) => {
    "msg": "192.168.12.0 は範囲内です"
}
ok: [localhost] => (item=192.168.12.1) => {
    "msg": "192.168.12.1 は範囲内です"
}
ok: [localhost] => (item=192.168.12.254) => {
    "msg": "192.168.12.254 は範囲内です"
}
ok: [localhost] => (item=192.168.12.255) => {
    "msg": "192.168.12.255 は範囲内です"
}
skipping: [localhost] => (item=192.168.15.0)
skipping: [localhost] => (item=192.168.15.1)
skipping: [localhost] => (item=192.168.15.254)
skipping: [localhost] => (item=192.168.15.255)

バッチリですね。範囲外はskippingで出力されてます。
サブネットマスク付きで書いたら範囲にあるか調べてくれるので非常に便利。

おまけ

インベントリファイルにサブネット付きでIPを書く方法を教えてもらったのでこちらも記載。

[myhosts]
172.17.12.[0:255]

この指定でmyhostsグループを指定すれば172.17.12.0〜172.17.12.255が対象になります。こっちはnetaddrは使っていないのでインストール出来ない訳がある人はこっちを使ってみると良いかも。