当記事はケーススタディの連載となっています。目次は【こちら】です。
最新のソースコードは【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でユーザーとグループを追加する」について。
連載の目次は【こちら】です。