概要
今更 Ansible に触ったのでメモしておきます
Playbook という YAML で記載するレシピ的なものを作ってみるところまで実施してみました
環境
- CentOS 6.7 64bit
- Ansible 1.9.4
Ansible のインストール
EPEL が使えるのであれば yum でインストールすることができます
今回は yum を使いました
- yum -y install ansible
- ansible –version
1.9.4
となれば OK です
Inventory ファイルを編集する
Inventory ファイルはいわゆる hosts ファイルです
Ansible 用の hosts ファイルで実行するホストを定義します
- vim /etc/ansible/hosts
に Ansible を実行するホストを定義します
デフォルトだと「alpha.example.org」やら「beta.example.org」やらが定義されていてサンプルを流すと絶対エラーになるので適当に削除してください
とりあえずサンプルを動作させるので同じホストでも記載しておいてください
今回は「192.168.1.10」に実行するものとします
192.168.1.10
定義はグループにわけて記載したり、正規表現的なものを使って複数サーバを定義することもできます
ping モジュールを実行する
Inventory ファイルに記載したサーバに ping モジュールというデフォルトで用意されているモジュールを実行してみます
- ansible all -m ping
で実行することができます
定義サーバにはデフォルトだとノンパスでログインしようとします
公開鍵や ID/PW 認証を使って実行することもできますが、とりあえず今回は素直にノンパス設定をしました
実行に成功すると以下のように表示されます
192.168.1.10 | success >> {
“changed”: false,
“ping”: “pong”
}
失敗する場合は対象のサーバに対してちゃんと SSH できるか確認する他、ping モジュールはその名の通り ping を投げるので、ping が届くか確認してください
また、デフォルトだと SSH のポートが 22 番なのでそれ以外でアクセスしたい場合は Inventory ファイルに hostname:port
形式で記載してください
独自の Playbook を定義する
所謂レシピになります
YAML で記載することができます
- cd work/ansible
- vim sample_pb.yml
---
- hosts: all
user: root
tasks:
- name: This is a test playbook
command: /bin/hostname
- name: This is a test playbook 2
command: /bin/echo 'hoge'
hosts:
で実行する対象のグループまたはホストを指定します
とりあえず今回は全台 ( 1 台 ) に実行するので all にしています
user:
は実行するユーザを指定します
別のユーザで SSH ログインする場合は、そのユーザを指定してください
また、そのユーザは先程設定したように SSH でノンパスログインできるようにしておいてください
tasks:
にタスクを記載します
まず name:
で実行するタスクの名前を指定します
ここには自然言語で好きな名前を指定することができます
そして実際に実行するコマンドを記載します
今回は command:
というデフォルトで用意されているモジュールを使いました
これは指定されたコマンドを実行するモジュールになります
chef でいうところの execute
や bash
リソースみたいな感じです
記載できたら実行してみましょう
- ansible-playbook sample_pb.yml
で実行できます
実行するとなぜか cowsay
が結果を表示してくれます
____________
< PLAY [all] >
------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
_________________
< GATHERING FACTS >
-----------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
ok: [192.168.1.10]
_______________________________
< TASK: This is a test playbook >
-------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
changed: [192.168.1.10]
_________________________________
< TASK: This is a test playbook 2 >
---------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
changed: [192.168.1.10]
____________
< PLAY RECAP >
------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
192.168.1.10 : ok=3 changed=2 unreachable=0 failed=0
結果が unreachable や failed にならなければ問題なく実行できたことになります
command:
だと毎回 changed になってしまうので、changed になるのが嫌な場合は changed_when
というモジュールを使って制御するみたいです
最後に
とりあえず今回は以上です
触ってみた感覚だと確かに chef よりは簡単に書ける感じはありました
ただ、ansible も大規模になると attributes や template, file, environment みたいな概念が出てくるんじゃないかなと思いました
chef は Rack タスクなので Ruby のコードもガンガン書けましたが、Ansible は YAML なので、ちょっと工夫しないと Python は使えない感じでした
あと、ちょっと今後引き続き調査したいなと思う点をメモしておきます
- 実行したコマンドの結果を cowsay が表示してくれないか
- 鍵認証で使うことはできないか
- Python と組み合わせて使う
たぶんと言うか絶対全部実現できると思いますが、自分的に未調査なので
Tips
- ID/PW を入力して実行する方法
ansible all -m ping --ask-pass
- 全ホストに任意のコマンドを実行する方法
- ansible all -a ‘hostname’
- cowsay を抑制する方法
- export ANSIBLE_NOCOWS=yes
- cowsay をランダムの動物にする方法
- export ANSIBLE_COW_SELECTION=random
0 件のコメント:
コメントを投稿