2015年1月18日日曜日

Ansible コード作成


さぁ、前回パッケージのインストールまでは行いました。
そして何となく遠隔サーバにアクセスできるところまで来ましたがまだイメージできませんね。

私は先にChefを触っていたので、ここまではふーんという感じですが、
どのような記述ルールがあるのか、ディレクトリ構成は?ライブラリは?少しずいきましょう。

1.プレイブック構成

Chefでいうレシピのようなプレイブックはどのようなものなのか?

公式サイトにベストプラクティスがのっていますね。
Playbooks Best Practices

なるほど、各用途ごとにフォルダを分けて記述、インクルードするようにすると
しかしこれでは個人的に案件で利用しにくいため、下記を参考にカスタマイズします。

Ansible オレオレベストプラクティス

イメージとしては「common_roles」を読み込み専用のプラグイン的に利用し、
ほかはベストプラクティスの基本と同じですね。

2.プレイブックの作成

「common_roles」配下に細かいグループのプレイブックを作成していきます。
試しにApacheの初期設定的なものを作成していきす。

でどうやって?
実行したい内容を「task」という形で記述していきます。
そして「task」のためにAnsible側ではモジュールという形でライブラリが提供されています。
どのようなものがあるかは下記本サイトを参照してください。
Ansible Module Index

プレイブック記述のテクニックや基本的な記述方法は下記を参照
Ansible Playbook

まず「task」を作成します。
Apacheのインストールと、コンフィグファイルの配置、配信が行います。

# vim common_roles/apache/tasks/main.yml

---

- name: Install Apache
yum: name={{ item }} state=present enablerepo=epel
with_items:
- "{{ httpd_installs }}"
notify:
- restart httpd
tags: httpd

- name: Create httpd.conf
template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf backup=yes
notify:
- restart httpd
tags: httpd

- name: Create virtual host
copy: src={{ item }} dest=/etc/httpd/conf.d/
with_items:
- "{{ httpd_include }}"
notify:
- restart httpd
tags: httpd

- name: Start Apache
service: name=httpd enabled=yes
tags: httpd
Apacheのインストールからhttpd.conf、インクルードさせたい設定ファイル、そして起動です。
読み込ませるコンフィグファイルはテンプレート化せずに、
変数に定義した値をインクルード・配布するようにしたいと思います。

次に配布したい設定ファイル「template」を準備します。
設定ファイルにはプロビジョニングツール共通ですが変数を利用できます。
設定ファイル系に関しては今後の可用性も考えて「template」を利用します。
同じファイル配布で「copy」、もありますがここらへんは好みですかね。

# vim common_roles/apache/templates/httpd/conf.j2
ServerTokens ProductOnly
ServerRoot "/etc/httpd"
PidFile run/httpd.pid

Timeout {{ httpd_timeout }}

#KeepAlive Off
#MaxKeepAliveRequests 100
#KeepAliveTimeout 15


StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit {{ httpd_serverlimit }}
MaxClients {{ httpd_maxclients }}
MaxRequestsPerChild 4000


StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0


{% for listen_port in httpd_listen %}
Listen {{ listen_port }}
{% endfor %}

~<省略>
Ansibleのテンプレートの仕組にはJinja2というプログラムが利用されていますので、 込み入ったテンプレートを作成したい方はそちらを調べてみてもよいかもしれません。 主に案件ごとに変更しそうな設定をを変数化しておきます。

Ansibleではファイルを配布する際にバックアップオプションを設定する事で、
配布ファイルと同名のファイルがあった場合にバックアップを作成します。
バックアップはファイルを同じ階層に「ファイル名-yyyy-mm-dd@hh:mm」形式で作成されます。
バックアップ場所が指定できないのかな?そこが不便です。

次にインクルードさせる設定ファイルを作成します。
こちらも定型が決まっていればテンプレートで良いかもしれませんが、
インクルードファイルの定型は決まっていないので、柔軟に対応できるよう普通にファイルで配布します。

# vim common_roles/apache/files/vhost80.conf
NameVirtualHost *:80


ServerName vhost.example.com
ServerAdmin webmaster@localhost.localdomain
DocumentRoot /var/www/html

CustomLog "|/usr/local/sbin/cronolog /var/log/httpd/%Y%m/vhost_80_access.%Y%m%d.log" combined
ErrorLog "|/usr/local/sbin/cronolog /var/log/httpd/%Y%m/vhost_80_error.%Y%m%d.log"


Options -Indexes -MultiViews
AllowOverride None


ただの設定ファイルです。
他にもphpをインストールするのであれば同フォルダにphp.confなど必要な設定ファイルを配置しておきます。

そしてタスクの最後にApacheサービスの自動起動設定を記述していますが、 コンフィグファイルを変更した場合には新しい設定が反映されるよう、設定タスクにて「restart httpd」という「handler」を呼び出しています。
handlerは共通で何度も使用するタスクを関数化し定義することが可能です。
また「handler」に定義された内容はプレイブックの各タスク最後に実行されます。

# vim common_roles/apache/handlers/main.yml

---

- name: restart httpd
service: name=httpd state=restarted
簡単ですが、プレイブック自体はこれで完成です。
このプレイブックをうまく利用できるよう変数を定義していきます。

3.変数の定義

変数ファイルは構成にのっとり変数値を定義していきます。
でも変数にしたからには、基本変数があり、環境やサーバに合わせて変更できるべきですよね。

まず基本変数を定義していきます。

# vim group_vars/all
---
httpd_installs:
- httpd
- httpd-tools
- mod_ssl
httpd_timeout: 60
httpd_serverlimit: 256
httpd_maxclients: 256
httpd_listen:
- '80'
- '443'
httpd_include:
- php.conf
- vhost_80.conf
- vhost_443.conf
httpd_user: apache
httpd_group: apache
httpd_directoryindex: 'index.html index.php'
httpd_default_charset: 'Off'
プレイブックも作成し、変数も定義したのでいよいよ実行していきます。

また、Ansibleはデフォルトでも変数を持っていますので注意しましょう。

# ansible -m setup <ホスト名>

4.実行

色々作成したパーツを組み合わせていきます。

まずプラグインとして利用できるように作成したプレイブックを本プレイブックにインクルードさせます。

# vim role/apache/tasks/main.yml
---

- incude: ../../../common_roles/apache/tasks/main.yml
同様にハンドラーもインクルードさせます
# vim role/apache/handlers/main.yml
---

- incude: ../../../common_roles/apache/handlers/main.yml
テンプレートファイルは実行されるプラグインプレイブックと同階層、またはレポジトリのルート階層が検索されますので
インクルードはできません(多分)。

少し手間ですがこのようにプラグインを多段階層にすることで環境に合わせ柔軟に、
かつプレイブックの修正を最小現に再利用可能です。

そしてAnsibleの実行ファイルを作成します。

# vim provisioning.yml
---

- name: Apache Settings
hosts: all
roles:
- apache
実行させるロールと、実行される環境・サーバを定義します。
ここで定義している環境値に合わせて読み込み変数も変えさせます。
今回はall、つまり基本変数を読み込むようにします。

実行対象を記述したファイルを準備し

# vim hosts/production
[webservers]
10.0.100.12

[dbservers]
[production:children]
webservers
dbservers


これで後は実行すれば完了ですね。

構文確認し
# ansible-playbook -i hosts/production provisioning.yml --syntax-check`
プレイブックを実行します。
# ansible-playbook -i hosts/production provisioning.yml -u ssh_user -k

他にたとえば、ホストの変数を個別に設定したい場合

# vim hosts_vars/10.0.100.12
---
httpd_timeout: 30
httpd_serverlimit: 256
httpd_maxclients: 256
グループ単位で変数を設定したい場合、今回でいうと「hosts/production」というファイル名に実行ホストにを記載していますので、この「production」というグループで定義可能です。

# vim group_vars/production
httpd_timeout: 180
httpd_serverlimit: 256
httpd_maxclients: 256
プレイブックの実行対象についても「provisioning.yml」の「hosts:」の記述で調整します。

変数の優先順位により、hosts変数優先され次にグループ、最後にallが読み込まれます。

プレイブック固定の変数を定義したい場合は

# vim role/apache/vars/main.yml
という記述もできますが、あんまり細分化しても煩雑になりそう。

細かい仕様についてはやはり本サイトを参考にした方がよいでしょう。

5.その他
Ansible実行環境の定義はデフォルトで「/etc」配下のファイルを見に行きますが、
プレイブック実行環境に合わせて変更したい場合やリモートログインユーザーを省略したい場合
ローカルに設定ファイルを定義することも可能です。

# vim ansible.cfg
[defaults]
log_path=/var/log/ansible.log
remote_user=root


なんか急ぎで走り書きしてしまたので、うまく動かないかもしれませんが
参考にして頂けたらと思います。
実際に使ってみて思ったのですが、グループ定義それに紐づける変数定義の階層構造が難しく
最初は結構苦労しました。
その辺は私的にはChefの方が分かりやすかったですね。
とはいえAnsibleはコードさえ書けばいいのでお手軽です。
ぜひ無理のないAnsibleを。


入門Ansible
入門Ansible
posted with amazlet at 15.01.18
(2014-07-30)
売り上げランキング: 2,315

0 コメント:

コメントを投稿