Ansible

AnsibleでIPアドレスの4オクテット目をserver_idにする

特に知らなくても気にしなくてもid重複事件が起きないように靴屋の小人的にデフォルトに設定しておきたい用途の備忘録。

roles/mysqld/defaults/main.ymlとかに

server_id: "{{ ansible_default_ipv4.address.split('.')[3]}}"

と書いとく。
で、roles/mysqld/templates/my.cnf.j2 とかに

server-id = {{ server_id }}

とかいとく。
上書きしたいならinventoryのhost_varsとかにホスト毎に一意になるように定義しとく。

変数の順位はここらに書いてあった
http://docs.ansible.com/ansible/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable

注意
どのセクションでも、varを再定義すると前のインスタンスが上書きされます。複数のグループに同じ変数がある場合は、最後にロードされたグループが優先されます。プレイのvars:セクションで変数を2回定義すると、2番目の変数が勝ちます。

優先度のあたりの注意書きのとおり、グループ(webとかdbとかのインベントリでセクションわけてグループ化してるやつ)違うのに同時に動かすのはだめっぽくてsite.yml一個でなくグループ毎にplaybook作ってvars_fileをグループ用の指定して動かすのが無難というか同時に動かすと本当に最後に読まれた値になってた。
http://dev.classmethod.jp/server-side/ansible/ansible-inventory-pattern/

chefだとこんなんしていた
http://qiita.com/smallpalace/items/157bd0fc9be9b3c4464c

ipaddressフィルタ(netaddr)というのがありよくマニュアルをみたらこのモジュールはサブネットマスク刈込してくれるかipv4からv6に変換って感じでオクテット分割はしてくれなかった。
http://docs.ansible.com/ansible/playbooks_filters_ipaddr.html

参考:
http://qiita.com/yteraoka/items/7119d4e1e2f8faddfb64
http://docs.ansible.com/ansible/playbooks_loops.html
http://docs.ansible.com/ansible/playbooks_variables.html
https://stackoverflow.com/questions/25470712/ansible-replace-the-host-part-of-an-ipv4-address
http://docs.ansible.com/ansible/playbooks_filters_ipaddr.html