Ansible AWXとGitLabを組合わせて構成管理の仕組みを構築

# 背景
下記の様な構成管理情報を管理したいがExcelでは管理したくない
自動的に各種情報を取得して、バージョン管理を実施
変更があった時のみ管理者に通知する仕組みを作りたい

* オンプレのネットワーク機器のConfig情報（FWのルール情報なども）
* オンプレのネットワーク機器のポートステータス情報
* ZABBIXに登録されているホスト情報など
* vCenterに登録されてるホスト情報など
* その他導入済み運用ツール（Pleasanterなど）の変更履歴情報など

# 作成した環境
![AWX1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/e540ad55-c565-736d-ebb5-98ab5d3cb83f.png)

# GitLab上に取得される情報の例
* 各種情報毎にプロジェクトを分けている

![AWX4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/e29d20ff-273a-0895-1323-5e561da1caff.png)

* プロジェクトの中でネットワーク機器であればホスト毎にConfigが取得される

![AWX5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/bae6fabb-74a8-57d0-c5ec-9fbddd32699d.png)


# 通知の例

![AWX2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/216cc87c-3cb2-6902-4bad-8f2fda468c30.png)

* git pushでGitLabに取得情報がアップロードされる
* 差分（変更）があった場合のみメール通知する設定
* 追加箇所は緑、削除箇所は赤で表示される

# 構築概要
## Ansible AWXのインストール
Dockerイメージが公開されている
Playbookの実行はtaskコンテナ内で実行されるため注意
例えば対象ホストの名前解決が必要な場合はホスト側ではなくコンテナ側で名前解決出来る必要がある

## GitLabのインストール
手順に従ってインストールする。今回はAWXと同様のサーバ上に構築

## PlayBookの作成
各種PlayBookを作成する。Ansibleのモジュールがあるものについてはそれを使用
vsphereの情報取得ならvmware_vm_info、vmware_guest_infoをCiscoスイッチのConfig取得ならios_commandを使用
ZABBIXのモジュールもあるが、取得したい情報が取得出来なかったためZABBIX APIで取得
（あまり推奨されていないが）Shellモジュールを使用してshellをキック。shellの中でZABBIX APIを呼ぶ構成とする

## Ansible AWXコンソールから各種設定
一例として、下記の様な形で設定
プロジェクトでPlaybook保存先を指定するが、GitLabのリポジトリを指定
ジョブテンプレートがジョブの実行単位となりこれにプロジェクトやインベントリ（どのホストを対象にするか）などを紐づける

![AWX3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/a83f04de-d334-2098-4a0c-91e83ad8b0d8.png)

# 構築手順
## 1．Ansible AWXのインストール

* パッケージインストール

```bash
yum update -y
yum -y install epel-release
yum install -y ansible python3 docker-compose yum-utils libselinux-python3 git
```

* Dockerインストール

```bash
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
```


* インストール確認

```bash
ansible --version
python3 -V
docker --version
git --version
```

* Dockerデーモン設定

 社内プロキシ使用環境のため、下記設定が必要であった

```bash:/usr/lib/systemd/system/docker.service
Environment="HTTP_PROXY=xx.xx.xx.xx:xxxx"
Environment="HTTPS_PROXY=xx.xx.xx.xx:xxxx"
```

```bash
systemctl daemon-reload
systemctl restart docker
docker info
```

* AWXインストール

```bash
git clone https://github.com/ansible/awx.git -b 15.0.1 --depth 1
cd awx/installer/
```

```bash:inventory
http_proxy=xx.xx.xx.xx:xxxx
https_proxy=xx.xx.xx.xx:xxxx
project_data_dir=/var/lib/awx/projects
postgres_data_dir=/var/lib/awx/pgdocker
docker_compose_dir=/var/lib/awx/awxcompose
```

```bash
ansible-playbook -i inventory install.yml
```

エラーなく完了すればOK

* AWX接続

http\://xx.xx.xx.xx(admin/password)

* docker-compose設定ファイル修正

環境にあわせてDNS、DNSサフィックス設定、プロキシ設定、ローカルディレクトリのマウント設定など

## 2．GitLabのインストール

* GitLabインストール

同一のサーバ上でAWXが80ポートで稼働しているため8081ポートで設定

```bash
yum install -y policycoreutils-python curl openssh-server openssh-clients
systemctl enable postfix
systemctl start postfix
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
EXTERNAL_URL="http://xx.xx.xx.xx:8081" yum install -y gitlab-ce
```

* GitLab設定

```bash:/etc/gitlab/gitlab.rb
external_url 'http://xx.xx.xx.xx:8081'
unicorn['listen'] = 'xx.xx.xx.xx'
unicorn['port'] = 8082
nginx['enable'] = true
nginx['listen_port'] = 8081
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
sudo gitlab-ctl status
```

* 接続確認

http\://xx.xx.xx.xx:8081

* 秘密鍵作成

ローカルで秘密鍵を作成し公開鍵をGitLab側に登録する
秘密鍵はコンテナ側からもアクセス出来る様にしておく
コンテナ側からGitLabにアクセスする際の鍵認証で使用するため

```bash
cd ~/.ssh
ssh-keygen -t rsa

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
```

* 公開鍵登録

http\://xx.xx.xx.xx:8081/profile/keysにアクセスし下記入力

titleに公開鍵名(id_rsa.pub)
Expire atに20xx/xx/xx
keyに公開鍵(id rsa.pubの内容)


## 3．PlayBookの作成

* hostsにAWXで作成するグループ指定
* 認証パラメータはAWX側で管理するため不要に
* Inventory hostnameにホスト名が入る


## 4．PlayBookの作成例

https://github.com/Toru-Kubota/Ansible-Network-Module


* Cisco Config取得のPlaybook作成例

```bash
- hosts: Cisco_All
  gather_facts: no
  connection: local
  tasks:
    - name: Config Backup
      ios_command:
        commands:
          - show run
        authorize: true
        auth_pass: **********
        timeout: 30
      register: result
    - name: save config to file
      copy:
        content: "{{ result.stdout[0]}}"
        dest: "/var/lib/awx/projects/xxxxxx/xxxxxx/{{ inventory_hostname }}.txt"
```

## 5．Ansible AWXコンソールから各種設定

* コンソールログイン後、各種設定実施

![AWX6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/7135337a-9958-9676-6215-7b63958d3dfc.png)