はじめに
- 先日の飲み会で
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` はべき等性を担保する為の実装が施されている点、また使い慣れた各種言語で書けたり、モジュールや周辺ツールが揃っていて使っていて楽しい。どれがイイとか、どれが使いやすいとかは個人の好みなので好きなの選んで使えば良いと思ったりしながら今日は寝ます。
おやすみなさい。