Ansibleとは
構成管理ツールです。他にはPuppetやChefなどがあります。Chefは書籍を買いつつもまったく手つかず・・・。というかアップデート頻度が激しすぎてまったくついていけず。
最近はFabricで環境を構築していました。FabricやCapistranoはいわゆるデプロイツールで、冪等性が保証されません。ただ頑張ってコード書けば冪等性を保証することができます。
Fabricで運用は回りますが、コードの保守がけっこう大変です、コードレビューやテストによって冪等性を保証する必要があるからです。そこでAnsibleならどうかなと試してみる次第。同じPythonなので学習コストも低く済みそうと予測しているのですが・・・。
本を買ったので
Amazonで初めてのAnsibleを購入しました。書籍の内容を沿ったりネットの情報を参考にしたりでメモしていこうかと思います。ざざっと読んだ雰囲気で言うと、オススメです。
Ansibleのインストール
pipで入れます
1 2 3 4 5 6 |
$ sudo pip install ansible $ ansible --version ansible 2.0.1.0 config file = configured module search path = Default w/o overrides |
AWSでターゲットマシンを用意、IPは「10.1.1.100」としました。
ターゲットにAnsibleで疎通確認するために、まずはinventory/hostsファイルを作成します。
1 2 |
$ mkdir inventory $ vi inventory/hosts |
記述はtargetグループにターゲットマシンのIPを入れるだけ
1 2 |
[targets] 10.1.1.100 |
ここで ansible ping で疎通を確認してみます。
1 2 3 4 5 6 |
$ ansible all -i inventory/hosts -m ping 10.1.1.100 | UNREACHABLE! => { "changed": false, "msg": "SSH encountered an unknown error during the connection. We recommend you re-run the command using -vvvv, which will enable SSH debugging output to help diagnose the issue", "unreachable": true } |
エラーになりました。SSHまわりでうまくいっていないようです。-vvvvをつけると詳細が確認できますが、答えを書くと秘密鍵を指定していないためにでているようです。コマンド名はpingだけどICMPではなくてSSHなのね・・。
というわけで秘密鍵を指定して再度実行。SUCCESSの文字が見えました。
1 2 3 4 5 6 |
$ ansible all -i inventory/hosts -m ping --privat e-key="~/nbus.pem" 10.1.1.100 | SUCCESS => { "changed": false, "ping": "pong" } |
Apacheをインストールしてみる(失敗)
Apacheをインストールするsite.ymlを作成してみました。
1 2 3 4 5 |
- hosts: 10.1.1.100 connection: local tasks: - name: install the latest version of Apache yum: name=httpd state=latest |
実行してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ ansible-playbook -i inventory/hosts site.yml PLAY *************************************************************************** TASK [setup] ******************************************************************* ok: [10.1.1.100] TASK [install the latest version of Apache] ************************************ fatal: [10.1.1.100]: FAILED! => {"changed": true, "failed": true, "msg": "You need to be root to perform this command.\n", "rc": 1, "results": ["Loaded plugins: priorities, update-motd, upgrade-helper\n"]} NO MORE HOSTS LEFT ************************************************************* to retry, use: --limit @site.retry PLAY RECAP ********************************************************************* 10.1.1.100 : ok=1 changed=0 unreachable=0 failed=1 |
rootで実行してないのでエラーとなっていますね。
1 2 3 4 5 6 |
- hosts: all sudo: yes connection: local tasks: - name: install the latest version of Apache yum: name=httpd state=latest |
sudo : yesでsudo実行してくれるようです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ ansible-playbook -i ~/ansible/inventory/hosts site.yml --private-key="~/nbus.pem" [DEPRECATION WARNING]: Instead of sudo/sudo_user, use become/become_user and make sure become_method is 'sudo' (default). This feature will be removed in a future release. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg. PLAY *************************************************************************** TASK [setup] ******************************************************************* ok: [10.1.1.100] TASK [install the latest version of Apache] ************************************ changed: [10.1.1.100] PLAY RECAP ********************************************************************* 10.1.1.100 : ok=2 changed=1 unreachable=0 failed=0 |
うまくいったようですね。sudo : yesは非推奨のもよう。別途調べましょうかね。
ターゲットサーバに資材が入っているか確認したところ、入っていない・・・!!ズゴーッ
というわけで今回確認できたのは疎通の部分まで、次回また調査します。