構成管理AnsibleのGUIツール「AWX」を触ってみた（インストール、Playbook実行、通知設定）

今回は、サーバーの構成管理ツールAnsibleをGUIで利用できる**AWX**を触ってみたので、そのまとめを書いていきたいと思います。

項目としては、以下の順で説明していきたいと思います。

- AWXの概略
- AWXのインストール準備
- AWXのインストール
- AWXのPlaybook実行手順
- AWXで実行したPlaybookの通知設定

#Ansibleとは？
Ansibleとは、RedHat社が開発するOSS構成管理ツールです。

Ansibleは、**サーバー構築の自動化をはじめ、ITインフラに関する様々な作業を自動化できる**という特徴があります。

詳しくは[公式サイト](https://www.redhat.com/ja/technologies/management/ansible)をご確認ください。

AnsibleにOSSのコミュニティ版と、RedHatサポートのエンタープライズ版があり、エンタープライズ版ではGUIでの操作可能なAnsible Towerが利用できます。

#Ansibleファイルの記載方法
Ansibleは基本的に、2つのコードを記載すれば実行することができます。

1つ目は**Inventory file**で、管理対象の役割やホスト情報を記述するファイルになります。

2つ目は**Playbook**で、管理対象の構成や構成の実行をする手順をYAML形式で記述するファイルになります。

（今回はAWXのについての記事のため、Ansibleファイルの記載方法等は割愛させていただきます。）

#AWXとは？
AWXとは、Red Hat社が有償で提供している**Ansible TowerのOSS版**です。

Ansible Towerと同様に、AnsibleをWeb GUI上もしくはAPIによって操作することができます。

AWXの機能は、Absible Towerとほぼ同様に利用できますが、セキュリティや安定性が劣ってしまうので、実際に運用する場合はAnsible Towerを使うといったことになります。

ただ今回は勉強用に挙動を確認する程度なので、AWXを使っていきます。

※AWXはPlaybookを作成するツールではなく、作成済みのPlaybookを指定して実行できるツールです。

#AWXでできること

AWSでできることとしては、以下のようなことがあげられます。

###リアルタイムの Playbook 出力
Playbookの実行をブラウザ上でリアルタイムに確認することができます。

###Playbookをブラウザ上から実行可能
設定したPlaybookをブラウザ上から実行ができます。

###ユーザー管理とアクセス制限
標準ユーザー・システム管理者・システム監査者でユーザー作成でき、権限を付与できます。また、組織・チーム・プロジェクト・インベントリ単位などでアクセス権限管理が可能です。

###履歴管理
ユーザーが実行・変更した履歴がジョブに保存され、閲覧・管理ができます。

###通知機能
メール・Slack・Webhookなどを利用した通知ができます。

###バックアップとリストア
必要に応じてインスタンスをバックアップしたり、複製することが可能です。（AWXの場合は、DockerコマンドでPostgresのダンプファイルを作成することになります）

#AWXのインストール準備

次にAWXをインストールするための準備として、各パッケージをインストールしていきます。

##実行環境
- CentOS7.8

##Docker CEインストール
AWXはコンテナで構成されているため、Dockerをインストールする必要があります。

そのため無償版のDockerである、Docker CE（コミュニティエディション）をインストールしていきます。

```
[root@awx ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@awx ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@awx ~]# yum install -y docker-ce docker-ce-cli containerd.io
```

##docker-pyインストール
続いて、docker-py(pythonでdockerコマンド等が記述できるパッケージ)をインストールします。

```
[root@awx ~]# yum -y install epel-release
[root@awx ~]# yum -y install python-pip

[root@awx ~]# pip install docker

[root@awx ~]# systemctl enable docker
[root@awx ~]# systemctl start docker
```

##Ansibleインストール
続いて、Ansibleをyumでインストールします。

```
[root@awx ~]# yum -y install ansible
```

##Gitインストール
GitはCentOS7.8でデフォルトでインストールされていますが、実際にインストール済みか確認します。

```
[root@awx ~]# yum info git 
```

##Node.js、npm インストール
続いてNode.jsをインストールします。
Node.jsをインストールするとnpmも同時にインストールされます。

```
[root@awx ~]# curl -sL https://rpm.nodesource.com/setup_8.x | bash -
[root@awx ~]# yum install -y nodejs
[root@awx ~]# yum -y install gcc-c++ make
```

npmもインストールされていることも確認します。

```
[root@awx ~]# npm -v
```

#AWXインストール
AWX のインストールは、GitHubにあるAnsibleのPlaybookから実行します。


##リポジトリをclone
``` 
[root@awx ~]# git clone https://github.com/ansible/awx
```


##inventoryを書き換え
対象サーバーを記述するinventoryファイルを、AWXを構築するホストサーバーのIPに変更します。

またpython3をインストールしているため、Inventoryファイルにpython3の環境変数を通すように書き換えます。

```
[root@awx ~]# cd awx/installer/
[root@awx installer]# vi inventory

#localhost ansible_connection=local ansible_python_interpreter="/usr/bin/env python"
ホストIP ansible_connection=local ansible_python_interpreter="/usr/bin/python3"
```

#playbookの実行
AnsibleのPlaybookの実行をするコマンドを打ち、AWXをインストールします。

```
[root@awx ~]# ansible-playbook -i inventory install.yml
```

playbookの実行が完了したら、docker ps -a コマンドで、awx_task、awx_web、awx_postgres、awx_redisのコンテナが立ち上がっていることを確認します。

![demo](https://gyazo.com/f8f1375273aef8cc9066318cb071ba75/raw)

コンテナが立ち上がっていることを確認したら、AWXサーバーのホストのIPを入力してAWXのWebUIが立ち上がるか確認していきます。(デフォルトでポートは80番)

その後、デフォルトで設定されているユーザーID:admin、パスワード:passwordを入力してログインします。

無事ログイン出来たらAWXのインストールは完了です。

![demo](https://gyazo.com/c7a172484d90034aeb7b76a757bf6cd3/raw)


#AWXからPlaybook実行
次にAWXサーバーから、対象サーバーにPlaybookを実行する手順についてまとめていきます。

今回はGitLabのProjectにあるAnsible構成ファイルをAWXサーバーにクローンして、そのAnsible構成ファイルのPlayboookを対象サーバーに実行します。

設定手順としては、

AWXサーバーとGitLabサーバーのssh公開鍵認証の設定
↓
AWXサーバーにGitLabのProjectをクローン
↓
AWXサーバーと対象サーバーのssh公開鍵認証の設定
↓
AWXサーバーにインベントリーを設定
↓
AWXサーバーでテンプレート(Playbookのための設定）を作成
↓
テンプレートを実行

といった流れになります。


##AWXサーバーとGitLabサーバーのssh公開鍵認証の設定
まず、AWXを構築したサーバーで、SSHキーペア（公開鍵と秘密鍵）を作成します。

```
[root@awx ~]# cd ~/.ssh
[root@awx .ssh]# ssh-keygen -t rsa -f awx_rsa
[root@awx ~]# cd ~/.ssh
[root@awx .ssh]# cat gitlab_rsa.pub
内容を確認
```

続いてGitLabのSSH Keyというタブを開き、先ほど作成した公開鍵（gitlab_rsa.pub）の中身を貼り付けます。

名前は適当なものをつけてください。

![demo](https://gyazo.com/51f09153ee3a77b5cfa12b96fccd39c4/raw)

また実際にAWXサーバーから、GitLabのサーバーにsshログインできることを確認してください。

```
[root@awx ~]# ssh ユーザー名@GitLabサーバのIPアドレス -i ~/.ssh/gitlab_rsa
```

ssh接続が確認出来たらAWXの認証情報をクリックをし、今回作成した秘密鍵の情報をSSH秘密鍵の欄に貼り付けます。

また、ここでは名前をmy-gitlab、組織をDefault、認証情報タイプをソースコントロールにしています。

ユーザー名やパスワードはGitLabのsshログイン時のものを指定し、秘密鍵のパスワードはSSHキーペアを作成した際に登録していたら、入力して保存を押してください。

![demo](https://gyazo.com/8f30c76dc2e276767730a101a6cab39b/raw)


##AWXサーバーにGitLabのProjectをクローン

次に、GitLabのProjectをクローンするための設定を行います。

まず、プロジェクトタブをクリックし、情報を入力していきます。

ここでは名前をansible-test-lamp、組織をDefault、SCMタイプ（バージョン管理タイプ）をGitとしています。

ソース詳細のSCM URLにはGitLabのProject情報を、SCM認証情報には先ほど設定したmy-gitlabを指定します。

![demo](https://gyazo.com/ec2fb6fe845c02b98757ceff07752226/raw)

保存を押すと自動的にgit cloneが始まり、先ほど登録したプロジェクトの名前の左のポイントが緑になれば、無事クローンの成功です。

![demo](https://gyazo.com/5fc91522fa8d9c41c2ac6fe0129200b0/raw)


##AWXサーバーと対象サーバーのssh公開鍵認証の設定
次にAWXサーバーからPlaybookを実行するための、対象サーバーの設定を行います。

ここでもAWXサーバーとGitLabサーバーと同様にキーペアを作成し、対象サーバーにscpコマンドで公開鍵を送ります。

```
[root@awx ~]# cd ~/.ssh
[root@awx .ssh]# ssh-keygen -t rsa -f awx_rsa
[root@awx ~]# cd ~/.ssh
[root@awx .ssh]# scp ユーザー名@対象サーバーのホスト名:~/.ssh/ target1_rsa.pub
```

実際にAWXサーバーから、対象サーバーにsshログインできることを確認してください。

```
[root@awx ~]# ssh ユーザー名@GitLabサーバのIPアドレス -i ~/.ssh/gitlab_rsa
```

続いても同様に、AWXの認証情報をクリックをし、今回作成した秘密鍵の情報をSSH秘密鍵の欄に貼り付けます。

ここでは名前をtarget-server1、組織をDefault、認証情報タイプをマシンにしています。

ユーザー名やパスワードは対象サーバーへのsshログイン時のものを指定し、秘密鍵のパスワードはSSHキーペアを作成した際に登録していたら、入力してください。

![demo](https://gyazo.com/8d97e082e54598d02a618422f7df61cd/raw)

##AWXサーバーにインベントリーを設定

続いて、インベントリー（対象サーバー）の登録を行います。

新規インベントリーを作成し、名前と組織を選択します。

まず詳細のタブをクリックしここでは、名前をansible-targets、組織をDefaultに設定しています。

![demo](https://gyazo.com/0d10f3253491d1cfc5f9506ac422b08c/raw)

次にホストのタブをクリックし、ホストの情報として対象サーバーの設定を行います。

ホスト名は対象サーバーのIPアドレスを記載します。

![demo](https://gyazo.com/9160c6b6fb5e15e79236a53ba2282ffb/raw)

##AWXサーバーでテンプレート(Playbookのための設定）を作成

続いてテンプレートという、ジョブ（Playbook）を実行するための情報を登録します。

このテンプレートで先ほど設定した、インベントリー（ansible-targets)、プロジェクト(ansible-test-lamp)、Playbook(クローンしたリポジトリのplaybookであるsite.yml)を選択します。

名前はansible-lamp-template1とし、ジョブタイプはチェックというテスト実行にしています。

保存を押したら、Playbookを実行するための準備は完了です。

![demo](https://gyazo.com/aa87e9b0825b2017c16898368bbfb5cc/raw)

##設定したplaybookの実行
テンプレートタブから先ほど設定したansible-lamp-template1のロケットアイコンをクリックし、Playbookを実行します。

実行結果が以下のように成功と表示せれたら、無事Playbookの実行は完了です。

![demo](https://gyazo.com/7e2cf74f2e184d45fae6b50e24fff9ab/raw)

#Playbookの結果の通知設定

最後に、Playbookの通知設定を、MicorosoftTeamsに設定します。

Teamsでチームを作り、コネクタから Incoming Webhookを選択。

ここから、通知のためのwebhookurlを取得します。

次にAWXに移って通知タブを選択し、通知テンプレートにwebhookurlの入力とタイプをMattermostに選択します。
![demo](https://gyazo.com/4644a80f7b257e6a0ee9741bbc4582cf/raw)

そして、今回通知したいテンプレートansible-lamp-template1の編集から通知タブをクリックします。

先ほど設定したのteamsという通知設定の項目で、成功にチェックをいれます。

![demo](https://gyazo.com/b860256dd96b220d9d51a2d92d420fef/raw)

テンプレートのジョブを実行し、無事成功したら以下のように通知されます。
![demo](https://gyazo.com/738b0043314ee80024932ff9aca4b74a/raw)

これで、通知の設定は完了です。

#参考URL
https://www.redhat.com/ja/technologies/management/ansible
https://www.redhat.com/ja/resources/awx-and-ansible-tower-datasheet
https://qiita.com/matchpon23/items/7442632bd23b3cf0554e
https://blog.1q77.com/2018/03/awx/
https://qiita.com/tonishy/items/bda02856ccd6d7c1c4b3
https://qiita.com/comefigo/items/8ea716f8cf2510a9c15e
https://qiita.com/saito_hideki/items/e19f39f792eb7d0e720c
https://qiita.com/int_sorarinu/items/97cfe4374f5af30f9b5a
https://qiita.com/hijiri0404/items/19db3b05f30571653876
https://qiita.com/redamoon/items/07e445d1fce360cb5fa3
https://www.scsk.jp/product/oss/tec_guide/ansible/1_ansible3_1.html
https://qiita.com/comefigo/items/8ea716f8cf2510a9c15e
https://qiita.com/nnstt1/items/0adaf70eb5568a291269