Ansible再入門　-Ansible TowerとAnsibleの導入について-

# はじめに

Infrastructure as Code っていうのは、大雑把にサーバー構築をスクリプトコード化して扱うことなんだよ。って思ってた。
違うっぽいです。{ chefやansible単体 } イコール { Infrastructure as Code } ではなく、
Chef-ProvisioningやAnsible Towerのような、総合的にインフラを構築する仕組みをInfrastructure as Codeと呼ぶ。
今回は、AnsibleとAnsible Towerの導入までの流れと、解説をしていきます。

# 1.Ansibleを導入する前に

Ansibleを組み込むにあたって、Ansibleはエージェントレスだけど、被操作側にも設定が必要ということを覚えておく
よく、Ansibleの解説書にエージェントレスだから追加ツールは必要ないみたいに書かれているけれど、これは間違い。
Linuxについては、SSHの設定が必要、openssh-serverを使っているものに対してはそれほど面倒ではないけれど
dropbearを使っているサーバの場合、操作が制限されることがある。
Windowsについても、書籍ではWindows Remote Managiment(WinRM) / Windows Remote Service (WinRS)を使えば良い
みたいに書かれていることがありますが、WinRMにはバージョンがあり、v1系では使えず、v2系以上が必要で、
かつ、PowerShell 3.0以上が必要になります。また、PowerShellを使う為、権限の設定等が発生します。

# 2.Ansible Hostを用意しよう

Ansibleのシステム構成を行う場合、以下のような構成(最小構成2台)で作っておくと後々の管理が楽になる。


```
[Ansible Tower & Ansible Host] - [Ansible Node]
```

- 2-1. Ansible Towerのインストール

Ansible Towerはパッケージマネージャからインストールできず、専用のインストールプログラムを使います。
まず、以下のようなコマンドで最新版のAnsible Towerをダウンロードし、解凍します。
もし最新版以外を利用したい場合はこちら(http://releases.ansible.com/ansible-tower/setup/） から任意のバージョンを選択可能です。
また、Ansible Engineもセットアップに含まれていますので、別途インストールは不要です。

```
$ wget http://releases.ansible.com/ansible-tower/setup/ansible-tower-setup-latest.tar.gz 
$ tar xvzf ansible-tower-setup-latest.tar.gz
```

※メモリが2GB未満、もしくはディスクの空き容量が20GB未満の場合にsetup.shを実行するとインストールは失敗しますので、Ansible Towerをインストールするサーバのスペック/リソースには注意してください。
※推奨はメモリ8GB以上、ディスク100GB以上です。

展開したディレクトリ直下の「inventory」ファイルを編集し、以下の項目のパスワードを入力して保存します。

```
admin_password -> Ansible Towerの管理者パスワード
redis_password -> キャッシュ管理を行うRedisのパスワード
pg_password -> Ansible Towerのデータを保持するPostgreSQLのパスワード（ユーザー「awx」のパスワード）
```

次にライセンスを指定します、体系としては4つのライセンスがあります(トップから辿れるライセンスの一覧にはFree Tower Trialしか出ませんが、問い合わせフォームから旧来の10ノードまで利用できる無償ライセンスについての情報から期限切れにならないセルフサポートライセンスとして取得できます)

・Free Tower Trial & Ansible Tower for Free Forever
・Ansible Tower for Start-Ups & Small Teams
・Ansible Tower for the Enterprise (Enterprise 8×5)
・Ansible Tower for the Enterprise (Premium 24×7)

Ansible Tower for Free Forever以外は有料ライセンスになりますので、最初はFREE ANSIBLE TOWER TRIALを選び体験版として動かすと良いでしょう。
Free Foreverについては、https://www.ansible.com/license から FREE ANSIBLE TOWER TRIAL - LIMITED FEATURES UP TO 10 NODES(期限切れにならないセルフサポートライセンス)を選ぶことでライセンスキーを得ることが出来ます。
※一度体験版を動かしてから商用ライセンスに行きたい人はFREE ANSIBLE TOWER TRIAL - ENTERPRISE FEATURESを選びましょう、LIMITED FEATURES UP TO 10 NODESを選んでしまうと、アップグレードできません。

なお、申請からライセンスキーが届くまで、少々掛かります

その他、AWSを使っている場合は、LAUNCH ANSIBLE TOWER IN AMAZON EC2、から指定のAMIを起動させればインストールの手間はかかりません。

- 2-2. Ansible Nodeのセットアップ

基本的にエージェントレスなので、LinuxならSSH、WindowsならWinRMが繋がればいい。
がしかし、以外に設定項目が多いので注意

- Linuxの場合、sshログインが出来るユーザの作成(useradd)と、rootに昇格するための設定(visudo)、接続に秘密鍵を使用するので公開鍵/秘密鍵のペアを生成(ssh-keygen -t rsa -b 4096)し、秘密鍵(id_rsa)をAnsible Hostに送っておく
- Windowsの場合はWinRMの設定とAnsible Host側にpywinrmライブラリが必要になる

以下の環境の場合

```
Ansible Tower & Ansible Host
Host : 10.0.0.10
Inventory : hosts
```

```
Ansible Node 01
Host : 10.0.0.15
OS   : CentOS7
User : ansible
Pass : elbisna
Key  : /home/ansible/.ssh/10-0-0-15_id_rsa
```

```
Ansible Node 02
Host : 10.0.0.16
OS   : CentOS7
User : ansible
Pass : elbisna
Key  : /home/ansible/.ssh/10-0-0-16_id_rsa
```

```
Ansible Node 03
Host : 10.0.0.17
OS   : Windows Server 2012
User : ansible
Pass : elbisna
```

- Ansible Node 01で作ったid_rsaをAnsible Tower & Ansible Hostの/home/ansible/.ssh/10-0-0-15_id_rsaにコピーしパーミッションを400にする。
- Ansible Node 02で作ったid_rsaをAnsible Tower & Ansible Hostの/home/ansible/.ssh/10-0-0-16_id_rsaにコピーしパーミッションを400にする。
- Ansible Node 03では、WinRMを設定するスクリプトが公開されているので、これをPowerShellを管理者モードで起動して実行する

```
PS C:\Windows\system32> mkdir C:\work
PS C:\work> cd C:\work
PS C:\work> Set-ExecutionPolicy Bypass
PS C:\work> Invoke-WebRequest -Uri https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1 -OutFile ConfigureRemotingForAnsible.ps1
PS C:\work> PS > powershell -ExecutionPolicy Bypass -File ConfigureRemotingForAnsible.ps1
PS C:\work> Set-ExecutionPolicy restricted
```

Ansible Hostでは、WinRMを操作するためのライブラリを追加する

```
curl -sL https://bootstrap.pypa.io/get-pip.py | python
pip install pywinrm
```
Ansible Hostではインベントリ(hosts)には、IP/ログインUser/鍵を指定しておく

```
[web]
10.0.0.15 ansible_user=ansible ansible_private_key_file=/home/ansible/.ssh/10-0-0-15_id_rsa
10.0.0.16 ansible_user=ansible ansible_private_key_file=/home/ansible/.ssh/10-0-0-16_id_rsa

[Windows]
10.0.0.17

[windows:vars]
ansible_user=ansible
ansible_password=elbisna
ansible_port=5986
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore
```

念のため、Ansible Hostのコンソールで接続テスト。

```
ansible 10.0.0.15 -m ping -i hosts --ask-become-pass
ansible 10.0.0.16 -m ping -i hosts --ask-become-pass
ansible 10.0.0.17 -m win_ping -i hosts -vvvv
```

--ask-become-passを付けているので、rootへの昇格時のパスワードを聞いてくる。

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

のように返ってくればOK、ここまでは、Ansible HostとAnsible Nodeの疎通の設定

- 2-3. Ansible Towerの設定をしよう

まず、Ansible Towerの画面に出ている、項目について、設定しよう。

- 組織（Organization）
 Ansible Towerの全ての構成要素を束ねる単位。無償ライセンスではデフォルトで用意されている組織一つしか利用できない

- プロジェクト（Project）
 プレイブックを集約する単位

- インベントリ（Inventory）
 被管理ホストのホスト名や変数などの情報を保持する。ただし、認証に関する情報（ユーザー名やパスワード）は別途扱う

- 認証情報（Credential）
 被管理ホストへの接続情報や、プレイブックを取得するためのバージョン管理システムへの接続情報など認証に関する情報を保持する

- ジョブテンプレート（Job Template）
 「どのプレイブックをどのインベントリファイル、認証情報を使って実行するか」を保持する

- ジョブ（Job）
 ジョブテンプレートを元に作成された実行情報

ここまで設定すると、Ansible Towerを利用する準備が整った感じになる。

# プレイブックを実行するために最低限必要な手順について

- (プレイブックの配置):プレイブックはあらかじめ作成しておき指定のディレクトリ(/var/lib/awx/projects/)に配置しておく必要がある。なお、GitやSubversionなどのバージョン管理システムを利用してプレイブックを取得することも可能。
- (プロジェクトの作成):プレイブックをどこから取得するのかを設定する
- (インベントリの作成):被管理ホストの情報を設定する
- (認証情報の作成):被管理ホストの接続情報を設定する
- (ジョブテンプレートの作成):「どのプレイブックを、どのインベントリに対し実行するのか」を設定する
- (ジョブの実行):ジョブテンプレートを元にプレイブックを実行する

# さいごに

正直なところ、ansible-playbookでplaybook.ymlを実行させるのが一般ユーザには厳しいという現実があるので、GUI/WEB UIツールでここまで出来るのはとてもありがたい。
次は、実際に構築している例迄やりたいな