[ansible導入手順] インストールからPlaybook実行まで

# この投稿で達成できること
- VirtualboxでController/Targetを1ノードずつ作成
- ControllerからTargetに対してansibleのplaybookを流して、Targetの初期構築を行うまでを範囲とする。
 - ホスト名の変更
 - パッケージのインストール(vim,git)
- ansibleはvirtualenvのモジュールとしてインストールする

# 構築環境

## 共通
- Host OS : MacOS 10.9.5
- VirtualBox : 4.3.12
- Vagrant : 1.8.5

## 構成
- Control Node : 192.168.56.151
    - OS : CentOS 7.0
    - python : 2.7.5
    - ansible : 2.2
- Target Node : 192.168.56.152
  - OS : CentOS 7.0
  - python : 2.7.5

# ansibleとは
## 概要/特徴
- python製の構成管理自動化ツール
- 終了条件を定義する形式で、冪等性の担保が特徴(一部自身で担保する必要があるコマンドも有り)
- YAML形式のPlaybookで可読性が高い
- エージェントレスのため導入コストが低い（管理対象にSSHとpythonが入っていればOK）
- 既に作成済みの自作スクリプトの活用とも相性が良い
- 3rd　Partyでのモジュール開発/ロール開発が活発で、やりたいと思うことはだいたいDocuments/ansible-galaxyにあり
    - modules : http://docs.ansible.com/ansible/modules.html
    - roles : https://galaxy.ansible.com/
- Push型の構成管理用途が一般的
    -　YAML形式のPlaybookをpythonに変換して、管理対象に配布/実行
    
## ansible用語

|Term |Description |
|:--------|:-----------|
|Inventory|Target Nodeを指定。INI形式　|
|Playbook|Target Nodeで実行したい処理の流れを記載。YAML形式|

# 環境構築
## Controller/Target : 一般ユーザの作成(ansible)
``` sh:一般ユーザ作成
useradd -s /bin/bash -m ansible
passwd ansible
# sudo権限の付与
echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/ansible
```

## Controller : 公開鍵認証設定
``` ｓｈ：公開鍵認証設定
su - ansible
cd ~
ssh-keygen
ssh-copy-id -i .ssh/id_rsa.pub 192.168.56.152 (Target　NodeのIPアドレス)
```

## Controller : 必要パッケージのインストール
``` sh:インストールコマンド
su - ansible
sudo yum -y install epel-release
sudo yum -y install gcc libffi-devel python-devel openssl-devel python-pip
sudo pip install --upgrade pip

# virtualenvを利用しない場合は、不要
sudo pip install virtualenv
# virtualenvを利用しない場合は、不要
cd ~
virtualenv venv
source venv/bin/activate

pip install "ansible==2.2"
```

# Controller : 作業用ディレクトリの作成
``` sh:作業用ディレクトリの作成
su - ansible
cd ~
mkdir -p practice/{inventory,{group,host}_vars,roles,playbooks}
touch practice/{inventory/inventory.ini,group_vars/all.yml}
```

# Controller : Inventoryファイルの作成
``` sh:Inventoryファイルの作成
su - ansible
cd ~/practice
vim inventory/inventory.ini
```

``` ini:inventory/inventory.ini
[practice_servers]
practice01 ansible_host=192.168.56.152 #Target Node 
```

# Controller : ansibleの疎通確認
``` sh:疎通確認
# Target Nodeのサーバ情報がResponseとして返ってくることを確認
ansible practice_servers -i inventory/inventory.ini -m setup
```

# Controller : Playbook作成
``` sh:Playbook作成
su - ansible
cd ~/practice
vim playbooks/initial_setting.yml
```

``` yml:~/practice/playbooks/initial_setting.yml
---
- hosts: practice_servers
  become: yes # Target serverでsudo実施
  become_user: root　# rootユーザに成り代わって実施

  tasks:
    - name: 1. Set hostname
      hostname:
        name: practice01

    - name: 2. Install required packages
      yum:
        name: "{{ item }}"
      with_items: 
        - vim
        - git
```

# Playbookの実行
``` sh:Playbookの実行
su - ansible
cd ~/practice
ansible-playbook -i inventory/inventory.ini playbooks/initial_setting.yml
```


# 参考
## 構築に利用したVagrantfile
``` title:Controller
Vagrant.configure("2") do |config|
  # Basic VM settings
  config.vm.box = "CentOS7.0"
  config.vm.box_download_insecure = true
  config.vm.hostname = 'controller'
  config.vm.network "private_network",ip:"192.168.56.151"
	config.vm.network :public_network, bridge: 'en0: Wi-Fi (AirPort)'
  config.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2151
	config.ssh.insert_key = false

  # Virtual box setting
  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--ostype", "Redhat_64"]
    vb.name = "ansible_controller"
    vb.memory = 512
    vb.cpus = 1
  end
end
```

``` title:Target_Node
Vagrant.configure("2") do |config|
  # Basic VM settings
  config.vm.box = "CentOS7.0"
  config.vm.box_download_insecure = true
  config.vm.hostname = 'practice'
  config.vm.network "private_network",ip:"192.168.56.152"
	config.vm.network :public_network, bridge: 'en0: Wi-Fi (AirPort)'
  config.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2152
	config.ssh.insert_key = false

  # Virtual box setting
  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--ostype", "Redhat_64"]
    vb.name = "practice"
    vb.memory = 512
    vb.cpus = 1
  end
end
```