ansibleもくもく会(サーバー編)行ってきたよ
遅くなりましたが、ansibleユーザー会主催のもくもく会に初参加してきました。
参加したのはこちら↓
今回のもくもく会は、オイシックス・ラ・大地(Osaki kitchen studio)で開催されました。オイシックス提供の美味しい野菜ジュースを飲みながらもくもくです。
会場となったスタジオはこちら↓(若干迷ったw)
無料で会場提供しているとのことなので、勉強会等開催したい方、する予定がある方は連絡すると良いかもです。
もくもく内容
今回実施した内容については以下の通りです。
- Ansible Engine
アドホックコマンド
Playbook
変数、ループ、ハンドラ
Ansible Galaxy
- Ansible Tower
Ansible Towerのインストール 👈私はここまで。。。
Ansible Towerのコンフィグレーション
Job Templateの作成と実行
大きく分けて、Ansible EngineとAnsible Towerの2つに触れてみるのが今回の目的でした。私は全部終わらなかったので、Ansible Towerは後日やります。。。
実際にAnsibleを試してみる環境は、事前に用意していただいていたので、参加者はSSHで準備済みの環境に接続するだけ!とてもありがたかったです。
アドホックコマンド
Ansibleのアドホックコマンドは、ワンライナーで処理を実行することができるので、「ささっと処理を実行してしまいたい!」って時にとても便利です。
デフォルトのインベントリファイルは、.ansible.cfgにパスが記載されているので事前にチェックしておきましょう。.ansible.cfgにインベントリファイルを指定していれば、-iオプションを使わなくてもそのファイルに書かれたホストに対して処理を実行してくれます。
例えば、以下のようにアドホックコマンド使うことができます。
-oオプションは、通常数行で表示されるコマンド結果を1行で表示させるオプションで、-bオプションはroot権限でコマンドを実行させるオプションです。
その他のコマンドオプションが知りたい場合は、ansible --helpコマンドを実行してみてください。
Playbookの作成
アドホックコマンドは、ワンライナーで処理を実行することができますが、Playbookというスクリプトを書けば管理ノードに対する処理を一括で実行することができます。
例えば、ApacheをインストールするPlaybookを書く場合は以下のようにします。
※インデントには注意しましょう。※
yum: #モジュール指定
name: httpd
state: present #インストールする
- name: start httpd #タスクの名前
service: #モジュール指定
name: httpd
state: started #起動させる
変数、ループ、ハンドラについて
Playbookでは、管理ノードに対する処理を一括で実行できるというメリットがありました。上記のようにそれぞれのグループに対して処理を書いていくのも良いですが、Playbookが長くなってしまうのが難点です。そこで、Playbookをより強力に使うために「変数」、「ループ」、「ハンドラ」を扱えるようになると、使いまわしがしやすくなります。
変数は、ターゲットサーバーごとに違う部分(IPアドレス、ディレクトリ等)を吸収し扱うことができます。変数はPlaybookだけでなくインベントリファイルでも指定することが可能です。
ループは、繰り返し実行するタスクがある場合に使用します。これによって、タスクを複数作成する必要がなくなります。
ハンドラは、サービスを再起動する必要がある場合に使用します。設定ファイルの変更・新規パッケージの導入など、再起動しなければ設定が反映されないときに活用できます。
例えば、上記のPlaybookに書き加えるとするなら、変数だとこのように指定できます。
httpd_packages: #"htpd_packages"という変数に"httpd"と"mod_wsgi"を代入する
- httpd
- mod_wsgi
apache_test_message: This is a test message #文字列を変数に代入
apache_max_keep_alive_requests: 115 #数字を文字列に代入
"httpd_packages"はリスト型の変数であり、"httpd"と"mod_wsgi"の2つのパッケージをリストに入れるように定義しています。以下のようにすると要素を一行で書くことも可能です。
変数名は、自由に決めることができますが、「英数字とアンダースコア」で定義しなければならないので注意してください。例えば、"foo-port"や"foo port"、"555"などは変数名として使えません。
続いて、ループについてです。例えば、複数のパッケージをインストールしたい場合、同じようなタスクを複数書くのは面倒ですよね。ループを使えば、1つのタスクに収めることができます。
- name: install httpd packages
yum:
name: "{{ item }}" #定義した変数に格納されたものを1つ1つ展開
state: present
with_items: "{{ httpd_packages }}" #"httpd_packages"に格納したものを使う
"items"と"with_items"はセットで使います。ここでは、"httpd_packages”を"items"の中に展開するという意味になるので、変数に入れたhttpdとmod_wsgiをそれぞれインストールすることができます。
ハンドラに関しては、再起動が必要なタスクにnotifyキーを指定して使います。タスクにnotifyキーを指定するとhandlersキーを呼びだして、指定したサービスを再起動させることができます。ハンドラは基本Playbookに書かれたタスクが全て完了した後に実行されます。
- name: install httpd packages
yum:
name: httpd
state: present
notify: restart apache service #ハンドラを呼び出して再起動する
handlers: restart apache service
- name: restart apache service
service: name=httpd state=restarted
遭遇したエラー
1つ目
無効なオプションまたは引数を使っていませんか?実行した処理をもう一度見直してみましょう。これはたぶんオプションを間違えたときに出たやつです。
2つ目
3つ目
最後
自分の理解を深めるために色々書いてたら長くなってしまったので、ここまでで割愛。。。Roleを使ったPlaybookの書き方もまとめたいので今度書きます。