2014年1月1日水曜日

Ansible導入(前編)

2013年からの宿題なのか2014年のお年玉なのか不明だが、確定申告用の領収書類を持ち帰るのを忘れたので大晦日に手持ち無沙汰になっていたのでやってた。後編あるかは不明

Ansibleを使ってできること

  • サーバの構成管理。Chefと同じ目的で使うものという認識
  • 設定として記述したパッケージ・ソフトウェアを簡単に導入できる
  • 冪等性を保ちながらサーバの構築を繰り返し行うことができる(使い方によっては当然冪等性を損なうこともできるけど)

インストール

AnsibleWorksのサイトにあるので参照。たとえば次の方法がある
  • GitHubレポジトリからcloneしてインストール
  • pipインストール
  • yum, apt

ローカルMacにpipが既に入っていたので、pipインストール
$ pip install paramiko PyYAML jinja2 httplib2 
$ sudo pip install ansible

Ansibleで管理対象となるホスト設定を作成

# /etc/ansible/hosts
[experiments]
dev ansible_ssh_port=<ssh port> ansible_ssh_host=<your hostname> ansible_ssh_user=<ssh user>
  • experimentsはAnsible管理のホストをグルーピングしてる
  • devはサーバのニックネーム

Ansibleの動作設定を作成

以降のコマンド実行の際にControlPathが長過ぎて怒られるのを予防。デフォルトは control_path=%(directory)s/ansible-ssh-%%h-%%p-%%r らしいがこれだと長過ぎるみたい。
# /etc/ansible/ansible.cfg
[ssh_connection]
control_path=/tmp/ansible-ssh-%%h-%%p-%%r

テスト

$ /usr/local/share/python/ansible all -m ping
dev | success >> {
    "changed": false,
    "ping": "pong"
}

OKそう。さらにテストしてみる
$ /usr/local/share/python/ansible all -a "/bin/echo hello"
dev | success | rc=0 >>
hello

OKですな

幾つかコマンドサンプル

$ /usr/local/share/python/ansible dev -m copy -a "src=/etc/hosts dest=/tmp/hosts"
#=> ローカルの/etc/hostsをdevの/tmp/へコピー

$ /usr/local/share/python/ansible dev -a "/sbin/reboot" —sudo
#=> devを再起動
$ /usr/local/share/python/ansible -m yum -a 'name=mysql-server state=installed’ dev --sudo#=> devでmysql-serverをyumインストール

しかし、いちいちコマンド打つの面倒くさい。そのため、実行する処理(task)をまとめて記述したもの(Playbook)を使う。

# /etc/ansible/builds_server.yml 
- hosts: experiments
  remote_user: ec2-user
  sudo: no
  tasks:
    - name: test connection
      ping:
    - include: tasks/begins_pkg.yml

# /etc/ansible/tasks/begins_pkg.yml
- name: ensure all packages are at the latest version
  yum: name=* state=latest
  sudo: yes
- name: ensure git is installed
  yum: name=git state=latest
  sudo: yes
- name: ensure apache is running
  service: name=httpd state=started
  sudo: yes

上記を用意した上で、次のコマンドを実行する
$ /usr/local/share/python/ansible-playbook /etc/ansible/builds_server.yml

PLAY [experiments] ************************************************************
GATHERING FACTS ***************************************************************
ok: [dev]
TASK: [test connection] *******************************************************
ok: [dev]
TASK: [ensure all packages are at the latest version] *************************
ok: [dev]
TASK: [ensure git is installed] ***********************************************
ok: [dev]
TASK: [ensure apache is running] **********************************************
ok: [dev]
PLAY RECAP ********************************************************************
dev                        : ok=5    changed=0    unreachable=0    failed=0   

こんな感じで実行結果が出力される。言うまでもないが、

builds_server.ymlで次を記述

  • pingテスト
  • begins_pkg.ymlをインクルード

begins_pkg.ymlで次を記述

  • yum -y update
  • 最新のgitパッケージをyumインストール
  • apacheを起動する(パッケージが無ければインストール)

後編では次のものをする予定
  • EC2イメージからのインスタンスローンチ(Elastic IP貼り付け等も併せて)
  • rbenvベースのrubyインストール


0 件のコメント:

コメントを投稿