haku-maiのブログ

インフラエンジニアですが、アプリも作ります。

【ansible/awx:19.4.0】ubuntu:20.04.2にansible awx:19.4.0をdockerでインストールする

本記事で行うこと

  • ubuntu:20.04.2にansible awxをバージョン指定で19.4.0をdockerでインストールし、ログインまで行う

本記事で行わないこと

  • docker/docker composeのインストール
  • python3のインストール
  • gitのインストール
  • ansible のインストール

モチベーション

  • RKE2の検証時に、自宅サーバ設定を何度もやり直すことになり手動が面倒になったため。
  • awxを数年ぶりに触って見たくなったため。

環境

$ cat /etc/os-release |grep VERSION
VERSION="20.04.3 LTS (Focal Fossa)"
VERSION_ID="20.04"
VERSION_CODENAME=focal
  • docker/docker-compose
$ docker --version
Docker version 20.10.7, build f0df350

$ docker-compose --version
docker-compose version 1.26.0, build d4451659
$ python3 --version
Python 3.8.10
  • ansible
$ ansible --version
ansible 2.9.6
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/haku-mai/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.8.10 (default, Sep 28 2021, 16:10:42) [GCC 9.3.0]

参考サイト

github.com

  • dockerを利用したawxのインストール手順

awx/README.md at devel · ansible/awx · GitHub

前提条件

  • docker/docker-composeがインストールされていること
  • python3がインストールされていること
  • gitがインストールされていること
  • ansibleがインストールされていること

git clone

  • まずAWXのモジュールを持ってきます。
  • 最新のHEADは安定していないので、Brunch指定でcloneします。
  • 2021/10/15時点の最新は以下ですので、本記事は以下のバージョンを利用します。

Release 19.4.0 · ansible/awx · GitHub

$ git clone -b 19.4.0 https://github.com/ansible/awx.git
cd awx/
$ ls -l
合計 140
-rw-rw-r--  1 haku-mai haku-mai  2556 10月 15 09:21 API_STANDARDS.md
-rw-rw-r--  1 haku-mai haku-mai   303 10月 15 09:21 CHANGELOG.md
-rw-rw-r--  1 haku-mai haku-mai  9149 10月 15 09:21 CONTRIBUTING.md
-rw-rw-r--  1 haku-mai haku-mai   385 10月 15 09:21 DATA_MIGRATION.md
-rw-rw-r--  1 haku-mai haku-mai  1620 10月 15 09:21 DCO_1_1.md
-rw-rw-r--  1 haku-mai haku-mai  2265 10月 15 09:21 INSTALL.md
-rw-rw-r--  1 haku-mai haku-mai  5137 10月 15 09:21 ISSUES.md
-rw-rw-r--  1 haku-mai haku-mai  9304 10月 15 09:21 LICENSE.md
-rw-rw-r--  1 haku-mai haku-mai  1095 10月 15 09:21 MANIFEST.in
-rw-rw-r--  1 haku-mai haku-mai 19736 10月 15 09:21 Makefile
-rw-rw-r--  1 haku-mai haku-mai  3240 10月 15 09:21 README.md
-rw-rw-r--  1 haku-mai haku-mai     7 10月 15 09:21 VERSION
drwxrwxr-x 12 haku-mai haku-mai  4096 10月 15 09:21 awx
drwxrwxr-x  8 haku-mai haku-mai  4096 10月 15 09:21 awx_collection
drwxrwxr-x  4 haku-mai haku-mai  4096 10月 15 09:21 awxkit
drwxrwxr-x  2 haku-mai haku-mai  4096 10月 15 09:21 config
drwxrwxr-x 10 haku-mai haku-mai  4096 10月 15 09:21 docs
-rwxrwxr-x  1 haku-mai haku-mai   149 10月 15 09:21 manage.py
-rwxrwxr-x  1 haku-mai haku-mai   265 10月 15 09:21 pre-commit.sh
-rw-rw-r--  1 haku-mai haku-mai   103 10月 15 09:21 pyproject.toml
-rw-rw-r--  1 haku-mai haku-mai   521 10月 15 09:21 pytest.ini
drwxrwxr-x  2 haku-mai haku-mai  4096 10月 15 09:21 requirements
-rwxrwxr-x  1 haku-mai haku-mai  5700 10月 15 09:21 setup.py
drwxrwxr-x 13 haku-mai haku-mai  4096 10月 15 09:21 tools
-rw-rw-r--  1 haku-mai haku-mai   313 10月 15 09:21 tox.ini

docker imageの作成

  • makeコマンドで作成します。
# バージョン固定
$ export DEVEL_IMAGE_NAME=quay.io/awx/awx_devel:19.4.0

# Makefileがあるディレクトリで
$ ls -l Makefile
-rw-rw-r-- 1 haku-mai haku-mai 19736 10月 15 09:21 Makefile

$ make docker-compose-build

$ docker images
REPOSITORY                    TAG       IMAGE ID       CREATED         SIZE
quay.io/awx/awx_devel         19.4.0    c5566c6146d9   6 minutes ago   2.09GB
  • 余談ですが実際にはMakefileには以下のように記載されていて、これを実行しているだけです。
# Base development image build
docker-compose-build:
    ansible-playbook tools/ansible/dockerfile.yml -e build_dev=True
    DOCKER_BUILDKIT=1 docker build -t $(DEVEL_IMAGE_NAME) \
        --build-arg BUILDKIT_INLINE_CACHE=1 \
        --cache-from=$(DEV_DOCKER_TAG_BASE)/awx_devel:$(COMPOSE_TAG) .

awxの実行

テスト実行

  • makefileを見るとテストコマンドがあったので一度実行します。
$ COMPOSE_TAG=19.4.0 make docker-compose-runtest
  • すべてPASSEDになったため実行します

  • ※このタイミングで他のdocker imagesがpullされます。

$ docker images
REPOSITORY                          TAG       IMAGE ID       CREATED        SIZE
quay.io/awx/awx_devel               19.4.0    c5566c6146d9   13 hours ago   2.09GB
postgres                            12        fd694ed1533c   3 days ago     371MB
redis                               latest    7faaec683238   3 days ago     113MB
quay.io/project-receptor/receptor   latest    ac55a9332b22   3 months ago   313MB

実行

  • バージョン指定、デタッチドモードで起動しますが、マニュアル通り19.4.0で実行すると怒られます。
$ COMPOSE_TAG=19.4.0 COMPOSE_UP_OPTS=-d make docker-compose
make: *** 'docker-compose' に必要なターゲット 'docker-auth' を make するルールがありません.  中止.
  • これはMakefileからdocker-authが削除されているにも関わらず、コマンドの引数として設定されているからになります。
  • 2021/10/15時点では以下のcommitで修正されていますが、このときの最新のtagの19.4.0にはこの修正が含まれていません。

Fix docker-compose targets · ansible/awx@57c9b14 · GitHub

  • Makefileを修正して再実行します。
  • docker-auth部分を削除します。

Makefileの修正

docker-compose: docker-auth awx/projects docker-compose-sources
        docker-compose -f tools/docker-compose/_sources/docker-compose.yml $(COMPOSE_OPTS) up $(COMPOSE_UP_OPTS) --remove-orphans
# ↓
docker-compose: awx/projects docker-compose-sources
        docker-compose -f tools/docker-compose/_sources/docker-compose.yml $(COMPOSE_OPTS) up $(COMPOSE_UP_OPTS) --remove-orphans

再実行

$ COMPOSE_TAG=19.4.0 COMPOSE_UP_OPTS=-d make docker-compose

$ docker ps
CONTAINER ID   IMAGE                                      COMMAND                  CREATED          STATUS          PORTS                                                                                                                                                                                                                                                                                                                                     NAMES
782c9236f1ec   quay.io/awx/awx_devel:devel                "/entrypoint.sh rece…"   5 minutes ago    Up 5 minutes    22/tcp, 8013/tcp, 8043/tcp, 8080/tcp                                                                                                                                                                                                                                                                                                      tools_receptor_1
b22a5a71fc92   quay.io/awx/awx_devel:devel                "/entrypoint.sh rece…"   5 minutes ago    Up 5 minutes    22/tcp, 8013/tcp, 8043/tcp, 8080/tcp                                                                                                                                                                                                                                                                                                      tools_receptor_2
51d0fd4cfa94   quay.io/project-receptor/receptor:latest   "/usr/bin/dumb-init …"   5 minutes ago    Up 5 minutes    0.0.0.0:5555->5555/tcp, :::5555->5555/tcp, 7323/tcp                                                                                                                                                                                                                                                                                       tools_receptor_hop
832940d3fc45   quay.io/awx/awx_devel:19.4.0               "/entrypoint.sh laun…"   5 minutes ago    Up 5 minutes    0.0.0.0:2222->2222/tcp, :::2222->2222/tcp, 0.0.0.0:6899->6899/tcp, :::6899->6899/tcp, 0.0.0.0:7899-7999->7899-7999/tcp, :::7899-7999->7899-7999/tcp, 0.0.0.0:8013->8013/tcp, :::8013->8013/tcp, 0.0.0.0:8043->8043/tcp, :::8043->8043/tcp, 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 22/tcp, 0.0.0.0:8888->8888/tcp, :::8888->8888/tcp   tools_awx_1
3bc2e00c9029   postgres:12                                "docker-entrypoint.s…"   27 minutes ago   Up 27 minutes   5432/tcp                                                                                                                                                                                                                                                                                                                                  tools_postgres_1
05398afb1d6b   redis:latest                               "redis-server /usr/l…"   27 minutes ago   Up 27 minutes   6379/tcp                                                                                                                                                                                                                                                                                                                                  tools_redis_1

UIをクリーンアップして構築する

  • UIを利用できるように以下コマンドを実行します。
$ docker exec tools_awx_1 make clean-ui ui-devel

*ここまで完了したら、webアクセスできます。 * 証明書がないためブラウザによっては、アクセス拒否されて、400エラーになったりします。 * 私はsafafiで接続しました。

https://XXXXXXXX:8043/#/login

  • httpはこちら

https://XXXXXXXX:8013/#/login

  • むちゃくちゃ・・・ダサい!!!
  • 昔は中二感あったロゴだったはずなのですが・・・

f:id:n-guitar:20211015114318p:plain

管理ユーザの作成

  • ログイン用の管理ユーザを作成します。
$ docker exec -ti tools_awx_1 awx-manage createsuperuser

Username (leave blank to use 'awx'): haku-mai
Email address:
Password:
Password (again):
Superuser created successfully.
  • 作成したユーザでログインします。
  • アイコンダサすぎないですか?

f:id:n-guitar:20211015114815p:plain:w600

ロゴの変更

  • あまりにもロゴがダサいで変更します。
  • ちゃんと変更機能がありました。

f:id:n-guitar:20211015115228p:plain:w600 f:id:n-guitar:20211015115344p:plain:w600 f:id:n-guitar:20211015115610p:plain:w600

  • とても残念なことに、認証画面しか変わりませんでした・・・
  • なんか3週くらいして、かっこよく見えてきたのでもうこれで良しとします。

f:id:n-guitar:20211015115654p:plain:w600 f:id:n-guitar:20211015115733p:plain:w600

*正直UIが数年前と結構変わっていて、少し検証が必要です。

サーバにpingするまで

guthub repoの作成

  • 適当なrepoを作成し、サンプルでplaybookを作ります。
---
- name: sample
  hosts: nucbox-002-hkm
  gather_facts: no
  collections:
    - ansible.builtin
  tasks:
    - name: 疎通チェック
      ping:

トークンの作成

  • Settings -> Developer settings -> personal access tokens から作成します。
  • repoの読み取りのみで問題ありません。
  • ここで取得したトークンを認証情報で設定します。
  • ※このトークンは絶対に外部に流出させないように!

f:id:n-guitar:20211015194700p:plain:w400

f:id:n-guitar:20211015194840p:plain:w600

認証情報の登録

github
  • GitHub パーソナルアクセストークンと記載されていますが、これは使いません。罠です。

f:id:n-guitar:20211015194235p:plain:w600

  • ソースコントロールが正解。少しハマりました。

f:id:n-guitar:20211015195243p:plain:w600

OSログイン情報
  • テストなのでパスワード認証にしてきます。
  • SSH公開鍵認証が良いと思います。

f:id:n-guitar:20211015205529p:plain:w600

プロジェクトの登録

  • プロジェクトというのは論理的なplaybookのコレクションみたいなもので、今回はgitrepoにあるplaybookをひっぱてくる場所みたいなものです。
  • 登録後、成功になっていればOKです。

f:id:n-guitar:20211015195504p:plain:w600

f:id:n-guitar:20211015203002p:plain:w600

インベントリーの登録

  • インベントリーを作り、ホストを登録していきます。

f:id:n-guitar:20211015205730p:plain:w600 f:id:n-guitar:20211015210001p:plain:w600 f:id:n-guitar:20211015211434p:plain:w600

ホストの登録
  • ホスト名をgithubに登録したhosts: nucbox-002-hkmに合わせます。

f:id:n-guitar:20211015211517p:plain:w600

---
ansible_host: 192.168.XXX.XXX

f:id:n-guitar:20211015211607p:plain:w600

テスト実行

f:id:n-guitar:20211015211836p:plain:w600 f:id:n-guitar:20211015211930p:plain:w600 f:id:n-guitar:20211015215315p:plain:w600 f:id:n-guitar:20211015215336p:plain:w600 f:id:n-guitar:20211015221405p:plain:w600

  • 問題なく実行できました。

f:id:n-guitar:20211015221447p:plain:w600

テンプレートの作成

  • github repoに作成したplaybookを実行します。
  • 追加から新規ジョブテンプレートの追加

f:id:n-guitar:20211015203106p:plain:w600

  • JOB名、インベントリー、プロジェクト、実行環境、Playbook、認証情報を選択します。
  • Playbookはgithubからcloneした値が出てきます。

f:id:n-guitar:20211015221939p:plain:w600

  • 保存して、起動を押します。

f:id:n-guitar:20211015222002p:plain:w600

  • 無事pingが成功しました。

f:id:n-guitar:20211015223939p:plain:w600

  • 以上ubuntu:20.04.2にansible awx:19.4.0をdockerでインストールするでした。

余談

以前のバージョンについて

  • 以前のバージョンは中二感丸出しのロゴが使われてました。
  • これから

f:id:n-guitar:20211015225523p:plain:w400

  • これになったので超びっくりしました。

f:id:n-guitar:20211015225745p:plain:w400

  • ui_nextという形でAWX 16.0.0 から変更になったようです。
  • 前のほうが好きだったけど、この謎のキャラクタを好きになろうと思います。

2020年のAWXの世界を少しだけ覗いちゃう - 赤帽エンジニアブログ

docker-compose.yamlについて

  • 実行するdocker-compose.yamlは少し微妙です。
  • バージョン指定したのに、awx/awx_devel:devel箇所があります。
  • 修正して実行しても良かったのですが、まぁいいかなと割り切りました。
$ cat  tools/docker-compose/_sources/docker-compose.yml
---
version: '2.1'
services:
        # Primary AWX Development Container
  awx_1:
    user: "1000"
    image: "quay.io/awx/awx_devel:19.4.0"
    container_name: tools_awx_1
    hostname: awx_1
    command: launch_awx.sh
    environment:
      OS: " Operating System: Ubuntu 20.04.3 LTS"
      SDB_HOST: 0.0.0.0
      SDB_PORT: 7899
      AWX_GROUP_QUEUES: tower
      MAIN_NODE_TYPE: "${MAIN_NODE_TYPE:-hybrid}"
      RECEPTORCTL_SOCKET: /var/run/awx-receptor/receptor.sock
      RUN_MIGRATIONS: 1
    links:
      - postgres
      - redis_1
    working_dir: "/awx_devel"
    volumes:
      - "../../../:/awx_devel"
      - "../../docker-compose/supervisor.conf:/etc/supervisord.conf"
      - "../../docker-compose/_sources/database.py:/etc/tower/conf.d/database.py"
      - "../../docker-compose/_sources/websocket_secret.py:/etc/tower/conf.d/websocket_secret.py"
      - "../../docker-compose/_sources/local_settings.py:/etc/tower/conf.d/local_settings.py"
      - "../../docker-compose/_sources/SECRET_KEY:/etc/tower/SECRET_KEY"
      - "../../docker-compose/_sources/receptor/receptor-awx-1.conf:/etc/receptor/receptor.conf"
      # - "../../docker-compose/_sources/certs:/etc/receptor/certs"  # TODO: optionally generate certs
      - "/sys/fs/cgroup:/sys/fs/cgroup"
      - "~/.kube/config:/var/lib/awx/.kube/config"
      - "redis_socket_1:/var/run/redis/:rw"
    privileged: true
    tty: true
    ports:
      - "7899-7999:7899-7999"  # sdb-listen
      - "6899:6899"
      - "8080:8080"  # unused but mapped for debugging
      - "8888:8888"  # jupyter notebook
      - "8013:8013"  # http
      - "8043:8043"  # https
      - "2222:2222"  # receptor foo node
  redis_1:
    image: redis:latest
    container_name: tools_redis_1
    volumes:
      - "../../redis/redis.conf:/usr/local/etc/redis/redis.conf"
      - "redis_socket_1:/var/run/redis/:rw"
    entrypoint: ["redis-server"]
    command: ["/usr/local/etc/redis/redis.conf"]
  # A useful container that simply passes through log messages to the console
  # helpful for testing awx/tower logging
  # logstash:
  #   build:
  #     context: ./docker-compose
  #     dockerfile: Dockerfile-logstash
  postgres:
    image: postgres:12
    container_name: tools_postgres_1
    environment:
      POSTGRES_HOST_AUTH_METHOD: trust
      POSTGRES_USER: awx
      POSTGRES_DB: awx
      POSTGRES_PASSWORD: vEUithzhAYIeRdMQGfVI
    volumes:
      - "awx_db:/var/lib/postgresql/data"
  receptor-hop:
    image: quay.io/project-receptor/receptor:latest
    user: root
    container_name: tools_receptor_hop
    hostname: receptor-hop
    command: 'receptor --config /etc/receptor/receptor.conf'
    links:
      - awx_1
    ports:
      - "5555:5555"
    volumes:
      - "../../docker-compose/_sources/receptor/receptor-hop.conf:/etc/receptor/receptor.conf"
  receptor-1:
    image: quay.io/awx/awx_devel:devel
    user: "1000"
    container_name: tools_receptor_1
    hostname: receptor-1
    command: 'receptor --config /etc/receptor/receptor.conf'
    environment:
      RECEPTORCTL_SOCKET: /var/run/awx-receptor/receptor.sock
    links:
      - receptor-hop
    volumes:
      - "../../docker-compose/_sources/receptor/receptor-worker-1.conf:/etc/receptor/receptor.conf"
      - "/sys/fs/cgroup:/sys/fs/cgroup"
    privileged: true
  receptor-2:
    image: quay.io/awx/awx_devel:devel
    user: "1000"
    container_name: tools_receptor_2
    hostname: receptor-2
    command: 'receptor --config /etc/receptor/receptor.conf'
    environment:
      RECEPTORCTL_SOCKET: /var/run/awx-receptor/receptor.sock
    links:
      - receptor-hop
    volumes:
      - "../../docker-compose/_sources/receptor/receptor-worker-2.conf:/etc/receptor/receptor.conf"
      - "/sys/fs/cgroup:/sys/fs/cgroup"
    privileged: true

volumes:
  awx_db:
    name: tools_awx_db
  redis_socket_1:
    name: tools_redis_socket_1