もりはやメモφ(・ω・ )

インフラなエンジニアからSREへ

AWXのバージョンアップをしました (2.1.0 -> 4.0.0)

f:id:morihaya:20190610004613p:plain
AWX4.0.0


最新のAWXが4.0.0に対し、使っていたAWXが2.1.0と古いため、バージョンアップを行いましたのでメモ。 環境はシングルノードでdockerを利用してAWXを動かしていますが、PostgreSQLだけはコンテナじゃなくてノード上の物を利用しています。

TL;DR

要はこれをやっただけ。バックアップもとりましたが、結局利用していないです。 結果として2.1.0を利用している場合、DBさえあればスムーズにアップグレードができると言っていいのかもしれません(個人の環境ですが)

  • AWXとPostgreSQLのバックアップ*1
tower-cli receive --all > assets.json
pg_dump -d awx | gzip >  pg_dump-awx$(date +%Y%m%d-%H%M%S).sql
  • 最新版をgit pull*2
cd <任意の場所>/awx
git pull
git checkout -b 4.0.0 refs/tags/4.0.0
vim  installer/inventory
-> portやpostgresなどの固有設定を反映
  • 既存のAXWコンテナを停止

これはAWXに限定しない危険コマンドなので、手で一つずつ選択して止めることを個人的には推奨します。*3 私の環境はAWX専用だったので手順通りに行いました。

docker rm -f $(docker ps -aq)
  • 通常の手順に従いInstall
# Set the working directory to installer
cd installer

# Run the Ansible playbook
ansible-playbook -i inventory install.yml

最初にバージョンアップについて調べました

ざっと調べて以下の情報を得ました。AnsibleJPのSlackは本当に有意義ですね、最高です。

  • バージョンアップ方法は一般的に、 GitHub - AWX - DATA_MIGRATIONを参照するようだ
  • その他にも awx-migrate というツールを使うことも可能*4
  • どちらにせよインプレースではなくて、別インスタンスとして新バージョンを構築し、データをマイグレーションするのがお作法らしい*5

サーバ

暫定でシングルノードににdockerを入れて起動しています。 /usr/local/srcにawxを git clone しています。

/usr/local/src/awx/

Portは80を既存で使っているので、81にしています。 DBはコンテナではなくホスト側ののPostgreSQLを利用しているので、以下の変更を加えてあります。

[root@morihaya-awx awx]# git diff installer/inventory
diff --git a/installer/inventory b/installer/inventory
index 847ba60..829c68e 100644
--- a/installer/inventory
+++ b/installer/inventory
@@ -36,7 +36,7 @@ dockerhub_base=ansible
 awx_task_hostname=awx
 awx_web_hostname=awxweb
 postgres_data_dir=/tmp/pgdocker
-host_port=80
+host_port=81  <-80は別のが使っているので

 # Docker Compose Install
 # use_docker_compose=false
@@ -62,7 +62,7 @@ docker_compose_dir=/var/lib/awx

 # Set pg_hostname if you have an external postgres server, otherwise
 # a new postgres service will be created
-# pg_hostname=postgresql
+pg_hostname=192.168.1.25 <-自前サーバのアドレス
 pg_username=awx
 pg_password=awxpass
 pg_database=awx
[root@morihaya-awx awx]#

手順

pipでtower-cliを導入(初回のみでいいはず)

バックアップを取るためにtower-cliを入れました*6

root@morihaya-awx ~]# pip3.6 install --upgrade ansible-tower-cli
Collecting ansible-tower-cli
  Downloading https://files.pythonhosted.org/packages/59/69/1094b250355b8ff3f0b0257c4d3527681813ce71ddc94ea37452bb9563cd/ansible-tower-cli-3.3.4.tar.gz (201kB)
    100% |████████████████████████████████| 204kB 4.3MB/s
Collecting click>=2.1 (from ansible-tower-cli)
  Downloading https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl (81kB)
...

tower-cliをセットアップ

[root@morihaya-awx ~]# tower-cli config host http://localhost:81
Configuration updated successfully.
[root@morihaya-awx ~]# tower-cli config username admin
Configuration updated successfully.
[root@morihaya-awx ~]# tower-cli config password <いつもの>
Configuration updated successfully.
[root@morihaya-awx ~]#

sslデフォで怒られたので以下も*7

[root@morihaya-awx ~]# tower-cli config verify_ssl False
Configuration updated successfully.

認証が通ればコマンドが使えるようになります。

root@morihaya-awx ~]# tower-cli job list
=== ============ =========================== ========== =======
id  job_template           created             status   elapsed
=== ============ =========================== ========== =======
152            8 2019-03-08T10:30:26.525586Z successful 8.592
154            8 2019-03-08T10:31:43.861547Z successful 8.3
157            8 2019-03-08T10:34:52.908101Z successful 7.088
159            8 2019-03-08T10:35:43.064671Z successful 12.624
161            8 2019-03-08T10:36:08.166623Z successful 11.654
164            8 2019-03-08T10:38:38.675969Z successful 17.196
166            8 2019-03-08T10:39:19.571107Z successful 8.659
168            8 2019-03-08T10:39:47.273167Z successful 37.796

AWXの情報をバックアップ(結局使わなかった)

以下を実行する

tower-cli receive --all > assets.json

assets.jsonは以下のサイズだった。大したことはないですね。 ただし、中身を見るとパスワードや秘密鍵などの秘密情報は出ていないように見えました。

[root@morihaya-awx ~]# ll -h assets.json
-rw-r--r-- 1 root root 12K  6月  8 14:06 assets.json
[root@morihaya-awx ~]#

PostgreSQLのバックアップ(結局使わなかった)

ホストサーバで以下を実施します。コンテナ外部のPostgresを使っているので。

su - postgres
pg_dump -d awx | gzip >  pg_dump-awx$(date +%Y%m%d-%H%M%S).sql

こちらもサイズ的には小さいですね。

-bash-4.2$ ll -h pg_dump*
-rw-r--r-- 1 postgres postgres 277K  6月  8 15:00 pg_dump-awx20190608-150030.sql
-bash-4.2$

アップグレード

まずはリポジトリを最新化します。

cd /usr/local/src/awx
git status

#inventoryをバックアップ
cp -p installer/inventory /tmp/
git co installer/inventory

git pull
vim  installer/inventory
-> portやpostgresなどの固有設定を反映

安全のため最新バージョンのタグのCommitを使う*8

git co -b 4.0.0 refs/tags/4.0.0

その後は手順にしたがって

#これ実行するとAWX以外のコンテナも止まるから注意
#docker rm -f $(docker ps -aq)

#こっちの方が安心
docker rm -f  <awxのコンテナ>
make clean-ui

git pull


# Set the working directory to installer
cd installer

# Run the Ansible playbook
ansible-playbook -i inventory install.yml

すると以下のような画面がしばらく表示され完了します。

f:id:morihaya:20190610002015p:plain ログを見たい場合はdockerコマンドを実行します。

docker logs -f awx_task

こうして無事に4.0.0になりました。よかったよかった。

f:id:morihaya:20190610004613p:plain
AWX4.0.0

ハマったこと

何も考えずにgit cloneしただけのブランチで作業を進めたらエラーで起動してこなかった

git clone直後は devel というブランチで、そのまま作業を進めてもエラーになってしまった(docker logs -f でぐるぐるし続ける...) 気を取り直して git co -b 4.0.0 refs/tags/4.0.0 とタグ付きのコミットでリトライしたところ、無事に動作しました。

dockerのインターナルIPが変わったらしくてPostgreSQLのpg_hbaに引っかかっていたので多めに許可。

ログイン画面が起動してこないため、 docker logs -f awx_task を見た所 "pg_hba.conf" に許可されていないというメッセージがで続けていた。 PostgreSQLのNW許可が、Dockerが利用するインターナルなセグメントの許可が甘かったので、以下のようにざっくり開けちゃいました。

su - postgres
cd /var/lib/pgsql/10/data
cp -p pg_hba.conf pg_hba.conf.20190608
vi pg_hba.conf

-bash-4.2$ diff pg_hba.conf.20190608 pg_hba.conf
99c99
< host    all             all             172.17.0.0/16           trust
---
> host    all             all             172.0.0.0/8            trust
-bash-4.2$

pg_ctl reload

で対応しました。(個人検証環境なのでまあ、ガバガバでもいいかな)

*1:結局使わなかった

*2:cloneじゃないのは既存がすでにあるので

*3:でも手順にこうある

*4:どうも1 -> 2へのVUP時はシークレット情報が消えたらしい。。

*5:今回は検証環境でしたので、バックアップを取ってえいやでやりました

*6:結局バックアップから戻すことはありませんでしたが

*7:良いこのみんなはSSLを使いましょう

*8:ここでは4.0.0、2019/06/09時点の最新安定版