2017年3月10日金曜日

Ansible 超入門

概要

今更 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 でいうところの executebash リソースみたいな感じです

記載できたら実行してみましょう

  • 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 件のコメント:

コメントを投稿