AWXでGitLab上のPlaybookを実行してみる

## はじめに
以前、[GitLabをDockerコンテナで起動](https://qiita.com/Yoshihito-Fukushima/items/6ed77482e1cd0b86396b)と[AWXをDockerコンテナで起動](https://qiita.com/Yoshihito-Fukushima/items/99ee3491e0a12a6517e8)の2つの記事を投稿しました。
今回は構築したAWXからGitlabにコミットしたPlaybookを実行してみたいと思います。
動作検証のため、まずはlocalhostに対して簡単なPlaybookを実行してみたいと思います。

## Playbook
今回実行するPlaybookの構成は下記の通りです。

```
├──awx_test.yml
├──roles
     └── awx_test
           ├── tasks
           │     └── main.yml
           │
           ├── files
           │     └── test.txt
```

各ファイルの内容は下記の通りです。
awx_testのroleをimportし、taskではcopyモジュールでfiles配下のtest.txtを/tmp/awx_test/にコピーするという簡単なPlaybookです。

```yaml:awx_test.yml
---
- hosts: all
  gather_facts: false
  tasks:
    - import_role:
        name: "awx_test"
```

```yaml:tasks/main.yml
---
- name: awx test
  copy:
    src: "test.txt"
    dest: "/tmp/awx_test/test.txt"
```

```txt:files/test.txt
AWX TEST
```
## GitLabへコミット
上記のPlaybookをGitLabにコミットします。
「AWX_TEST」というプロジェクトを作成したので、このプロジェクトを使っていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215301/bc082dfc-cb03-f02e-34f0-fbb134876def.png)
せっかくなのでGUIではなくコマンドでコミットを行いました。
※予めGitLab上でAccessTokenを作成しておく必要があります。

まずgit cloneを実行します。がここでエラーが発生しました。

```
$ git clone http://gitlab.example.com/xxxxx/awx-test.git
Cloning into 'awx-test'...
fatal: unable to access 'http://gitlab.example.com/xxxxx/awx-test.git/': Could not resolve host: gitlab.example.com
```
gitlab.example.comが解決できないとのことです。
対応策として今回は`/etc/hosts`にgitlab.example.comを追加し、ポートは直打ちしました。

```
$ git clone http://gitlab.example.com:8010/xxxxx/awx-test.git
Cloning into 'awx-test'...
Username for 'http://gitlab.example.com:8010': {トークン作成時に設定したユーザ名}
Password for 'http://xxxxx@gitlab.example.com:8010':{作成したトークン}
remote: Enumerating objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
Unpacking objects: 100% (3/3), 231 bytes | 23.00 KiB/s, done.
```
クローンが完了したら下記コマンドを実行します。

```
$ ll
total 12
drwxr-xr-x 3 xxx xxx 4096 Dec  5 00:32 ./
drwxr-xr-x 4 xxx xxx 4096 Dec  5 00:00 ../
drwxr-xr-x 3 xxx xxx 4096 Dec  5 00:32 awx-test/
$ cd awx-test/
$ git branch -a
* main
  remotes/origin/HEAD -> origin/main
  remotes/origin/main
```
awx-testがクローンされていることがわかります。
mainブランチのみが存在している状態なので、新規にブランチを作成したいと思います。

```
$ git checkout -b master
Switched to a new branch 'master'
$ git branch
  main
* master
```
作成したmasterブランチにPlaybookをコミットし、プッシュします。

```
$ git add .

$ git commit -m "Initial Commit"
[master b234ec5] Initial Commit
 3 files changed, 12 insertions(+)
 create mode 100644 awx_test.yml
 create mode 100644 roles/awx_test/files/test.txt
 create mode 100644 roles/awx_test/tasks/main.yml

$ git push -u origin master
Username for 'http://gitlab.example.com:8010': {トークン作成時に設定したユーザ名}
Password for 'http://xxxxx@gitlab.example.com:8010':{作成したトークン}
Enumerating objects: 10, done.
Counting objects: 100% (10/10), done.
Delta compression using up to 8 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (9/9), 686 bytes | 343.00 KiB/s, done.
Total 9 (delta 0), reused 0 (delta 0)
remote:
remote: To create a merge request for master, visit:
remote:   http://gitlab.example.com/xxxxx/awx-test/-/merge_requests/new?merge_request%5Bsource_branch%5D=master
remote:
To http://gitlab.example.com:8010/xxxxx/awx-test.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
```
GitLabを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215301/0f8a4802-9a2e-bc08-a297-0642ca2a4d7d.png)
無事プッシュされました。
GitLab側の準備は整いました。




## AWXの設定
AWX側の設定を行っていきます。
AWXにログインすると下記の画面が表示されます。
GitLab上のPlaybookを実行できるようResourcesの設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215301/1480bc4e-7cf5-913e-46b7-58fdef0c4e68.png)

### Hosts
Hostsではその名前の通りホストの登録をします。
ここで登録されているホストを後に記載しているInventoriesに紐づけるようなイメージです。
Resources > Hosts を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215301/c70fe077-c0cf-281f-e4fa-2cfd3bac017e.png)
デフォルトで「localhost」が存在します。今回はlocalhostに対してPlaybookを実行するためホストの追加はしません。
ホストを追加したい場合は「Add」で追加をすることができます。

### Inventories
InventoriesはAnsibleの管理対象を指します。
Resources > Inventories を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215301/d3aae4ab-1310-5789-43e9-4f481c94d9bf.png)
デフォルトで「Demo Inventory」が存在します。
Demo Inventoryを選択してHostsの内容を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215301/5f1d752f-242c-1618-00f9-cf3dd01e1c5a.png)
localhostが登録されています。今回は新たにInventoryは作成せずこれを使用したいと思います。
（Resources > HostsでもlocalhostがDemo Inventoryに登録されていることが分かります）

### Credentials
Credentialsでは認証情報を設定します。
今回はGitLab上のPlaybookを実行するため、GitLabの認証情報を設定していきます。
Resources > Credentials からAddを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215301/d87a0539-2994-123a-d9da-b430c31471a7.png)
上記のように適当なNameを入力し、Credential TypeはSource Controlを選択します。
すると詳細の項目が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215301/6f51f52a-c5d4-3e50-4146-6c8c1daad2a2.png)
GitLabのユーザ名、パスワードを入力したらSaveを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215301/b4104e95-57b3-c673-6493-3b5d99607517.png)
Credentialの追加が完了しました。

### Projects
ProjectsはAnsibleのPlaybookを指します。
（今回はGitLab上のPlaybookを実行するためどのプロジェクトのどのブランチ上のPlaybookかを設定します）
Resources > Projects からAddを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215301/f49cd111-adfd-5af1-0572-093fd0763f19.png)
上記のように適当なNameを入力し、Source Control Credential TypeはGitを選択します。
するとSource Control URLなどの入力項目が表示されます。
Source Control URLにGitLabのURL、Source Control Branchに対象のブランチを入力します。
※AWXのコンテナ内のhostsファイルにgitlab.example.comを追加しています
Source Control Credentialは先ほど追加した認証情報を選択します。

Save後にViews > Jobsを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215301/f77b45c4-d905-cfd2-5efc-393ad39376ff.png)
Jobが正常に完了すればProjectは正常に作成できたことになります。（上記のように左の□が緑色になっていれば正常）
異常があった場合はJobを確認して対処が必要になります。（異常の場合は□が赤になります）

### Templates
TemplatesではどのPlaybookを実行するかを設定します。
Resources > Templatesを押下します。
Add > Add job templateを押下してTemplateの追加を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215301/c6bc79a2-7943-8ffe-937c-d1cb83a795b9.png)
上記のように適当なNameを入力し、Job TypeはRun、InventoryはDemo Inventory、Projectは先程作成したawx-test、Playbookには実行したいyml（今回はawx_test.yml）を選択します。
入力が完了したらSaveします。

ちなみに今回は設定しませんでしたが、Surveyを設定することでTemplate実行時にPlaybookに対してパラメータを渡すことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215301/0a9f5f85-fcec-afad-9f57-dad073f1d5f6.png)

## AWXのテンプレートを実行
AWX側の設定も完了しましたので、早速、作成したAWXテンプレートを実行したいと思います。
Resources > Templatesでロケットのようなマークの「Launch Template」を押下することでテンプレートを実行できます。
テンプレートを実行すると自動的にJobの画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215301/f85c9269-31bd-e7f8-2a08-caaf5a27686f.png)
ジョブは正常に完了したのでファイルの確認をしてみます。
今回はlocalhostに対して実行したので、AWXのコンテナに入り下記コマンドでファイルがコピーされてるか確認しました。

```
# ls /tmp/awx_test/
test.txt
# cat /tmp/awx_test/test.txt
AWX TEST
```
正常にfiles/test.txtがコピーされていました。

## 最後に
無事、AWXでGitLab上のPlaybookを実行することができました。
業務の中で少し触れた経験があるので何となくは分かっていましたが、実際自分で設定をしてみることでより理解が深まりました。