Ansible on OSX

Chefがゴツいというか大げさな感じがしてきたので、Ansibleにしようかなと。
ドキュメントは以下。
http://www.ansibleworks.com/docs/

感覚的にはcapistranoでシェルスクリプトとかコマンドをリモートに実行させたり、レシピを書いてゴニョゴニョできる感じなのかな。
そういうのわりとすき。

コマンドラインではなくブラウザからできそうな、AnsibleWorks AWXというのもある。
http://www.ansibleworks.com/ansibleworks-awx/

コマンドラインからやってみよう。

https://weluse.de/blog/installing-ansible-on-os-x.html
大体上記に書いてあるやり方でOSXに設定できるのですが、うまくいかないことがあるので以下。

pythonのバージョンは、ansibleを実行するOSX上は2.7
サーバー側は2.6以上でないとそのまま実行できないっぽい。
centos5とかだと2.4なので、以下をインストールしておく

remote$ yum install python-simplejson

sshの鍵認証でログインできるようにしておく。
別にパスワードでもいいみたいだけど、あまりないかな。

osxで作業。

> python --version
Python 2.7.5

> easy_install virtualenv
> virtualenv ansible-env
> source ansible-env/bin/activate
(ansible-env)> easy_install pip
(ansible-env)> pip install paramiko PyYAML jinja2
(ansible-env)> pip install ansible
(ansible-env)> export ANSIBLE_HOSTS=~/.ansible/hosts

準備完了。hostsを作成して実行先を書く。centosとかなら/etc/ansible/hostsでいいみたい。

(ansible-env)> vim ~/.ansible/hosts
localhost

[testserver]
192.168.100.5
192.168.100.6:22222
192.168.100.7:22222

[hoge]
hoge.runeleaf.jp

sshのポートが22以外ならそれも書く。
.ssh/configの設定をみてくれてると思ったのだけれど、微妙に見ていないところがある?
サーバーの実行ユーザーは、ansibleコマンドを実行するユーザーと合わせておくとよいかも。
ユーザーの指定もできる。

(ansible-env)> ansible
Usage: ansible <host-pattern> [options]

Options:
  -a MODULE_ARGS, --args=MODULE_ARGS
                        module arguments
  -k, --ask-pass        ask for SSH password
  -K, --ask-sudo-pass   ask for sudo password
  -B SECONDS, --background=SECONDS
                        run asynchronously, failing after X seconds
                        (default=N/A)
  -C, --check           don't make any changes, instead try to predict some of
                        the changes that may occur
  -c CONNECTION, --connection=CONNECTION
                        connection type to use (default=smart)
  -f FORKS, --forks=FORKS
                        specify number of parallel processes to use
                        (default=5)
  -h, --help            show this help message and exit
  -i INVENTORY, --inventory-file=INVENTORY
                        specify inventory host file
                        (default=/Users/kawashima/.ansible/hosts)
  -l SUBSET, --limit=SUBSET
                        further limit selected hosts to an additional pattern
  --list-hosts          dump out a list of hosts matching input pattern, does
                        not execute any modules!
  -m MODULE_NAME, --module-name=MODULE_NAME
                        module name to execute (default=command)
  -M MODULE_PATH, --module-path=MODULE_PATH
                        specify path(s) to module library
                        (default=/Users/kawashima/works/srv/ansible-
                        env/bin/../share/ansible/)
  -o, --one-line        condense output
  -P POLL_INTERVAL, --poll=POLL_INTERVAL
                        set the poll interval if using -B (default=15)
  --private-key=PRIVATE_KEY_FILE
                        use this file to authenticate the connection
  -s, --sudo            run operations with sudo (nopasswd)
  -U SUDO_USER, --sudo-user=SUDO_USER
                        desired sudo user (default=root)
  -T TIMEOUT, --timeout=TIMEOUT
                        override the SSH timeout in seconds (default=10)
  -t TREE, --tree=TREE  log output to this directory
  -u REMOTE_USER, --user=REMOTE_USER
                        connect as this user (default=kawashima)
  -v, --verbose         verbose mode (-vvv for more)
  --version             show program's version number and exit

pingモジュールを実行してみる。

(ansible-env)> ansible testserver -m ping
192.168.100.5 | success >> {
    "changed": false,
    "ping": "pong"
}

192.168.100.6 | success >> {
    "changed": false,
    "ping": "pong"
}

192.168.100.7 | success >> {
    "changed": false,
    "ping": "pong"
}

コマンド送ってみる。

(ansible-env)> ansible testserver -a "uptime"
192.168.100.5 | success | rc=0 >>
 14:07:20 up 35 days,  8:08,  1 user,  load average: 0.00, 0.00, 0.00

192.168.100.6 | success | rc=0 >>
 14:07:20 up 35 days,  8:48,  2 users,  load average: 0.00, 0.00, 0.00

192.168.100.7 | success | rc=0 >>
 14:06:50 up 141 days,  3:54,  1 user,  load average: 0.08, 0.08, 0.08

yum install vimしてみる。

(ansible-env)> ansible testserver -m yum -a "name=vim-enhanced state=installed"
192.168.100.5 | FAILED >> {
    "changed": true,
    "msg": "You need to be root to perform this command.\n",
    "rc": 1,
    "results": [
        ""
    ]
}

192.168.100.6 | success >> {
    "changed": false,
    "msg": "",
    "rc": 0,
    "results": [
        "vim-enhanced-2:7.2.411-1.8.el6.x86_64 providing vim is already installed"
    ]
}

192.168.100.7 | success >> {
    "changed": false,
    "msg": "",
    "rc": 0,
    "results": [
        "vim-enhanced-2:7.2.411-1.8.el6.x86_64 providing vim is already installed"
    ]
}

.6と.7にはインストールされてたみたいですが、.5にはなくてrootで実行しろ的な。

(ansible-env)> ansible testserver -m yum -a "name=vim-enhanced state=installed" -K
192.168.100.5 | success >> {
    "changed": true,
    "msg": "",
    "rc": 0,
    "results": [
        "\n================================================================================\n Package              Arch         Version                   Repository    Size\n================================================================================\nInstalling:\n vim-enhanced         i386         2:7.0.109-7.2.el5         base         1.2 M\n\nTransaction Summary\n================================================================================\nInstall       1 Package(s)\nUpgrade       0 Package(s)\n\nTotal download size: 1.2 M\n\nInstalled:\n  vim-enhanced.i386 2:7.0.109-7.2.el5                                           \n\n"
    ]
}

192.168.100.6 | success >> {
    "changed": false,
    "msg": "",
    "rc": 0,
    "results": [
        "vim-enhanced-2:7.2.411-1.8.el6.x86_64 providing vim is already installed"
    ]
}

192.168.100.7 | success >> {
    "changed": false,
    "msg": "",
    "rc": 0,
    "results": [
        "vim-enhanced-2:7.2.411-1.8.el6.x86_64 providing vim is already installed"
    ]
}

1台だけ実行したければ、testserverの部分を192.168.100.5にすればOK。
デフォルトで並列実行が5のようなので、もっと台数があるなら-fで指定する。

これら一連の作業を自動的に構成するのがplaybookと。
ヘルプはansible-playbook -hで、各モジュールのヘルプはansible-doc yumとかansible-doc commandとかで確認できる。

実行する。

(ansible-env)> ansible-playbook develop.yml -K -v

make && make installみたいにコンパイルしているところはモジュールにしてしまうのがいいのかな。

playbookの中身はこんな感じ。

Infrastructure as Code!

[追記]
Best Practicesみてちょっと変えてみたり。
https://github.com/runeleaf/ansible-playbook

広告