読者です 読者をやめる 読者になる 読者になる

文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

ansibleを学ぶ:vol03:実行中のホスト名を書き込む、変数の値に変数を使用する

ansible

ansibleの勉強シリーズ第3回です。
f:id:treeapps:20160219001058p:plain
今回は、

  • playbook実行中に、今処理しているホスト名をテンプレートファイルに書き込む。
  • 変数の値に変数を埋め込む。

です。

playbook実行中に、今処理しているホスト名をテンプレートファイルに書き込む。

現在playbook処理中のホスト名を一意のキーとして使用したい場合がありますね。
この場合はちゃんとansibleに組み込み変数として定義されているので、簡単に利用する事ができます。

The trick about going through hostvars is necessary because it’s a dictionary of the entire namespace of variables. ‘inventory_hostname’ is a magic variable that indicates the current host you are looping over in the host loop.

http://docs.ansible.com/faq.html#how-do-i-access-a-variable-name-programmatically

例えば hosts が

[webserver]
node1

の場合、templates/xxx.txtに、

# {{ inventory_hostname }}

と書いてからplay-bookを実行すると、

# node1

と書き込まれます。

IPアドレスを取得する場合はもう少し工夫が必要のようです。

{{ hostvars[inventory_hostname]['ansible_eth0']['ipv4']['address'] }}

http://docs.ansible.com/faq.html#how-do-i-access-a-variable-name-programmatically

こんな感じで辞書を何度か引くと、ホスト名からIPアドレスが引けるようです。
環境によっては「ansible_eth0」が「ansible_eth1」の場合もあります。

変数の値に変数を埋め込む。

シェルスクリプト等でよく以下のような事をします。

MYSQL_HOME=/var/lib/mysql
MYSQL_ERROR_LOG=$MYSQL_HOME/error.log

これをansibleでやるには、以下のようにします。

mysql_home: /var/lib/mysql
mysql_db_name: hoge
mysql_db_encoding: utf8
mysql_login_port: 3306
mysql_login_unix_socket: '{{ mysql_home }}/mysql.sock'
mysql_pid: '{{ mysql_home }}/mysql.pid'
mysql_user_name: '{{ os_default_user }}'
mysql_user_password: '{{ os_default_user }}'
mysql_error_log: '{{ mysql_home }}/error.log'

何故なのか解ってないのですが、シングルクォートで囲まないとエラーになるのです。囲むと、変数の値に変数を利用でき、2重管理を避ける事ができます。

雑感


vagrantとansibleの組み合わせが便利すぎますね。

vagrantの上にdocker乗せたらOS再作成が高速化されるのかな!?


ansibleを勉強すればする程、サーバ管理の基本が全然解って無い事に気付かされ、泣けてきます・・

今もfluentdを設定中ですが、権限周りが全然で、apacheのログ転送で精一杯です

初めてのAnsible

初めてのAnsible