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


当記事はケーススタディの連載となっています。目次は【こちら】です。
最新のソースコードは【GitHub】で公開中です。

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

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

1.サーバ実装の流れ

OS環境の設定
ユーザーとグループを作成する
yumにて必要なライブラリ/ミドル/ソフトウェアをインストールする
SELinuxを無効化する
SELinux設定Diabledを適用する為サーバを再起動する
Firewalldを一時的にストップする
必要なディレクトリを作成しオーナーとパーミッションを設定する
Ansible管理端末(ローカル)にあるファイルをadminserv01(NFSサーバとして使用)にコピーする
HOSTSを設定する
NFSをインストールし管理サーバ(adminserv01)とAPサーバ(apserv01)/DBサーバ(dbserv01)から接続する
環境変数を設定する

各種ソフトウェア/ミドルウェアのインストール設定
NMONのインストール/配置
・Rubyのインストール/配置
・Java/TOMCATのインストール/配置
・Selniumのインストール配置
・Jenkins/Mavenのインストール配置
chrony(タイムサーバ)
・アパッチのインストールと設定ファイルの配置
・OpenVPNのインストールと設定ファイル/鍵類を配置
・MySQLのインストールと設定ファイル/鍵類を配置

ファイアーウォール設定
・ファイアーウォール設定

アップデート/破棄処理
・不要ファイル削除 / mlocate update / yum update

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

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

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

/etc/ansible/
├── ansible.cfg   ・・・・・ ansible のコンフィグレーション(今回は編集しない)

├── execute.sh   ・・・・・ ansible playbookを実行するシェル
├── hosts     ・・・・・ ansibleで使用するhostとhostのグループの一覧
├── site.yml    ・・・・・ メインのplaybook(このファイルからoperations配下をインクルード)
├── operations─(1) ・・・・・ メインのplaybookからインクルードされる

├── roles──────  ・・・・・ ansibleロール(今回は編集しない)
├── sendfiles──(2) ・・・・・ メインのplaybook(managetermから各サーバに配布されるインストーラ/設定)
└── vars───────(3) ・・・・・ 独自の変数設定(ymlファイルから参照数)

赤文字:インストール直後に構成されるファイル
青文字:サーバ構築時に追加していく自作ファイル

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

├── 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

(2)sendfiles配下にはyumではインストールできないインストールソフトウェアや設定ファイルを配置する

├── 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

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

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

3.メインとなるplaybook(site.yml)

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

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

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

- hosts: all
sudo: no
remote_user: root
tasks:
- name: initilize Ansible
tags: allexec
debug: msg="Ansible実行します。"

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

- include: ./operations/0011_usergroup.yml
- include: ./operations/0012_yum.yml
- include: ./operations/0021_selinux.yml
- include: ./operations/0031_reboot.yml
- include: ./operations/0041_firewalldstop.yml
- include: ./operations/0061_filedir.yml
- include: ./operations/0071_filescopy.yml
- include: ./operations/0075_hosts.yml
- include: ./operations/0081_nfs.yml
- include: ./operations/0091_env.yml

#
# ソフトウェア/ミドルウェアのインストール/設定/サービス起動
# ※ミドル/ソフトウェア単位にymlを分け、出来るだけyum内で自己完結する
#

- include: ./operations/1001_nmon.yml
- include: ./operations/1011_ruby.yml
- include: ./operations/1021_javatomcat.yml
- include: ./operations/1022_selenium.yml
- include: ./operations/1031_jenkinsmvn.yml
- include: ./operations/1041_chrony.yml
- include: ./operations/1051_apache.yml
- include: ./operations/1061_openvpn.yml
- include: ./operations/1071_mysql.yml

#
# ファイアーウォールの設定
#

- include: ./operations/3001_firewalld.yml

#
# 最終処理
#

- include: ./operations/9001_finish.yml
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

i.Ansible playbookの構成

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

# ▼▼▼ Target(サーバやAnsible実行ユーザー)セクション
- hosts: all
sudo: no
remote_user: root
# ▲▲▲

# ▼▼▼ vars(変数設定)セクション
vars_files:
- ../vars/yum.yml
- ../vars/filedir.yml
- ../vars/ruby.yml
- ../vars/service.yml
- ../vars/usergroup.yml
# ▲▲▲

# ▼▼▼ tasks(実行)セクション
tasks:
- name: initilize Ansible
debug:msg=aaaaaaa
# ▲▲▲

ii.Ansible Tagetセクション:hosts

hostsには下に続くtasksを実行するサーバ名、又はサーバ名だけでなく/etc/ansible/hostsに指定したグループ名を指定する。
allは特別で/etc/ansible/hostsに指定したサーバ全てという意味になる。

書式:

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

例:

hosts all
hosts apservers

iii.Ansible Tagetセクション:sudo

AnsibleはSSHを利用してymlにて記述した内容をサーバにログインしてtasksを実行する。
実行に際し、sudoの使用可否を決めるのがsudoモジュール。

書式:

sudo \${no または yes}

例:

sudo no

iv.Ansible Tagetセクション:remote_user

AnsibleはSSHを利用してymlにて記述した内容をサーバにログインしてtasksを実行する。
実行する際のユーザー名を決めるのがremote_user。

書式:

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

例:

remote_user root

v.Ansible varセクション:var_files(vars)

実際のサーバ構築をする際は環境固有のIPアドレスやホスト名など本番サーバと開発サーバでは具体値を差し替えたい値が多くある。その場合、変数を外部化しておくと、透過的にplaybookを環境別に書き換える必要がなくAnsibleを実行できるメリットがある。

書式:

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

例:

vars_files:
    - ../vars/yum.yml
    - ../vars/filedir.yml
    - ../vars/ruby.yml

変数が少数の場合は外部ファイルに記述せず、直接記述も可能。その場合varsを使用して記述。

書式:

vars:
key名: 値

例:

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

vi.Ansible tasksセクション:tasks

tasksはAnsibleのメインとなる。
tasks配下にサーバへの操作をymlで記述していく。

書式:

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

例:

remote_user root

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

次回は「Ansibleでユーザーとグループを追加する」について。

連載の目次は【こちら】です。