Ansible

  • 投稿者:
  • 投稿カテゴリー:ansible

概要

Ansibleについてやってみた
http://dotinstall.com/lessons/basic_ansible

Ansibleとは

サーバの構成管理ツール。サーバに設定したファイルの修正や管理ができる
agentなどクライアント管理にあたり特別なツールが必要ない。また並列で実行でき、高速に動作する
Pythonがインストールされており、鍵認証でのSSHが利用できればOK
Enterpriseツールやサポートなどもあり、有料

構成

2014-11-13_232015
ホストにはAnsibleをインストールする
Inventory:どのサーバを管理するか記載する
ansible.cfg:ansibleの全体的な設定を記載する
Playbook:どのような構成とするかを記載する

インストール

root@hostname:/home/shimizu# aptitude install python-pip
以下の新規パッケージがインストールされます:
  python-pip python-setuptools{a}
...

root@hostname:/home/shimizu# pip install ansible
...

root@hostname:/home/shimizu# cat /root/.pip/pip.log
...
src/MD2.c:31:20: fatal error: Python.h: そのようなファイルやディレクトリはありません
compilation terminated.
error: command 'gcc' failed with exit status 1
...

root@hostname:/home/shimizu# aptitude install python-dev
以下の新規パッケージがインストールされます:
  libexpat1-dev{a} python-dev python2.7-dev{a}
...

### 再度インストールしたところうまくいった ###
root@hostname:/home/shimizu# pip install ansible
...
Successfully installed pycrypto ecdsa
Cleaning up...
root@hostname:/home/shimizu# ansible --version
ansible 1.7.2

### SSH環境作成 ###
### クライアント ###
[root@ip-172-32-0-221 ec2-user]# useradd deploy
[root@ip-172-32-0-221 ec2-user]# cat /etc/passwd
...
deploy  ALL=(ALL)       ALL
...
[root@ip-172-32-0-221 ec2-user]# su deploy
[deploy@ip-172-32-0-221 ec2-user]$ cd /home/deploy/
[deploy@ip-172-32-0-221 .ssh]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/deploy/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/deploy/.ssh/id_rsa. # 秘密鍵
Your public key has been saved in /home/deploy/.ssh/id_rsa.pub. # 公開鍵
The key fingerprint is:
02:35:0c:37:22:21:06:61:53:50:5e:4f:42:d8:23:9d deploy@ip-172-32-0-221
The key's randomart image is:
+--[ RSA 2048]----+
|=**+B**.         |
|o.o+.E=o         |
|   .o ..         |
|     .           |
|      . S        |
|       .         |
|                 |
|                 |
|                 |
+-----------------+
[deploy@ip-172-32-0-221 .ssh]$ chmod 600 id_rsa.pub
[deploy@ip-172-32-0-221 ~]$ chmod 700 .ssh
[deploy@ip-172-32-0-221 ~]$ mv id_rsa.pub authorized_keys
### サーバ ###
### クライアントで作成した秘密鍵をコピーする ###
root@hostname:/home/shimizu# vi /root/.ssh/aws_rsa
...
root@hostname:/home/shimizu# chmod 600 /root/.ssh/aws_rsa
root@hostname:/home/shimizu# ssh -i /root/.ssh/aws_rsa deploy@tech.akat.info
Last login: Fri Nov 14 01:14:47 2014 from hostname.sakura.ne.jp

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2014.09-release-notes/
[deploy@ip-172-32-0-221 ~]$

利用方法

### Inventoryファイルの作成 - 正規表現も利用可能###
root@hostname:/home/shimizu# mkdir /etc/ansible
root@hostname:/home/shimizu# cd /etc/ansible/
root@hostname:/etc/ansible# cat hosts
[web] # グループを作成できる
54.64.208.148
### Inventoryファイルのレスポンス確認 ###
root@hostname:/etc/ansible# ansible all -i hosts -m ping -u deploy --private-key=/root/.ssh/aws_rsa                                            54.64.208.148 | success >> {
    "changed": false,
    "ping": "pong"
}
### ローカルホストでテストすることも可能 ###
root@hostname:/etc/ansible# ansible localhost -m ping
localhost | success >> {
    "changed": false,
    "ping": "pong"
}

### コマンドを実行する ###
root@hostname:/etc/ansible# ansible all -i hosts -m command -a "ls /etc/php-fpm-5.5.d" -u deploy --private-key=/root/.ssh/aws_rsa
54.64.208.148 | success | rc=0 >>
php-fpm.conf
www.conf

### 設定ファイルを作成する ###
root@hostname:/etc/ansible# vi /etc/ansible/ansible.cfg
[defaults]
# リモード接続するときに並行して生成するプロセス数
forks=10
# ログファイルのパス
log_path=/var/log/ansible.log

### サーバの情報を取得する ###
root@hostname:/etc/ansible# ansible all -i hosts -m setup -u deploy --private-key=/root/.ssh/aws_rsa
54.64.208.148 | success >> {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "172.32.0.221"
        ],
        "ansible_all_ipv6_addresses": [
            "fe80::48d:e7ff:fe9f:8b8f"
        ],
        "ansible_architecture": "x86_64",
        "ansible_bios_date": "06/02/2014",
        "ansible_bios_version": "4.2.amazon",
        "ansible_cmdline": {
            "console": "ttyS0",
            "root": "LABEL=/"
        },
        "ansible_date_time": {
            "date": "2014-11-14",
            "day": "14",
            "epoch": "1415977044",
            "hour": "23",
            "iso8601": "2014-11-14T14:57:24Z",
            "iso8601_micro": "2014-11-14T14:57:24.426875Z",
            "minute": "57",
            "month": "11",
            "second": "24",
            "time": "23:57:24",
            "tz": "JST",
            "tz_offset": "+0900",
            "weekday": "Friday",
            "year": "2014"
        },
        "ansible_default_ipv4": {
            "address": "172.32.0.221",
            "alias": "eth0",
            "gateway": "172.32.0.1",
            "interface": "eth0",
            "macaddress": "06:8d:e7:9f:8b:8f",
            "mtu": 9001,
            "netmask": "255.255.255.0",
            "network": "172.32.0.0",
            "type": "ether"
        },
        "ansible_default_ipv6": {},
        "ansible_devices": {
            "xvda": {
                "holders": [],
                "host": "",
                "model": null,
                "partitions": {
                    "xvda1": {
                        "sectors": "16773087",
                        "sectorsize": 512,
                        "size": "8.00 GB",
                        "start": "4096"
                    }
                },
                "removable": "0",
                "rotational": "0",
                "scheduler_mode": "noop",
                "sectors": "16777216",
                "sectorsize": "512",
                "size": "8.00 GB",
                "support_discard": "0",
                "vendor": null
            }
        },
        "ansible_distribution": "Amazon",
        "ansible_distribution_major_version": "NA",
        "ansible_distribution_release": "NA",
        "ansible_distribution_version": "2014.09",
        "ansible_domain": "",
        "ansible_env": {
            "AWS_AUTO_SCALING_HOME": "/opt/aws/apitools/as",
            "AWS_CLOUDWATCH_HOME": "/opt/aws/apitools/mon",
            "AWS_ELB_HOME": "/opt/aws/apitools/elb",
            "AWS_PATH": "/opt/aws",
            "AWS_RDS_HOME": "/opt/aws/apitools/rds",
            "EC2_AMITOOL_HOME": "/opt/aws/amitools/ec2",
            "EC2_HOME": "/opt/aws/apitools/ec2",
            "HOME": "/home/deploy",
            "JAVA_HOME": "/usr/lib/jvm/jre",
            "LANG": "en_US.UTF-8",
            "LC_CTYPE": "en_US.UTF-8",
            "LESSOPEN": "||/usr/bin/lesspipe.sh %s",
            "LESS_TERMCAP_mb": "\u001b[01;31m",
            "LESS_TERMCAP_md": "\u001b[01;38;5;208m",
            "LESS_TERMCAP_me": "\u001b[0m",
            "LESS_TERMCAP_se": "\u001b[0m",
            "LESS_TERMCAP_ue": "\u001b[0m",
            "LESS_TERMCAP_us": "\u001b[04;38;5;111m",
            "LOGNAME": "deploy",
            "MAIL": "/var/mail/deploy",
            "PATH": "/usr/local/bin:/bin:/usr/bin:/opt/aws/bin",
            "PWD": "/home/deploy",
            "SHELL": "/bin/bash",
            "SHLVL": "2",
            "SSH_CLIENT": "49.212.204.46 35705 22",
            "SSH_CONNECTION": "49.212.204.46 35705 172.32.0.221 22",
            "SSH_TTY": "/dev/pts/1",
            "TERM": "xterm",
            "USER": "deploy",
            "_": "/usr/bin/python"
        },
        "ansible_eth0": {
            "active": true,
            "device": "eth0",
            "ipv4": {
                "address": "172.32.0.221",
                "netmask": "255.255.255.0",
                "network": "172.32.0.0"
            },
            "ipv6": [
                {
                    "address": "fe80::48d:e7ff:fe9f:8b8f",
                    "prefix": "64",
                    "scope": "link"
                }
            ],
            "macaddress": "06:8d:e7:9f:8b:8f",
            "mtu": 9001,
            "promisc": false,
            "type": "ether"
        },
        "ansible_form_factor": "Other",
        "ansible_fqdn": "ip-172-32-0-221",
        "ansible_hostname": "ip-172-32-0-221",
        "ansible_interfaces": [
            "lo",
            "eth0"
        ],
        "ansible_kernel": "3.14.20-20.44.amzn1.x86_64",
        "ansible_lo": {
            "active": true,
            "device": "lo",
            "ipv4": {
                "address": "127.0.0.1",
                "netmask": "255.0.0.0",
                "network": "127.0.0.0"
            },
            "ipv6": [
                {
                    "address": "::1",
                    "prefix": "128",
                    "scope": "host"
                }
            ],
            "mtu": 65536,
            "promisc": false,
            "type": "loopback"
        },
        "ansible_machine": "x86_64",
        "ansible_memfree_mb": 73,
        "ansible_memtotal_mb": 996,
        "ansible_mounts": [
            {
                "device": "/dev/xvda1",
                "fstype": "ext4",
                "mount": "/",
                "options": "rw,noatime,data=ordered",
                "size_available": 5455257600,
                "size_total": 8318783488
            }
        ],
        "ansible_nodename": "ip-172-32-0-221",
        "ansible_os_family": "RedHat",
        "ansible_pkg_mgr": "yum",
        "ansible_processor": [
            "Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz"
        ],
        "ansible_processor_cores": 1,
        "ansible_processor_count": 1,
        "ansible_processor_threads_per_core": 1,
        "ansible_processor_vcpus": 1,
        "ansible_product_name": "HVM domU",
        "ansible_product_serial": "NA",
        "ansible_product_uuid": "NA",
        "ansible_product_version": "4.2.amazon",
        "ansible_python_version": "2.6.9",
        "ansible_selinux": false,
        "ansible_ssh_host_key_dsa_public": "...",
        "ansible_ssh_host_key_ecdsa_public": "...",
        "ansible_ssh_host_key_rsa_public": "...",
        "ansible_swapfree_mb": 0,
        "ansible_swaptotal_mb": 0,
        "ansible_system": "Linux",
        "ansible_system_vendor": "Xen",
        "ansible_user_id": "deploy",
        "ansible_userspace_architecture": "x86_64",
        "ansible_userspace_bits": "64",
        "ansible_virtualization_role": "guest",
        "ansible_virtualization_type": "xen",
        "module_setup": true
    },
    "changed": false
}
### IPアドレスだけを取得する ###
root@hostname:/etc/ansible# cat playbook1.yml
---
- hosts: all
  sudo: yes
  tasks:
     - name: gathering ip address
       command: echo {{ ansible_eth0.ipv4.address }}

root@hostname:/etc/ansible# ansible-playbook playbook1.yml -u deploy --private-key=/root/.ssh/aws_rsa --ask-sudo-pass
sudo password:
 ____________
< PLAY [all] >
 ------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


 _________________
< GATHERING FACTS >
 -----------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


ok: [54.64.208.148]
 ____________________________
< TASK: gathering ip address >
 ----------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


changed: [54.64.208.148]
 ____________
< PLAY RECAP >
 ------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


54.64.208.148              : ok=2    changed=1    unreachable=0    failed=0

### Playbookを利用して、ユーザを作成してみる ###
root@hostname:/etc/ansible# cat playbook1.yml
---
- hosts: all
  sudo: yes
  tasks:
    - name: add a new user
      user: name=ansibletest

### tasksはあるべき状態を記載している
### つまり、すでにユーザansibletestがいる場合は何もしない

root@hostname:/etc/ansible# ansible-playbook playbook1.yml -u deploy --private-key=/root/.ssh/aws_rsa --ask-sudo-pass
sudo password:
 ____________
< PLAY [all] >
 ------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


 _________________
< GATHERING FACTS >
 -----------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


ok: [54.64.208.148]
 ______________________
< TASK: add a new user >
 ----------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


changed: [54.64.208.148]
 ____________
< PLAY RECAP >
 ------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


54.64.208.148              : ok=2    changed=1    unreachable=0    failed=0

root@hostname:/etc/ansible# ansible-playbook playbook1.yml -u deploy --private-key=/root/.ssh/aws_rsa --ask-sudo-pass
sudo password:
 ____________
< PLAY [all] >
 ------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


 _________________
< GATHERING FACTS >
 -----------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


ok: [54.64.208.148]
 ______________________
< TASK: add a new user >
 ----------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


ok: [54.64.208.148]
 ____________
< PLAY RECAP >
 ------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


54.64.208.148              : ok=2    changed=0    unreachable=0    failed=0 # 2回目はchangedが0となっている

### syntax check ###
root@hostname:/etc/ansible# ansible-playbook playbook1.yml --syntax-check

playbook: playbook1.yml

### タスクを表示 ###
root@hostname:/etc/ansible# ansible-playbook playbook1.yml --list-task

playbook: playbook1.yml

  play #1 (all):
    add a new user

### dry run ###
root@hostname:/etc/ansible# ansible-playbook playbook1.yml -u deploy --private-key=/root/.ssh/aws_rsa --ask-sudo-pass --check
sudo password:
 ____________
< PLAY [all] >
 ------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


 _________________
< GATHERING FACTS >
 -----------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


ok: [54.64.208.148]
 ______________________
< TASK: add a new user >
 ----------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


changed: [54.64.208.148]
 ____________
< PLAY RECAP >
 ------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


54.64.208.148              : ok=2    changed=1    unreachable=0    failed=0

### 変数も利用可能 ###
root@hostname:/etc/ansible# cat playbook1.yml
---
- hosts: all
  sudo: yes
  vars:
      username: testuser
  tasks:
    - name: add a new user
      user: name={{username}}

### 変数をユーザに入力させることも可能 ###
root@hostname:/etc/ansible# cat playbook1.yml
---
- hosts: all
  sudo: yes
  vars_prompt:
      username: "Enter username"
  tasks:
    - name: add a new user
      user: name={{username}}
root@hostname:/etc/ansible# ansible-playbook playbook1.yml -u deploy --private-key=/root/.ssh/aws_rsa --ask-sudo-pass --check
sudo password:
Enter username: :
 ____________
< PLAY [all] >
 ------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
...

### ファイルをおく ###
root@hostname:/etc/ansible# cat test.txt
this is test
root@hostname:/etc/ansible# cat playbook1.yml
---
- hosts: all
  sudo: yes
  tasks:
     - name: copy test.txt
       copy: src=./test.txt dest=/home/ec2-user/test.txt owner=root
root@hostname:/etc/ansible# ansible-playbook playbook1.yml -u deploy --private-key=/root/.ssh/aws_rsa --ask-sudo-pass
sudo password:
 ____________
< PLAY [all] >
 ------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


 _________________
< GATHERING FACTS >
 -----------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


ok: [54.64.208.148]
 _____________________
< TASK: copy test.txt >
 ---------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


changed: [54.64.208.148]
 ____________
< PLAY RECAP >
 ------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


54.64.208.148              : ok=2    changed=1    unreachable=0    failed=0

### 状況によって処理を変更する ###
root@hostname:/etc/ansible# cat playbook1.yml
---
- hosts: all
  sudo: yes
  tasks:
     - name: "command if debian"
       command: echo {{ ansible_eth0.ipv4.address }}
       when: ansible_os_family == "Debian"
root@hostname:/etc/ansible# ansible-playbook playbook1.yml -u deploy --private-key=/root/.ssh/aws_rsa --ask-sudo-pass
sudo password:
 ____________
< PLAY [all] >
 ------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


 _________________
< GATHERING FACTS >
 -----------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


ok: [54.64.208.148]
 _________________________
< TASK: command if debian >
 -------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


skipping: [54.64.208.148]
 ____________
< PLAY RECAP >
 ------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


54.64.208.148              : ok=1    changed=0    unreachable=0    failed=0


その他

・handlersを利用すれば、サーバに変更があったときのみ最後に1回処理をするなど可能となる
 (モジュールをインストール後にapacheを再起動するなど)
・OSによって挙動を変更することも可能
 (インストールパッケージ名を変更するなど)
・ansible-pullという応用コマンドもあり、push型のansibleにpull型の機能をもたせている
・モジュールの使い方確認方法 ansible-doc [モジュール名]
・他のPlayBookを読み込むことも可能(- include: other.yml)

参考URL

ansibleを使ってみる-幅広く使い方が記載されておりわかりやすい
http://tdoc.info/blog/2013/04/20/ansible.html
入門ansible(未発表箇所)