はじめに
- 先日の飲み会で
Ansible
イイですよねって言われたので試してみる - あと、「
Ansible
って SSH さえ通れば設定が出来るって聞いたんだけどホントかな?」って酒の肴になっていたので確認してみる - 個人的には
chef
が好きだがAnsible
も興味がある
参考
準備
docker run
centos コンテナを利用する。
docker pull centos docker run -t -i -p 22 centos /bin/bash
とりあえずコンテナにログイン出来たら以下のように SSH サーバーをインストールする。
yum install -y openssh-server yum install passwd yum install sudo
また、root
パスワードの設定を行ったり sshd_config
の UsePAM no
を設定したりしてとりあえずコンテナに SSH
でアクセス出来るように準備する。
鍵交換と .ssh/config の設定
今回はとりあえず試すだけなので接続先(設定先)コンテナの root
ユーザーに公開鍵の設置と .ssh/config
の設定を行う。
Host ${docker コンテナ IP} user root
アンシボウ
こちら のチュートリアルに従って順を追って試す。試すにあたって以下のように接続先(設定先)の IP アドレスを記載したインベントリファイルを用意する。
cd ~/tmp/ mkdir ansible_tutorial docker inspect -format="{{.NetworkSettings.IPAddress}}" ${コンテナ ID} > hosts
ping
早速、以下のように ping
モジュールを利用してみる。
ansible -i hosts ${コンテナ IP} -m ping
以下のようにレスポンスが返ってくる。
${コンテナ IP} | success >> { "changed": false, "ping": "pong" }
おお、簡単。
yum で zsh パッケージをインストール
ansible -i hosts ${コンテナ IP} -m yum -s -a name=zsh
以下のようにレスポンスが返ってくる。
${コンテナ IP} | success >> { "changed": true, "msg": "", "rc": 0, "results": [ "Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\n * base: www.ftp.ne.jp\n * extras: www.ftp.ne.jp\n * updates: www.ftp.ne.jp\nSetting up Install Process\nResolving Dependencies\n--> Running transaction check\n---> Package zsh.x86_64 0:4.3.10-7.el6 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n============================================== ==================================\n Package Arch Version Repository Size\n================================================================================\nInstalling:\n zsh x86_64 4.3.10-7.el6 base 2.1 M\n\nTransaction Summary\n================================================================================\nInstall 1 Package(s)\n\nTotal download size: 2.1 M\nInstalled size: 4.8 M\nDownloading Packages:\nRunning rpm_check_debug\nRunning Transaction Test\nTransaction Test Succeeded\nRunning Transaction\n\r Installing : zsh-4.3.10-7.el6.x86_64 1/1 \n\r Verifying : zsh-4.3.10-7.el6.x86_64 1/1 \n\nInstalled:\n zsh.x86_64 0:4.3.10-7.el6 \n\nComplete!\n" ] }
べき等を試してみたいのでもう一度実行すると以下のように zsh
はインストール済みと判断される。
${コンテナ IP} | success >> { "changed": false, "msg": "", "rc": 0, "results": [ "zsh-4.3.10-7.el6.x86_64 providing zsh is already installed" ] }
playboy ならぬ playbook
以下のようにインベントリファイルを作成する。
[mysql-server] ${コンテナ IP}
以下のような YAML
形式の playbook
ファイルを作成する。
--- - hosts: mysql-server sudo: yes tasks: - name: mysql-server install yum: name=mysql-server state=installed - name: mysql-server is running and enabled service: name=mysqld state=running enabled=yes
作成したら適当な名前(sample-playbook.yml
)で保存する。
まずは --syntax-check
で playbook
のシンタックスをチェックする。
ansible-playbook -i hosts sample-playbook.yml --syntax-check
シンタックスに問題が無い場合には playbook: sample-playbook.yml
と出力される。次に以下のように --list-tasks
で playbook
で実行されるタスクの確認を行う。
ansible-playbook -i hosts sample-playbook.yml --list-tasks
以下のように出力される。
playbook: sample-playbook.yml play #1 (mysql-server): mysql-server install mysqld is running and enabled
そして、いよいよサーバーに適用する為、以下のように実行する。
ansible-playbook -i hosts sample-playbook.yml
以下のように出力された。
PLAY [mysql-server] *********************************************************** GATHERING FACTS *************************************************************** ok: [${コンテナ IP}] TASK: [mysql-server install] ************************************************** ok: [${コンテナ IP}] TASK: [mysql-server is running and enabled] *********************************** failed: [${コンテナ IP}] => {"failed": true} msg: /etc/init.d/mysqld: line 23: /etc/sysconfig/network: No such file or directory FATAL: all hosts have already failed -- aborting PLAY RECAP ******************************************************************** to retry, use: --limit @/home/kappa/sample-playbook.retry ${コンテナ IP} : ok=2 changed=0 unreachable=0 failed=1
ガビーン。そう、docker コンテナの CentOS
あるある*1なので、コンテナ側で以下のように実行する。*2
echo "NETWORKING=yes" >/etc/sysconfig/network
実行したあとに再度....
ansible-playbook -i hosts sample-playbook.yml
以下のように FATAL
も無く終了。
PLAY [mysql-server] *********************************************************** GATHERING FACTS *************************************************************** ok: [${コンテナ IP}] TASK: [mysql-server install] ************************************************** ok: [${コンテナ IP}] TASK: [mysql-server is running and enabled] *********************************** changed: [${コンテナ IP}] PLAY RECAP ******************************************************************** ${コンテナ IP} : ok=3 changed=1 unreachable=0 failed=0
全段階で mysql-server
のインストールは終了していた為、その部分はスキップされ mysqld
のサービス起動と自動起動の有効化だけが行われた。
おお、とてもシンプルで簡単。
最後に
SSH だけが使えれば...
設定先のコンテナで Ansible
を使いはじめる前と後で python
パッケージの差分を見てみたところ...特に変化は見られなかった。特別な操作を行っているわけではないので一概に言えないが Ansible
は SSH
だけが通っていれば基本的なこと(パッケージのインストール)は出来そう。
そうは言っても
chef
も Ansible
も puppet
も シェルスクリプトもそれぞれ一長一短あるものの、サーバー構築を自動化するという側面では同じだと思っている。ただ
Ansibleや
chefや
puppet` はべき等性を担保する為の実装が施されている点、また使い慣れた各種言語で書けたり、モジュールや周辺ツールが揃っていて使っていて楽しい。どれがイイとか、どれが使いやすいとかは個人の好みなので好きなの選んで使えば良いと思ったりしながら今日は寝ます。
おやすみなさい。