2014/02/04

ansible

かなり使い方安い。。。

python製

ーーーーーーーーーーーーーー
例:ansibleのインストール:

# yum install python-devel python-setuptools
# easy_install pip
# pip install ansible
ーーーーーーーーーーーーーー

★設定ファイル
/etc/ansible/ansible.cfg
/etc/ansible/hosts

★環境変数に追加する
$ echo "source /usr/local/src/ansible/hacking/env-setup" >> ~/.bash_profile

★ansible --version
 ansible --v デバッグ
 ansible-doc yum モジュールの説明
 ansible --help

★ansible all -i hosts -a "cat /etc/redhat-release" -k
allーー>すべてのホスト
-i 対象ホストファイル
-m モジュール名, --module-name
-k, --ask-pass
-a 直接コマンドを実行する

★インストール
ansible all -i hosts -m yum -a "name=httpd state=latest" -k

★削除
$ ansible all -m file -a "dest=/home/ansible/foo/ state=absent" -i hosts -k

★mkdir -p と同じで深い階層のディレクトリも一発で作成できました。
$ ansible all -m file -a "dest=/home/ansible/foo/bar/baz state=directory" -i hosts -k

★state に「link」を指定し、src にリンク元ファイルのパスを指定します。
$ ansible all -m file -a "src=/etc/httpd/conf/httpd.conf dest=/home/ansible/httpd.conf state=link" -i hosts -u root -k

★コピー
$ ansible all -m file -a "dest=/home/ansible/test.conf mode=600" -i hosts -k
★他
ansible all -s -i hosts -m command -a "chmod -R 775 /someone_sv"
ansible all -s -i hosts -m command -a "chown -R someone:someone /someone_sv"
ansible all -s -i hosts -m copy -a "src=./log4j.xml dest=/somewhere/log4j.xml"
ansible all -s -i hosts -m cron -a "minute=20 job=/some.sh name='test'"
ansible all -s -i hosts -m copy -a "src=./some.sh dest=/somewhere/some.sh owner=root group=root mode=755"

★Playbook
mysql.yml
 - hosts: all
    user: root
    vars:
        mysql_port: 3306
    handlers:
    - name: restart iptables
      service: name=iptables state=restarted
    tasks:
     - name: install mysql
        yum: name=mysql state=installed
        yum: name=$item state=installed
        with_items:
        - mysql
        - mysql-server
        - mysql-devel
     - name: insert iptables rule
      lineinfile: dest=/etc/sysconfig/iptables state=present regexp="{{ mysql_port }}"
                  insertafter="^:OUTPUT " line="-A INPUT -p tcp --dport {{ mysql_port }} -j ACCEPT"
   
   
    notify: restart iptables
    - include: redis.yml
      vars:
        a: a
        b: b
        c: c
        d: d
       
    ・redis.yml
     - name: install redis packages
       action: yum name=$item state=installed
       with_items:
        - ${libunwind}
        - ${libunwind_devel}
        - ${gperftools_libs}
       - ${redis}

    - name: start redis
    action: service name=redis state=started enabled=yes
                 
変数の参照
$var
${var}
{{ var }}
                 
実行:ansible-playbook mysql.yml -i hosts -k

★handlers
ーー>task の実行により何か変更が発生した場合のみ実行したい処理を定義するために用意されているのが handler です。
例えば、設定ファイルの変更が発生した場合のみ、サービスを再起動したい、といった事を実現するための仕組みです。
handler が実行されるタイミングは対象の task 実行後ではなく、 Playbook の最後になります。
また、複数の task から同じ handler が notify されていた場合でも一度だけしか実行されません。

★Role
include を更に便利にしたような仕組みとして Role というものが用意されています。
Role ではサーバの役割毎にディレクトリを分け、更にその下にセクション毎にディレクトリを分けた構造で Playbook を管理します
要するに、推奨されている規約に従ってディレクトリ構造を作成しておけば自動的にファイルが include される仕組みです。


mysql
├─hosts
├─site.yml
└─roles
    └─mysql
        ├─handlers
        │  └─main.yml
        ├─tasks
        │  └─main.yml
        ├─templates
        │  └─my.cnf.j2
        └─vars
            └─main.yml
roles/x/tasks/main.yml が存在すれば自動的に読み込まれる
roles/x/handlers/main.yml が存在すれば自動的に読み込まれる
roles/x/vars/main.yml が存在すれば自動的に読み込まれる
copy タスクで roles/x/files/ 以下のファイルはパスを指定せずに参照可能
script タスクで roles/x/files/ 以下のファイルはパスを指定せずに参照可能
template タスクで roles/x/templates/ 以下のファイルはパスを指定せずに参照可能


■The command module takes the command name followed by a list of space-delimited arguments.
The given command will be executed on all selected nodes.
It will not be processed through the shell, so variables like $HOME and operations like "<", ">", "|", and "&" will not work
(use the shell module if you need these features).