mac にAnsible をインストール

mac にAnsible をインストール

出先でも開発ができるように
仮想マシンに vagrant + virtualbox は入れたので
今回は Ansible をインストールします

これでサーバ構築や開発環境を簡単に作成できるようになります

まず
Homebrew を使えるようにします

つぎに
Homebrew で Ansible が使えるか確認します

これはターミナルを起動して行います

brew search ansible

すると結果が

homebrew/emacs/ansible-doc		homebrew/versions/ansible18
homebrew/versions/ansible14	homebrew/versions/ansible19

となります

つぎに brew info でパッケージの情報を調べます


brew info ansible

を実行すると


ansible: stable 1.9.3 (bottled), HEAD
Automate deployment, configuration, and upgrading
http://www.ansible.com/home
Not installed
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/ansible.rb
==> Dependencies
Required: libyaml ✘, openssl ✘

という結果になり、


ansible: stable 1.9.3 

の結果から安定版は1.9.3 ということがわかります

これで情報が得られたので

つぎに brew install で ansible をインストールします


brew install ansible

これでインストールされているかを確認するには
Ansible のバージョンを確認します
[she]]
ansible —version
[/shell]

今回は結果として 1.9.3 となりました

ansible 1.9.3
  configured module search path = None

Ansible wait_for

Ansible wait_for

wait_for モジュールを使うと
port が開くまでとか
ファイルが作成されるまで
という条件での動作設定ができる

使い道としては
ssh が使えるようになるまで、とか
インストールログで complete が表示されるまで
というように設定することになる

もし、動作ではなくて時間だけ指定するのなら
command モジュールで sleep を指定する

tasks:
-name: 8000ポートが開くま10秒間隔でチェック
wait_for: port=8000 delay=10

-name: /var/log/foo.log が作成されるまで
wait_for: path=/var/log/foo.log

-name: lock ファイルが消えるまで
wait_for: path=/var/lock/file.lock state=absent

-name: install.log中に “completed”という文字が現れるまで
wait_for: path=/var/foo/install.log search_regex=completed

これらを元にメモすると
ファイルを指定するときには
wait_for: path=対象のパス
で指定

そして、対象ファイルの削除を条件にするなら
state=absent
を指定

検索する文字列を条件にするのなら
search_regex=対象文字列

ポートを間隔で監視したいのなら
port=対象ポート番号 delay=間隔秒数

というかんじになる

playbook の解説メモ

playbook の解説メモ

playbook は大きくわけて3つに別れます

tartget セクション
これは実行対象の設定

vars セクション
これは変数の設定

tasks セクション
これは実行する taskの設定

target セクションは
hosts: 対象ホスト
remote_user: 対象ユーザ
sudo: sudo を使うならyes 使わないのなら no

の部分になります

vars セクションでは
変数の設定をしますが
vars_prompt:
を使うと
変数の値をユーザに入力させることができます
これはユーザ名とかパスワードを入力するときに使えます

実験として

vim add.yml

として内容を

    ---
    - hosts: all
      sudo: yes
    #  vars:
    #    username: snowpool
      vars_prompt:
        username: "Enter username"
      tasks:
        - name: add a new user
          user: name={{username}}

として

ansible-playbook add.yml -K

とするとユーザ名を入力するようになります

sudo password: 
Enter username: : 

となり

入力したユーザが追加されます

vagrant ではないので、実行時に -K オプションをつけて
sudo パスワードを入力するようにします

なお、
vars:

vars_prompt:
で設定した変数を使うときには
変数名を
{{}}で囲みます

今回なら
username が変数名なので
{{username}}
となります

ansible 設定ファイルの作成

ansible 設定ファイルの作成

毎回 -i オプションをつけるというのは
間違いやすいので
設定ファイルを作成し、指定せず実行できるようにします

vim ansible.cfg

でファイルを作ります

[defaults]
hostfile = ./hosts

として保存します

前回は

ansible all -i hosts -m command -a "uptime"

としましたが、
今回は -i hosts を省略して実行してみます

 ansible all -m command -a "uptime"

これで実行しても同じ結果になります

これで簡単にできるようになったので
次は playbook と呼ばれる処理を記述したものを作成
これを実行するようにします

今回はコマンドを実行しましたが
Ansible の場合
コマンドではなく
モジュールとよばれる動作をまとめたものを使えます

そして、このモジュールは
task
というモジュールに引数をまとめた設定として作成できます

playbook とは
このtask つまり行う処理をまとめたものです

コマンドをまとめていろいろ行う
シェルスクリプトのようなものです

この playbook は YAML 形式で書きます

YAML の書き方の詳細については
プログラマーのための YAML 入門 (初級編)


ドットインストールのYAML入門

が参考になります

書き方メモとしては
行頭に – を書くとシーケンスという配列になり

空白2つぐらいでインデントによるデータ階層構造になります
インデントにtab は使えないので注意

あとはマッピングといって半角スペースでインデントすると
キーと値のペアのハッシュになります

コメントアウトは # になりますので
このあたりはシェルスクリプトに似てます

playbook の項目としては
hosts: 対象ホスト名

sudo: 管理者権限について yes no を指定
必要なら yes

remote_user
実行ユーザ名

vars:
変数の指定

tasks: モジュールの指定
ここへ -name: をつけることで task の名前を指定できます
どちらかというと git のコメントのようなものです

モジュールについては
公式ドキュメントを見ます
http://docs.ansible.com/ansible/modules_by_category.html

この中からやりたいことに対応したモジュールを使います

例えば、
AnsibleをUbuntuのローカルで使う

のように git をインストールしたいのなら

apt – Manages apt-packages

を使用します

今回の場合
apt: pkg=

パッケージのビルド依存関係をインストール
となります

とりあえず git のインストールをしてみます

vim git.yml

として
内容を

---
 - hosts: develop
   user: snowpool
   tasks:
     - name: "apt-get install git"
       apt: pkg=git
       sudo: yes

として保存します

playbook を実行するには
ansible-playbook コマンドを使います

ansible-playbook git.yml -K

とすると
作成した git.yml を実行します

このとき -K をオプションでつけると
sudoのパスワードを要求するようになります
このKは大文字です
これを忘れると、そのまま止まったままになってしまうので
注意が必要です

なお、ansible.cfg で hosts ファイルを指定しているので
インベントリファイルの指定は必要ありません