Ansible実行環境でserverspecを実行するための実行端末設定

何かと手間が掛かかる上に人的ミスの起こりやすいサーバー構築を「Ansible+serverspec」の組み合わせで行ったケーススタディです。
現在進行形の為、備忘録的に書き留めているので、ミスに気付き次第修正をかけていきます。
同様の組み合わせでサーバー構築されている方にとって少しでも参考になれば幸いです。
アドバイス・ご指摘も助かります。

#前提条件
サーバ構成図：
![システム構成図(Qiita).png](https://qiita-image-store.s3.amazonaws.com/0/98085/e6df0bce-c488-2616-062e-855c79aa7ed3.png)
※設定するサーバの種類は以下の３つとする。
APサーバ（以降、dev_apserv01と呼ぶ）
DBサーバ（以降、dev_dbserv01と呼ぶ）
開発管理サーバ兼バッチスケジューラ（以降、dev_adminserv01と呼ぶ）

OS：CentOS 7

事前にノーパスワード設定をしておく。

※現状AnsibleはSSH前提でWindowsからネイティブには接続できないためWindowsにAnsible用のLinuxをインストールする必要がある。

#Ansible実行端末設定手順
####1.Ansibleインストール
```bash:
$ yum -y install ansible
```

####2./etc/hostsに接続先サーバを設定
```bash:
$ vi /etc/hosts
```
以下を記述する

```bash:/etc/hosts
192.168.102.151 dev_apserv01
192.168.102.152 dev_dbserv01
192.168.102.153 dev_adminserv01
```

####3.KEYの生成
```bash:
$ ssh-keygen -t rsa -N ""
/root/.ssh/id_rsa
/root/.ssh/id_rsa.pub
```

####4.KEY情報を覚える状態に設定
```bash:
$ eval \`ssh-agent\`
$ ssh-add
```

####5.接続先サーバへの公開キー配布と権限付与
それぞれのサーバに対し、
(1)SSHで接続して.sshフォルダを作成する（すでにある場合は何もしない）
(2)Ansible実行端末の公開キーを信頼するサーバ群として登録する
（2回パスワードを求められる)

- dev_apserv01への配布

```bash:
$ ssh root@dev_apserv01  "mkdir ~/.ssh > /dev/null 2>&1;exit"
$ cat /root/.ssh/id_rsa.pub | ssh root@dev_apserv01 "cat > .ssh/authorized_keys && chmod 600 .ssh/authorized_keys"
```

- dev_dbserv01への配布

```bash:
$ ssh root@dev_dbserv01 "mkdir ~/.ssh > /dev/null 2>&1;exit"
$ cat /root/.ssh/id_rsa.pub | ssh root@dev_dbserv01 "cat > .ssh/authorized_keys && chmod 600 .ssh/authorized_keys"
```

- dev_adminserv01への配布

```bash:
$ ssh root@dev_adminserv01 "mkdir ~/.ssh > /dev/null 2>&1;exit"
$ cat /root/.ssh/id_rsa.pub | ssh root@dev_adminserv01 "cat > .ssh/authorized_keys && chmod 600 .ssh/authorized_keys"
```

####6.Ansibleが接続対象サーバ群に自動接続可能かを確認

Ansible接続対象サーバ群をAnsible用のhostsファイルに登録する

```bash:
$ vi /etc/ansible/hosts
```
操作するサーバ群をすべて記述

```bash:/etc/ansible/hosts
dev_apserv01
dev_dbserv01
dev_adminserv01
```

[ ]で括って操作するグループ名を作成
後の操作で対象とするサーバをグループ名で指定する為
ここでは将来APサーバが増えることを想定して[webservers]と設定している

```bash:/etc/ansible/hosts
[webservers]
dev_apserv01
[dbservers]
dev_dbserv01
[adminservs]
dev_adminserv01
#開発管理サーバはAPサーバのテスト機を兼ねる為、2つを一括設定用にグループ化
[ap_admin]
dev_apserv01
dev_adminserv01
#開発管理サーバはdbservのテスト機を兼ねる為、2つを一括設定用にグループ化
[db_admin]
dev_dbserv01
dev_adminserv01
```

接続の確認を行う

```py:
$ ansible all -m ping
```

下記が表示されたら接続完了

```py:
dev_adminserv01 | success >> {
"changed": false,
"ping": "pong"
}

dev_apserv01 | success >> {
"changed": false,
"ping": "pong"
}

dev_dbserv01 | success >> {
"changed": false,
"ping": "pong"
}
```

####7.SSH-agentが自動起動するよう設定
```bash:
$ vi /etc/profile.d/init.sh
```

以下を記述

```bash:/etc/profile.d/init.sh
eval \`ssh-agent\`
ssh-add
```

####8.SSH-agentがログアウト時にKILLされるよう設定

```bash:
$ vi /root/.bash_logout
```

以下を記述

```bash:/root/.bash_logout
ssh-agent -k
```

####9.コマンドヒストリを端末間で共有

```bash:
$ vi /etc/profile.d/init.sh
```

以下を記述

```bash:/etc/profile.d/init.sh
function share_history {
	history -a
	history -c
	history -r
}
PROMPT_COMMAND='share_history'
shopt -u histappend
export HISTSIZE=9999
```

####10.環境変数の再読み込み

```bash:
$ source /etc/profile.d/init.sh
```

以上でAnsible実行端末設定が完了です。

次回は、「[Ansible実行環境でserverspecを実行するためRuby実行環境を構築する](http://qiita.com/CsFactoryitter/items/a3c532cd405f4b269ed8)」について記述します。

*****
#目次：Vagrant-Ansible-Serverspecによるサーバ構築とサーバテスティング
- [Ansible実行環境でserverspecを実行するための実行端末設定]
(http://qiita.com/CsFactoryitter/items/40dea7e8ff45b501ffda)
- [Ansible実行環境でserverspecを実行するためRuby実行環境を構築する](http://qiita.com/CsFactoryitter/items/a3c532cd405f4b269ed8)
- [Ansible実行環境でserverspecを実行するための設定～serverspecインストール](http://qiita.com/CsFactoryitter/items/09b76ec46b17255f75dd)