Aimingインフラチームを支え(てくれてい)る技術と設計(2/3)
- 2017.01.26
- インフラ
この記事を読むのに使用する時間の目安 = 15〜20分
インフラチームの小熊です。
前回(弊社インフラチームが参考にして実践しているITサービスフレームワークや利用しているOSS, Tool類の紹介をさせていただきました。)から大分空いてしまいましたが、今回は、そのツールやOSSのTips をいくつかご紹介したいと思います。
tl;dr
Ansible は、vim-ansible-yaml を入れて、CI に放り込みつつ Serverspec等で TDD / TDI すれば良い感じだと思います。
その他のAnsible tips やVagrant について書きました。
良さそうなところがあったら参考にしてみてください。
Ansible Tips
構成管理ツールは、主に Ansible が扱われています。
(AnsibleでContainer操作も可能ですが、今回Containerの話はしません)
そんなAnsible のTipsや、最近Version 2.2の注意点をいくつか紹介したいと思います。
ツールの紹介
素晴らしいツールの紹介です!
すでに世間でよく出回っている情報ですので、知っている人は読み飛ばしてください。
- vim-ansible-yaml
- これを入れておけば、早く書けます
- はい、私はvimmerです
- ansible-console
- module の単体テスト、動作確認が出来ます
- e.g.) 例えばvagrantの場合は以下でインタラクティブシェルが起動します
ansible-console -i .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory
- 上記でインタラクティブシェルに入ってから
help
もしくは
?
と打つとhelpが参照出来ます
- このhelpを使うことでも簡単なansible-doc のような役割も満せます
- 例
koguma@all (1)[f:5]$ help datadog_event Posts events to DataDog service Parameters: date_happened POSIX timestamp of the event. alert_type Type of alert. title The event title. text The body of the event. tags Comma separated list of tags to apply to the event. app_key Your DataDog app key. priority The priority of the event. aggregation_key An arbitrary string to use for aggregation. api_key Your DataDog API key. validate_certs If C(no), SSL certificates will not be validated. This should only be used on personally controlled sites using self-signed certificates.
- その他の使い方はこちらの記事を参考に http://qiita.com/yunano/items/faba4f3330594e41246b
- e.g.) 例えばvagrantの場合は以下でインタラクティブシェルが起動します
- module の単体テスト、動作確認が出来ます
- ansible-doc
- AnsibleのdocumentがCLI上で開けます
- 私はvimやatom上で利用しています
- AnsibleのdocumentがCLI上で開けます
- ansible-playbook-debugger
- 私は使っていませんが、一応debuggerもあります
version 2の注意点
- 最新2.2について
- check mode の対応が変わりました
- always_run は deprecation となり、無くなる予定だそうです
[DEPRECATION WARNING]: always_run is deprecated. Use check_mode = no instead..
と出ます
- 変わりに check_mode: no を使うようにしましょう
- always_run は deprecation となり、無くなる予定だそうです
- group_vars/等の読み込みが変わりました
- .yml or .yaml の拡張子が必要になりました
- 全てのfileに拡張子をつけるようにした方が良いようです
- service module
- systemd の扱いが変わりました
- SysVinit scriptのものが起動できなくなっていました
- 2.2 からsystemd module ができていました
- http://docs.ansible.com/ansible/systemd_module.html
- 特にsystemctl daemon-reload などが必要な場合は、こちらを使うようにした方が良いでしょう
- sleep option を受け付けなくなりました
- systemd の扱いが変わりました
- include の扱いが変わりました
- include を使う上で変数の扱い方によっては、それら変数を Dynamic に読み込ませるかStaticに読み込ませるか選択が必要になりました
- 詳細は以下を確認してください
- 原因
- 関連
- これは、version 1のころから抱えている問題とのことで、過去にはincludeでwith_items などloop が使えなくなったり復活したりしていました
- 解決策
-
static: <yes|no|true|false>
を使用する
- 今までinclude でDynamic に変数が読み込まれていて問題がなかった場合は、 `static: no` を入れてみてください
- ただし、include先でhandlersを使用する場合は、staticでないとnotifyによるトリガーが実行されても動きませんので注意してください
- 詳細は上記のlink先にある公式docを参照してください
- [補足] ansible.cfg に task_includes_static等で設定する方法も追加されましたが、 false or no で全体的にstatic: no といった意味の挙動にはならないようです(2.2.0.0時点で確認)
-
- check mode の対応が変わりました
whenで、値をまとめたOR判定をする
when: ansible_env.TARGET_ENV == 'test' or ansible_env.TARGET_ENV == 'development'
と書くのは長いので、下記の様に in を使います。
例 (testとdevelopmentを環境変数 TARGET_ENVで、受け取って判定をする。)
environment: - TARGET_ENV: "{{ lookup('env','TARGET_ENV') }}" tasks: - debug: var=ansible_env.TARGET_ENV when: ansible_env.TARGET_ENV in [ 'test', 'development' ]"
動作確認 (test, developmentそして、skip判定確認のためのhogeをそれぞれ順番に環境変数TARGET_ENVに入れてdebug)
% for ENV in test development hoge;do TARGET_ENV=${ENV} vagrant provision test | grep -A 4 'TASK \[debug\]';done TASK [debug] ******************************************************************* task path: /Users/koguma/work/repos/infra-ext/provision/ansible/playbooks/test.yml:20 ok: [test] => { "ansible_env.TARGET_ENV": "test" } TASK [debug] ******************************************************************* task path: /Users/koguma/work/repos/infra-ext/provision/ansible/playbooks/test.yml:20 ok: [test] => { "ansible_env.TARGET_ENV": "development" } TASK [debug] ******************************************************************* task path: /Users/koguma/work/repos/infra-ext/provision/ansible/playbooks/test.yml:20 skipping: [test] => { "changed": false, "skip_reason": "Conditional check failed",
TARGET_ENV=hoge だけ
"changed": false, "skip_reason": "Conditional check failed",
になったので正常に判定ができています。
Testについて
- ansible-spec というtoolが用意されています
しかし、Ansible 以外のtoolとも連動させたインフラテストを行っていきたいので Serverspec と Infrataster を利用するように絞りました- Serverspec
- TDD / TDI全般 で利用
- Infrataster
- deploy後のBDD で利用
- Serverspec
これらについて細かいことは次回投稿する予定です。
必ず、Ansible でServerspecが実行されるようにしている
- playbookに書いています。
- post_tasks を使うと毎回 Serverspec でテストしてくれます
これで 半ば強制的に TDI を実現するようにしています- 例
- post_tasks を使うと毎回 Serverspec でテストしてくれます
Ansible playbookからの強制Test実行の注意点としては
事前にsshでアクセスできるようにしておく必要があります。(vagrant sshではなく)
[補足] Vagrant 側で用意されている vagrant ssh-config をplaybook側で実行し、~/.ssh/configに書き込むことも考えました。
しかし vagrant ssh-config に初期化 = ~/.ssh/config をワイプしてくれる機能がないので、各環境で用意したり考慮していくのも面倒だと思えました。 (Jenkinsなどでvm を作ったり消したりしながらテストをバンバン回していく環境など)
そこで、環境構築手順の簡略化も考慮し、Vagrantfile にssh pub auth 登録の処理を書いてしまっています。
playbooksが煩雑になるのを避ける
通常のansibleはplaybooksを直下に横並びで置くため、多くなってくると見づらくなる問題があります。
我々のチームの特定Projectでは、良いか悪いかは別としてplaybooks が煩雑にならないように playbooks dir 配下におけるようにしています。
具体的には以下のような構成です。
├── playbooks │ ├── addusr_ssh.yml │ ├── disable_selinux.yml │ ├── gce-instance-provision_and_init.yml │ ├── gce-lb-provision.yml │ ├── instance-provision_and_init.yml │ ├── monitoring-tool.yml │ ├── td-agent.yml │ ├── test.yml │ ├── vuls.yml │ └── wordpress.yml ├── plugins │ └── inventory ├── roles │ ├── add_ssh_user # ..<snip>
通常は以下の構成になります。
https://docs.ansible.com/ansible/playbooks_best_practices.html#directory-layout
どうやっているか
- Custom role path という機能を使っている
- ansible.cfg に以下の設定をしています
[defaults] roles_path = roles
- ansible.cfg に以下の設定をしています
- group_vars, host_varsを対応させる
- 残念ながらgroup_vars, host_vars等の読み込みにはansible.cfgは対応していません
- Custom role path 機能はあるけど、Custom {group,host}_vars path はありません
- それらの解決策として
以下の初期load 用roleを作ってそれを最初のroleとして実行するようにしています
Ansible galaxy でも落とせるようにしてあります。
ansible-galaxy install aim-oguma.init-for-integrated
- 残念ながらgroup_vars, host_vars等の読み込みにはansible.cfgは対応していません
1/30追記: ansible-init-for-integrated に一部不備があったので訂正しました。
Ansibleの小ネタ
普段の運用でも、ansibleをよく使っています。
その中でちょっとしたネタ的な使い方を紹介します。
クラスタオペレーションツールとしてリソースを監視する例 (CPU使用率を表示)
[devinfra@test-festa ansible]$ ansible -i inventory all -m shell -a "sar -u ALL | awk 'NR==6,p{if(m<\$4) m=\$4} END{print m}'" test-festa-slave2 | SUCCESS | rc=0 << 0.44 test-festa-master | SUCCESS | rc=0 << 0.39 test-festa-slave1 | SUCCESS | rc=0 << 0.37
Vagrant
下記に内容を示します
具体的なcodeは纏めて記載します。
For Ansible provision
引数で各playbook 名を指定して、それで動くようにしています。
各種playbookがそのまま同じVagrantfileで利用可能なようにしています。
@vm_name = ARGV[1]
playbook = {
:disable_selinux => "playbooks/disable_selinux.yml",
:target => "playbooks/#{@vm_name}.yml"
}
Vagrant の高速化
virtioを使うようにしたり
vb.customize ["modifyvm", :id, "--nictype1", "virtio"]
vb.customize ["modifyvm", :id, "--nictype2", "virtio"]
local repositoryを使っています (ちなみにvagrant-cachierは問題起こすので現在利用停止中)
社内にLocal yum repositories を立てていて、社内いるときだけそれを使うように動的な処理を入れています。
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# 社内の場合はLocal repositoryに向けて高速化する
if Network.global_ipaddr.inhouse?
config.vm.provision :shell, :inline => <<-EOT
sudo sh -c "echo '#{MYCORP_LOCAL_REPO}' > #{MYCORP_LOCAL_REPOFILE}"
EOT
else
config.vm.provision :shell, :inline => <<-EOT
if [ -f #{MYCORP_LOCAL_REPOFILE} ];then
rm -f #{MYCORP_LOCAL_REPOFILE}
sudo yum clean all
sudo yum repolist
fi
EOT
end
Vagrantfile
Vagrant Cloud を利用しているので vagrant login はしておいてください。
このままでは動きませんが、playbookを用意したり、Vagrantfile に<>で書かれている部分を適宜設定していただければ利用出来るはずです。
最後に
こちらでのご紹介が、誰かのお役に立てれれば幸いです。
今回はここまでです。
次回は CI (Jenkins) や TDI tool (Serverspec), BDD tool (Infrataster)についてや、重要な脆弱性診断が行えるツール vuls について近日公開したいと思います。
-
前の記事
Ruby関西勉強会に会場を提供しました #rubykansai 2017.01.18
-
次の記事
Aiming飲み会 #5 を開催しました 2017.02.06