ようへいの日々精進XP

よかろうもん

docker でちょっとだけ試す Ansible

はじめに

  • 先日の飲み会で 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_configUsePAM 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"
}

おお、簡単。

yumzsh パッケージをインストール

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-checkplaybook のシンタックスをチェックする。

ansible-playbook -i hosts sample-playbook.yml --syntax-check

シンタックスに問題が無い場合には playbook: sample-playbook.yml と出力される。次に以下のように --list-tasksplaybook で実行されるタスクの確認を行う。

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 パッケージの差分を見てみたところ...特に変化は見られなかった。特別な操作を行っているわけではないので一概に言えないが AnsibleSSH だけが通っていれば基本的なこと(パッケージのインストール)は出来そう。

そうは言っても

chefAnsiblepuppetシェルスクリプトもそれぞれ一長一短あるものの、サーバー構築を自動化するという側面では同じだと思っている。ただAnsiblechefpuppet` はべき等性を担保する為の実装が施されている点、また使い慣れた各種言語で書けたり、モジュールや周辺ツールが揃っていて使っていて楽しい。どれがイイとか、どれが使いやすいとかは個人の好みなので好きなの選んで使えば良いと思ったりしながら今日は寝ます。

おやすみなさい。

*1:だと思っている

*2:この操作も Ansible で出来る