らくがきちょう

なんとなく

AmazonLinux2 + Nginx + Python3.x + Ansible AWX 環境を構築する

AmazonLinux2 に AWX をインストールする手順をメモしておきます。

環境

今回は以下の環境を構築します。

  • ベースは AmazonLinux2
  • インスタンスサイズは t2.small
  • pyenv で Python 3.7.4 環境を構築
  • フロントエンドは Nginx で SSL/TLS を終端させる

構築完了後、各コンポーネントのバージョンは以下になりました。

インスタンスサイズ

AWX では複数のコンテナを組み合わせて利用することになり、それなりのスペックを要求します。 AWSインスタンスサイズが t2.micro では SWAP が多発する為、t2.small の利用をお勧めします。

pyenv 環境の構築

pyenv が依存するパッケージをインストールします。

yum -y install \
  bzip2-devel \
  gcc \
  gcc-c++ \
  git \
  libffi-devel \
  make \
  openssl-devel \
  readline-devel \
  sqlite-devel \
  zlib-devel

pyenv 自体をインストールします。

curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash

pyenv が必要とする環境変数を追加し、反映します。

cat << 'EOS' >> ~/.bashrc
export PATH="/root/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
EOS
source ~/.bashrc

Python 3.7.4 のインストール

pyenv で Python 3.7.4 をインストールします。 pyenv installPython をビルドするので、完了するまで数分はかかるはずです。

pyenv install 3.7.4
pyenv global 3.7.4
pyenv rehash

pip のアップデート

今後、更に AWX が依存するパッケージや Python モジュールをインストールしていきますが、先んじて pip 自体を最新版にアップデートしておきます。

pip install pip --upgrade

関連パッケージのインストール (docker & git)

AWX をインストールする上で必要になる docker と git をインストールしておきます。

yum -y install \
  docker \
  git

Docker の自動起動&起動設定

docker を自動起動&起動設定しておきます。

systemctl enable docker
systemctl start docker

Python モジュールのインストール

pip で Ansible と docker-compose をインストールしておきます。 docker-compose はバージョンを指定せず、最新バージョンをインストールしようとすると「別モジュールが依存している requests モジュールのバージョン」と「docker-compose モジュールが要求する requests モジュールのバージョン」が衝突してしまうようで、インストールが出来ません。 そこで docker-compose モジュールはエラー無くインストール出来るバージョン 1.32.2 を指定してインストールします。

pip install ansible
pip install docker-compose~=1.23.2

AWX のインストール

まず、GitHub から clone します。 フロントエンドに Nginx を設置するので、AWX 付属の Web サーバはローカルアドレス (127.0.0.1) を Listen するように変更します。 設定ファイルの修正が完了したら ansible-playbook でインストールを開始します。

git clone https://github.com/ansible/awx.git
cd ./awx/installer
sed -i -e "s/host_port=80/host_port=127.0.0.01:8080/g" inventory
sed -i -e "s/host_port_ssl=443/host_port_ssl=127.0.0.1:8443/g" inventory
ansible-playbook -i inventory install.yml

インストールが完了しました。 コンテナの状況を確認すると以下のようになっていました。

# docker ps
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                                                 NAMES
b8fbd71fb87b        ansible/awx_task:6.1.0       "/tini -- /bin/sh -c…"   3 minutes ago       Up 3 minutes        8052/tcp                                              awx_task
3b2273304754        ansible/awx_web:6.1.0        "/tini -- /bin/sh -c…"   3 minutes ago       Up 3 minutes        127.0.0.1:80->8052/tcp                                awx_web
a7367810eb5b        ansible/awx_rabbitmq:3.7.4   "docker-entrypoint.s…"   3 minutes ago       Up 3 minutes        4369/tcp, 5671-5672/tcp, 15671-15672/tcp, 25672/tcp   awx_rabbitmq
cea6f30759e8        postgres:9.6                 "docker-entrypoint.s…"   3 minutes ago       Up 3 minutes        5432/tcp                                              awx_postgres
270a611afa0f        memcached:alpine             "docker-entrypoint.s…"   3 minutes ago       Up 3 minutes        11211/tcp                                             awx_memcached

サーバ証明書の用意

今回は AWX のフロントエンドに Nginx を配置し、SSL/TLS サーバ証明書を終端させます。 予め、サーバ証明は任意のディレクトリに用意しておきます。 今回は /etc/letsencrypt/certificates/ へ証明書や秘密鍵をインストールしておきました。

mkdir -p /etc/letsencrypt/certificates/

Nginx

続いて Nginx を構築していきます。

インストール

AmazonLinux 標準リポジトリ上の Nginx はバージョンが低い為、Nginx 公式リポジトリから Nginx をインストールします。 まず、リポジトリの定義ファイルを作成します。 /etc/yum.repos.d/nginx.repo を以下の内容で新規作成します。

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key

リポジトリの定義が出来たので、Nginx をインストールします。

yum check-update
yum -y install nginx

SSL/TLS 設定

Nginx で SSL/TLS を終端すべく、/etc/nginx/conf.d/awx.conf を以下の内容で新規作成します。

upstream awx {
  server localhost:8080;
}

server {
    listen       80;
    server_name  awx.example.com;
    return       301 https://$host$request_uri;
}

server {
    listen              443 ssl http2;
    server_name         awx.example.com;
    ssl_certificate     /etc/letsencrypt/certificates/example.com.crt;
    ssl_certificate_key /etc/letsencrypt/certificates/example.com.key;
    ssl_protocols       TLSv1.1 TLSv1.2;
    ssl_ciphers         'ECDH !aNULL !eNULL !SSLv2 !SSLv3';

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    location / {
        proxy_pass http://awx;
        proxy_redirect http:// https://;
    }
}

自動起動&起動

準備が出来たので、Nginx を自動起動&起動設定します。

systemctl enable nginx
systemctl start nginx

AWX へログインする

docker コンテナが起動完了するまで待った後、ブラウザで https://awx.example.com へアクセスし、以下のような画面が表示されれば AWX のインストールは完了です。

f:id:sig9:20190721150452p:plain:w800

AWX への初期ログイン情報はインストール時に利用した awx/installer/inventory に定義されていますが、変更していなければ下記です。

項目
ユーザ名 admin
パスワード password

AWX へのログインに成功すると下記のような画面に遷移するはずです。

f:id:sig9:20190721150841p:plain:w800