かなり使い方安い。。。
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).