Ansibleを触ってみた

Ansibleを触ったのでメモ

Ansibleとは

エージェントレス型の構成管理ツール。エージェント型とエージェントレス型では以下のような違いがある。
◯エージェントレス型
管理対象のサーバにエージェントを入れる必要がない
管理対象のサーバへの接続情報が必要になる
 管理端末から構成反映の処理を行う必要がある
◯エージェント型
管理対象のサーバにエージェントを入れる必要がある
起動時などに自動で構成が適用される

複数の設定が異なるサーバを管理する場合は、管理用サーバを別で持てるエージェントレス型の方が扱いやすいような気がします。それからAnsibleはエージェント型のchefやpuppetより後発のため洗練されている部分がありますし、RedHatがAnsibleを買収したため今後も開発が続けられることが期待できます。

0.インストール環境準備

以下のvagrant環境にインストール

Vagrant.configure("2") do |config|

  config.vm.define :node1 do |node|
    node.vm.box = "geerlingguy/centos7"
    node.vm.network "forwarded_port", guest: 22, host: 2001, id: "ssh"
    node.vm.network "private_network", ip: "192.168.33.11"
  end

  config.vm.define :node2 do |node|
    node.vm.box = "geerlingguy/centos7"
    node.vm.network "forwarded_port", guest: 22, host: 2002, id: "ssh"
    node.vm.network "forwarded_port", guest: 80, host: 8000, id: "http"
    node.vm.network "private_network", ip: "192.168.33.12"
  end
end

ssh接続準備

管理用端末が管理対象の端末を操作する際にはsshプロトコルを使用するので、鍵を配置する等の事前準備は必要になると思います。

1.Ansibleインストール

yumを使ってインストールする

# vagrant ssh node1
# sudo yum install epel-release
# sudo yum install ansible

2.管理対象ホストの設定とAnsibleの疎通確認

管理対象ホストの設定

$ echo 192.168.33.12 > hosts

pingでの疎通確認

node1の方で実行
$ ansible -i hosts 192.168.33.12 -m ping

192.168.33.12 | success >> {    
    "changed": false,    
    "ping": "pong"    
}    

ansibleコマンドで連携対象サーバ上で任意のコマンドを実行する

$ ansible -i hosts 192.168.33.12 -a 'uname -r'
192.168.33.12 | success | rc=0 >>
2.6.32-431.el6.x86_64

任意のコマンドを実行

ansible -i hosts 192.168.33.12 -m yum -s -a name=telnet

ansible yumは以下でドキュメントを確認できる

$ ansible-doc yum

3.Playbookの作成から実行まで

Playbookの作成

# vi simple-playbook

---
- hosts: test-servers
  become: yes
  tasks:
    - name: be sure httpd is installed
      yum: name=httpd state=installed

    - name: be sure httpd is running and enabled
      service: name=httpd state=started enabled=yes

Playbookの文法チェック

ansible-playbookに–syntax-checkのオプションをつけて実行する

ansible-playbook -i hosts simple-playbook.yml --syntax-check

Playbookのタスク一覧を確認する

–list-tasksオプションをつけてplyabookのnameを一覧表示してタスクを確認

[vagrant@localhost ~]$ ansible-playbook -i hosts simple-playbook.yml --list-tasks

playbook: simple-playbook.yml

  play #1 (test-servers): test-servers  TAGS: []
    tasks:
      be sure httpd is installed    TAGS: []
      be sure httpd is running and enabled  TAGS: []

Playbookの実行

[vagrant@localhost ~]$ ansible-playbook -i hosts simple-playbook.yml

PLAY [test-servers] ************************************************************

TASK [setup] *******************************************************************
ok: [192.168.33.12]

TASK [be sure httpd is installed] **********************************************
changed: [192.168.33.12]

TASK [be sure httpd is running and enabled] ************************************
changed: [192.168.33.12]

PLAY RECAP *********************************************************************
192.168.33.12              : ok=3    changed=2    unreachable=0    failed=0

ansibleには冪等星性(ある操作を何度実行しても常に結果が同じになる)が備わっており、上記実行例ではchangedの部分が新しく実行された部分になるようです。これでnode2のサーバにPlaybookで指定した通りapacheがインストールされました。
node2内でhttpdが動作しているか確認

[vagrant@localhost ~]$ sudo systemctl status httpd

たったこれだけで、Apacheがインストールできました。chefはほとんど触ったことありませんが、それよりもシンプルで使いやすい気がします。

Playbook入門

yumを使う

tasks:
  - name: be sure httpd is installed
    yum: name=httpd state=installed

nameでインストール対象を指定する。state=installedはインスートールされているか確認し、されていなかったらインストールする。state=latestでは最新が入っているか確認し最新でなければインストールする。

コマンドを実行する

tasks:
  - name: disable selinux
    command: /sbin/setenforce 0

ファイルを編集する

文字列を置換する

tasks:
  - name: set selinux permisive
    replace: >
      dest=/etc/selinux/config
      regexp='SELINUX=enforcing'
      replace='SELINUX=disabled'

http://docs.ansible.com/ansible/replace_module.html

ホスト端末のファイルを送る

事前に転送するファイルを準備

echo hogehoge > copyFile
tasks:
  - name: copy test
    copy: >
      src=/home/vagrant/copyFile
      dest=/home/vagrant/copyFile

http://docs.ansible.com/ansible/copy_module.html