Ansible/AnsibleTowerをオフラインインストールする

# はじめに
Ansibleアドベントカレンダーの記事です。
業務でAnsible使う部署から別の部署に移動しましたが、個人でちょこちょこ触ったりしています。

今回はAnsibleとAnsible Towerのオフラインインストールを行う記事となります。
インターネットにつながった環境以外でのインストールを行うことがあると思います。(自分はありました)

そのときに色々とつらい思いをしたので記事としてまとめます。

# 前提条件
- 実行した環境はCentOS 7.6 64bitとなります。
- RHEL 7.5でも本手順でインストールが可能なことを確認しています。
- ユーザはrootで実行しています。
- すべてのファイルはデフォルトパス(/root配下)に配置して作業しています。

# 事前準備
AnsibleとAnsible Towerのオフラインインストールを行う際には、RHELのインストールISOイメージを利用します。
イメージは[このサイト](https://access.redhat.com/ja/downloads)からダウンロードすることができます。
このサイトからはAnsible Engineのrpmも取得することができます。通常のAnsibleを利用しない場合はこちらからrpmパッケージをダウンロードしてください。

またAnsible Towerについてはオフライン用のパッケージであるbundle版があります。
こちらについては[このサイト](https://releases.ansible.com/ansible-tower/setup-bundle/)からダウンロードしてください。

# バージョン情報
今回インストールするAnsibleとAnsible Tower等のバージョンとなります

| 内容 | バージョン |
|:-:|:-:|
| Ansible  | 2.7.4 |
| Ansible Tower  | 3.3.3 |
| RHEL DVDiso | 7.7 |

# Ansibleのインストール
## DVDisoイメージのマウント
まずはじめにisoイメージをマウントします。
以下コマンドにてファイルを展開します。

```
# ファイルを展開
$ mount -o loop /root/rhel-server-7.7-x86_64-dvd.iso

# 展開できたかどうかの確認
$ ls -l /mnt
合計 974
dr-xr-xr-x. 3 root root   2048  7月 23 23:56 EFI
-r--r--r--. 1 root root   8266  7月 23 23:29 EULA
-r--r--r--. 1 root root  18092  7月 23 23:29 GPL
dr-xr-xr-x. 2 root root   2048  7月 23 23:56 LiveOS
dr-xr-xr-x. 2 root root 946176  7月 23 23:56 Packages
-r--r--r--. 1 root root   3375  7月  3 21:51 RPM-GPG-KEY-redhat-beta
-r--r--r--. 1 root root   3211  7月  3 21:51 RPM-GPG-KEY-redhat-release
-r--r--r--. 1 root root   1796  7月 23 23:56 TRANS.TBL
dr-xr-xr-x. 4 root root   2048  7月 23 23:56 addons
-r--r--r--. 1 root root   1455  7月 23 23:29 extra_files.json
dr-xr-xr-x. 3 root root   2048  7月 23 23:56 images
dr-xr-xr-x. 2 root root   2048  7月 23 23:56 isolinux
-r--r--r--. 1 root root    114  7月 23 23:32 media.repo
dr-xr-xr-x. 2 root root   2048  7月 23 23:56 repodata

```

次に、`/etc/yum.repos.d`配下に作業レポジトリを追加します。

```
# rhel7-dvdiso.repoという名前でrepoファイルをコピー
$ cp /mnt/media.repo /etc/yum.repos.d/rhel7-dvdiso.repo

# 権限を変更する
$ chmod 644 /etc/yum.repos.d/rhel7-dvdiso.repo

# コピーを作成
$ cp -ip /etc/yum.repos.d/rhel7-dvdiso.repo /etc/yum.repos.d/rhel7-dvdiso.repo.org
```

コピー作成後、`rhel7-dvdiso.repo`ファイルを以下のように編集します。

```:rhel7-dvdiso.repo
[InstallMedia]
name=Red Hat Enterprise Linux 7.7
mediaid=1563892373.442998
metadata_expire=-1
gpgcheck=1
cost=500
enabled=1
baseurl=file:///mnt/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
```

repoファイル更新後、yumレポジトリを清掃します。

```
$ yum clean all
読み込んだプラグイン:fastestmirror
リポジトリーを清掃しています: InstallMedia base extras updates
```

## 依存ファイルのダウンロード
Ansibleをオフラインインストールする際は依存関係の都合上以下ファイルのダウンロードが必要となります。

- sshpass 
    - [RPMダウンロードリンク](https://rpmfind.net/linux/rpm2html/search.php?query=sshpass)
- python-httplib2 
    - [RPMダウンロードリンク](https://rpmfind.net/linux/rpm2html/search.php?query=python-httplib2)
- python-passlib 
    - [RPMダウンロードリンク](https://www.rpmfind.net/linux/rpm2html/search.php?query=python-passlib)
- python2-jmespath
    - [RPMダウンロードリンク](https://rpmfind.net/linux/rpm2html/search.php?query=python2-jmespath)

それぞれRPMファイルを取得しインストールします。

```
 yum -y install sshpass-1.06-1.el7.x86_64.rpm
 yum -y install python-httplib2-0.9.1-2.1.el7.noarch.rpm
 yum -y install python-passlib-1.6.5-1.1.el7.noarch.rpm
 yum -y install python2-jmespath-0.9.0-4.el7ae.noarch.rpm
```

## Ansibleのインストール
依存関係も解決したのでAnsibleをインストールします。

```
yum -y install ansible-2.7.4-1.el7ae.noarch.rpm
```

通常このコマンドでインストールできますが、`GPG 鍵の取得に失敗しました`と出た場合はオプションとして`--nogpgcheck`を指定してインストールしてください。


# Ansible Towerのインストール
## DVDisoイメージのマウント
Ansibleの箇所で記載した部分と同じです。

## tarファイルの展開
Ansible Towerのbundle版はtar形式に圧縮されているため展開します。

```
tar -zxvf ansible-tower-setup-bundle-3-3-3.el7.tar.gz
cd ansible-tower-setup-bundle-3.3.3-1.el7/
```

## inventoryファイルの編集
既にAnsible Towerをインストールしたことがある人であればご存知かと思いますが、Ansible Towerのinventoryファイルにパスワードを設定する箇所があります。
それぞれの対応表は以下の通りです。

| 項目 | 内容 |
|:--|:--|
| admin_password  | Ansible Towerの管理者パスワード |
| pg_password  | Ansible Towerのデータを保持するPostgreSQLのパスワード(ユーザはawx)  |
| rabbitmq_password  | キャッシュ管理を行うRedisのパスワード  |

適宜inventoryファイルの該当項目を編集します。

## Ansible Towerのインストール
Ansible Towerはセットアップスクリプト`setup.sh`が用意されているため、このスクリプトを実行します。
約10分程度経過すると無事インストールが終わります。

```
PLAY RECAP *********************************************************************
localhost                  : ok=143  changed=70   unreachable=0    failed=0

The setup process completed successfully.
Setup log saved to /var/log/tower/setup-2019-12-02-00:21:17.log
```
このような結果が表示されると、正常にインストールが完了されている状態となります。
ローカルのIPアドレスをブラウザで叩くとログイン画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283423/74fbea41-1d89-b953-09e0-d9f890a9f195.png)

あとは指定したパスワードを入力しログインし、ライセンスキーを入力します。

これでAnsible、Ansible Towerのオフラインインストールが実行できます。