【連載01】202.Ansible実行端末からのCentOSサーバ群を構築する（Ansible準備編）

<b><font color="#ff6633">当記事はケーススタディの連載となっています。目次は[【こちら】](http://qiita.com/CsFactoryitter/items/6b8308b96afafd61ce5f
)です。</font></b>
<b><font color="#ff6633">最新のソースコードは[【GitHub】](https://github.com/csfactorygihubblog001/blogansible)で公開中です。</font></b>

Ansibleを使ってを以下を実装する。

![Vagrant-Ansible-Serverspec_5.png](https://qiita-image-store.s3.amazonaws.com/0/98085/327c72cb-80c8-dfe4-09cd-2bedbea0f2c2.png)

ここからは「manageterm(Ansible管理端末)」を使用して実行する。
余談ですが、私はPUTTYとSUPPER PUTTY(PUTTYウィンドウのタブ化）を使用してAnsibleを実行しています。
以下のようなイメージです。

![image](https://qiita-image-store.s3.amazonaws.com/0/98085/e2979f26-04e3-ca7a-b76c-1aaa51eee7bc.png)

###1.サーバ実装の流れ

<dl>
<dt>OS環境の設定</dt>
<dd>・<a href="http://qiita.com/CsFactoryitter/items/9415381c7481593cadff">ユーザーとグループを作成する</a></dd>
<dd>・<a href="http://qiita.com/CsFactoryitter/items/1b7e6138197e2c58b719">yumにて必要なライブラリ/ミドル/ソフトウェアをインストールする</a></dd>
<dd>・<a href="http://qiita.com/CsFactoryitter/items/c3670600f51bf4903dd7">SELinuxを無効化する</a></dd>
<dd>・<a href="http://qiita.com/CsFactoryitter/items/411f9a2da528b0c9dd7f">SELinux設定Diabledを適用する為サーバを再起動する</a></dd>
<dd>・<a href="http://qiita.com/CsFactoryitter/items/377c81f2427fa606d779">Firewalldを一時的にストップする</a></dd>
<dd>・<a href="http://qiita.com/CsFactoryitter/items/8e0db53921807a6ff409">必要なディレクトリを作成しオーナーとパーミッションを設定する</a></dd>
<dd>・<a href="http://qiita.com/CsFactoryitter/items/1ecf579bcb4f4c6e987e">Ansible管理端末(ローカル)にあるファイルをadminserv01(NFSサーバとして使用)にコピーする</a></dd>
<dd>・<a href="http://qiita.com/CsFactoryitter/items/087cac080a7a422697cd">HOSTSを設定する</a></dd>
<dd>・<a href="http://qiita.com/CsFactoryitter/items/f951549c9beb962badcb">NFSをインストールし管理サーバ(adminserv01)とAPサーバ(apserv01)/DBサーバ(dbserv01)から接続する</a></dd>
<dd>・<a href="http://qiita.com/CsFactoryitter/items/33a3a1cb698aad39a08e">環境変数を設定する</a></dd>
<br>
<dt>各種ソフトウェア/ミドルウェアのインストール設定</dt>
<dd>・<a href="http://qiita.com/CsFactoryitter/items/33a3a1cb698aad39a08e">NMONのインストール/配置</a></dd>
<dd>・Rubyのインストール/配置</dd>
<dd>・Java/TOMCATのインストール/配置</dd>
<dd>・Selniumのインストール配置</dd>
<dd>・Jenkins/Mavenのインストール配置</dd>
<dd>・<a href="http://qiita.com/CsFactoryitter/items/d8424f55a97b4bdf8062">chrony(タイムサーバ)</a></dd>
<dd>・アパッチのインストールと設定ファイルの配置</dd>
<dd>・OpenVPNのインストールと設定ファイル/鍵類を配置</dd>
<dd>・MySQLのインストールと設定ファイル/鍵類を配置</dd>
<br>
<dt>ファイアーウォール設定</dt>
<dd>・ファイアーウォール設定</dd>
<br>
<dt>アップデート/破棄処理</dt>
<dd>・不要ファイル削除 / mlocate update / yum update</dd>
</dl>

※構築が完了したら最後にVagrantBoxファイルとして仮想マシンを保存する。

###2.実行ディレクトリ構成

Ansibleの実行にはAnsibleコマンドにパラメータとして「ansible-playbook」を指定する。
Ansible-playbookは複数のファイルに分割して作ることができる。
上記のサーバ構成に合わせてファイルを分割して管理のしやすい構造にする。
ファルダ構造は以下とする。
Ansibleをインストールすると/etc/ansible/配下にディレクトリができる。

<font color="#ff0000">/etc/ansible/
├── ansible.cfg　　　・・・・・　ansible のコンフィグレーション(今回は編集しない)</font> 
<font color="#0099ff">├── execute.sh　　　・・・・・　ansible playbookを実行するシェル</font>
<font color="#ff0000">├── hosts　　　　　・・・・・　ansibleで使用するhostとhostのグループの一覧</font>
<font color="#0099ff">├── site.yml　　　　・・・・・　メインのplaybook(このファイルからoperations配下をインクルード)
├── operations─(1)　・・・・・　メインのplaybookからインクルードされる</font>
<font color="#ff0000">├── roles────── 　・・・・・　ansibleロール(今回は編集しない)</font>
<font color="#0099ff">├── sendfiles──(2)　・・・・・　メインのplaybook(managetermから各サーバに配布されるインストーラ/設定)
└── vars───────(3)　・・・・・　独自の変数設定(ymlファイルから参照数)</font>

<font color="#ff0000">赤文字</font>：インストール直後に構成されるファイル
<font color="#0099ff">青文字</font>：サーバ構築時に追加していく自作ファイル

<b>(1)operations配下にはサーバ設定をサーバ構成作業に合わせてファイルを分割している</b>

├── 0001_ansiblebef.yml
├── 0011_usergroup.yml
├── 0012_yum.yml
├── 0021_selinux.yml
├── 0031_reboot.yml
├── 0041_firewalldstop.yml
├── 0061_filedir.yml
├── 0071_filescopy.yml
├── 0075_hosts.yml
├── 0081_nfs.yml
├── 0091_env.yml
├── 1001_nmon.yml
├── 1011_ruby.yml
├── 1021_javatomcat.yml
├── 1022_selenium.yml
├── 1031_jenkinsmvn.yml
├── 1041_chrony.yml
├── 1051_apache.yml
├── 1061_openvpn.yml
├── 1071_mysql.yml
├── 3001_firewalld.yml
├── 3011_firewallreload.yml
└── 9001_finish.yml
 
<b>(2)sendfiles配下にはyumではインストールできないインストールソフトウェアや設定ファイルを配置する</b>

├── apache
│   ├── installer
│   └── settings
│       ├── ajp.conf_adminserv01
│       ├── ajp.conf_apserv01
│       ├── server_cert.pem_apserv01
│       ├── server_key.pem.nopass_apserv01
│       ├── ssl.conf_apserv01
│       └── subversion.conf_adminserv01
├── java
│   ├── installer
│   │   └── jdk-7u79-linux-x64.rpm
│   └── settings
├── jenkins_mvn
│   ├── installer
│   │   ├── apache-maven-3.3.3-bin.tar.gz
│   │   └── jenkins.war
│   └── settings
├── mysql
│   ├── installer
│   └── settings
│       ├── init.exp
│       └── my.cnf
├── nfs
│   ├── installer
│   └── settings
│       └── exports
├── openvpn
│   ├── installer
│   └── settings
│       ├── exec_ca.exp
│       ├── exec_client.exp
│       ├── exec_server.exp
│       ├── server.conf
│       └── vars
├── os
│   ├── installer
│   │   └── centos7.tar.gz
│   └── settings
│       ├── profile_init.sh
│       └── resolv.conf
├── output
├── selenium
│   ├── firewalld
│   │   └── selenium.xml
│   ├── installer
│   │   └── selenium-server-standalone-2.48.2.jar
│   └── settings
│       ├── node.json
│       ├── selenium.sh
│       └── selenium_systemd.template_adminserv01
└── tomcat
    ├── firewalld
    │   └── tomcat.xml
    ├── installer
    │   └── apache-tomcat-7.0.65.tar.gz
    └── settings
        ├── server.xml
        ├── setenv.sh
        ├── tomcat-users.xml
        ├── tomcat_systemd.template
        └── tomcatenviroment

<b>(3)vars配下にはymlから参照する変数を定義する</b>

├── befdownload.yml
├── filedir.yml
├── ruby.yml
├── service.yml
├── usergroup.yml

###3.メインとなるplaybook（site.yml）
メインとなるymlファイルではサーバ設定をinclude。
各サーバ設定を単体で確認しやすいように分割する。

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

\#
\#　メインのymlファイル(site.xml)
\#　※includeしか書かない。個別の処理はそれぞれの責務を持つymlファイルに処理委譲し凝縮度を高める。
\#

<font color="#ff0000">- hosts:</font> all
  <font color="#ff0000">sudo:</font> no
  <font color="#ff0000">remote_user:</font> root
  <font color="#ff0000">tasks:</font>
    <font color="#ff0000">- name:</font> initilize Ansible
      <font color="#ff0000">tags</font>: allexec
      <font color="#ff0000">debug:</font> msg="Ansible実行します。"

\#
\#　OS環境の設定
\#　※OS自体の設定を行う
\#

<font color="#ff0000">- include:</font> ./operations/0011_usergroup.yml
<font color="#ff0000">- include:</font> ./operations/0012_yum.yml
<font color="#ff0000">- include:</font> ./operations/0021_selinux.yml
<font color="#ff0000">- include:</font> ./operations/0031_reboot.yml
<font color="#ff0000">- include:</font> ./operations/0041_firewalldstop.yml
<font color="#ff0000">- include:</font> ./operations/0061_filedir.yml
<font color="#ff0000">- include:</font> ./operations/0071_filescopy.yml
<font color="#ff0000">- include:</font> ./operations/0075_hosts.yml
<font color="#ff0000">- include:</font> ./operations/0081_nfs.yml
<font color="#ff0000">- include:</font> ./operations/0091_env.yml
 
\#
\#　ソフトウェア/ミドルウェアのインストール/設定/サービス起動
\#　※ミドル/ソフトウェア単位にymlを分け、出来るだけyum内で自己完結する
\#

<font color="#ff0000">- include:</font> ./operations/1001_nmon.yml
<font color="#ff0000">- include:</font> ./operations/1011_ruby.yml
<font color="#ff0000">- include:</font> ./operations/1021_javatomcat.yml
<font color="#ff0000">- include:</font> ./operations/1022_selenium.yml
<font color="#ff0000">- include:</font> ./operations/1031_jenkinsmvn.yml
<font color="#ff0000">- include:</font> ./operations/1041_chrony.yml
<font color="#ff0000">- include:</font> ./operations/1051_apache.yml
<font color="#ff0000">- include:</font> ./operations/1061_openvpn.yml
<font color="#ff0000">- include:</font> ./operations/1071_mysql.yml
 
\#
\#　ファイアーウォールの設定
\#

<font color="#ff0000">- include:</font> ./operations/3001_firewalld.yml
 
\#
\#　最終処理
\#

<font color="#ff0000">- include:</font> ./operations/9001_finish.yml
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

###i.Ansible playbookの構成

Ansibleは３つのセクションにより構成されている。

\# ▼▼▼ Target（サーバやAnsible実行ユーザー）セクション
<font color="#ff0000">- hosts:</font> all
  <font color="#ff0000">sudo:</font> no
  <font color="#ff0000">remote_user:</font> root
\# ▲▲▲

\# ▼▼▼ vars（変数設定）セクション
<font color="#ff0000">vars_files:</font>
- ../vars/yum.yml
- ../vars/filedir.yml
- ../vars/ruby.yml
- ../vars/service.yml
- ../vars/usergroup.yml
\# ▲▲▲

\# ▼▼▼ tasks（実行）セクション
<font color="#ff0000">tasks:</font>
- name: initilize Ansible
debug:msg=aaaaaaa
\# ▲▲▲

###ii.Ansible Tagetセクション：<font color="#ff0000"><b>*hosts*</b></font>
hostsには下に続くtasksを実行するサーバ名、又はサーバ名だけでなく/etc/ansible/hostsに指定したグループ名を指定する。
allは特別で/etc/ansible/hostsに指定したサーバ全てという意味になる。

書式：

>hosts \${/etc/ansible/hosts内に記述したサーバ名またはグループ名}

例：

```bash:
hosts all
hosts apservers
```

###iii.Ansible Tagetセクション：<font color="#ff0000"><b>*sudo*</b></font>
AnsibleはSSHを利用してymlにて記述した内容をサーバにログインしてtasksを実行する。
実行に際し、sudoの使用可否を決めるのがsudoモジュール。

書式：

>sudo \${no または yes}

例：

```bash:
sudo no
```

###iv.Ansible Tagetセクション：<font color="#ff0000"><b>*remote_user*</b></font>
AnsibleはSSHを利用してymlにて記述した内容をサーバにログインしてtasksを実行する。
実行する際のユーザー名を決めるのがremote_user。
 
書式：

>remote_user \${接続先サーバでansible tasksを実行するユーザー名}

例：

```bash:
remote_user root
```

###v.Ansible varセクション：<font color="#ff0000"><b>*var_files(vars)*</b></font>
実際のサーバ構築をする際は環境固有のIPアドレスやホスト名など本番サーバと開発サーバでは具体値を差し替えたい値が多くある。その場合、変数を外部化しておくと、透過的にplaybookを環境別に書き換える必要がなくAnsibleを実行できるメリットがある。

書式：

>var_files 
- ${変数設定をした外部ファイルパス}

例：

```bash:
vars_files:
    - ../vars/yum.yml
    - ../vars/filedir.yml
    - ../vars/ruby.yml
``` 
 
変数が少数の場合は外部ファイルに記述せず、直接記述も可能。その場合varsを使用して記述。

書式：

>vars:
key名: 値

例：

```bash:
vars:
abc_path: /var/log/abc.log
```

###vi.Ansible tasksセクション：<font color="#ff0000"><b>*tasks*</b></font>
tasksはAnsibleのメインとなる。
tasks配下にサーバへの操作をymlで記述していく。

書式：

>remote_user \${接続先サーバでansible tasksを実行するユーザー名}

例：

```bash:
remote_user root
```

<b>※以降の章ではincludeしたplaybookのtasksセクションをメインに説明していきます。</b>

次回は「[Ansibleでユーザーとグループを追加する](http://qiita.com/CsFactoryitter/items/9415381c7481593cadff)」について。

<b><font color="#ff6633">連載の目次は[【こちら】](http://qiita.com/CsFactoryitter/items/6b8308b96afafd61ce5f
)です。</font></b>