てくなべ (tekunabe)

ansible / network automation / 学習メモ

[AWX/Ansible] 開発用に AWX の UI と API の環境を別々につくってみた

はじめに

AWX のユーザーインターフェイスを少し修正したい機会があって、どうやって試す環境を作れるのだろうと調べていました。

このあたりは公式ドキュメントがしっかりしていて、以下のページが非常に参考になりました。

私の環境で、おそらく必要最低限の手順でやってみたので、まとめました。

大きく分けて API 側(バックエンド)と、UI 側(フロントエンド)の環境を作っていきます。

全体

今回いじりたいのは UI 側だけです。現状 React 17 系で作られているようです。

環境

私の環境は以下のとおりです。開発イメージのビルドなどする際に ansible が利用されるので ansible もインストールしておきます。

% docker --version
Docker version 20.10.17, build 100c701

% ansible --version
ansible [core 2.13.2]

% node --version
v17.5.0

% npm --version
8.4.1

要件については、それぞれ以下のドキュメントにに記載があります。

AWX は開発スピードが早いため、本ブログに書いたことが通用しなくなっているかもしれません。最新は公式ドキュメントを参照してください。

準備

まず GitHub の awx リポジトリから git clone します。

今回はあとでプルリクを出す想定なこともあって、先に forks してそのリポジトリ clone しました。

% git clone https://github.com/akira6592/awx.git

(あとで気がついたのですが、AWX 16 の頃に fork したままで、 upstream を fetch 忘れていました。以降、手順は変わらないと思いますが最新版とログなどが微妙に異なるかもしれません。)

awx というディレクトリが作成されるので移動します。

% cd awx

以降、このディレクトリで作業します。

API 側 (バックエンド)

バックエンドとして API の口を docker compose で作成します。

基本的には公式の案内通りにやっていきます。

ビルド

まずはビルド。make コマンド経由でできるようになってます。いきなり Playbook が実行されます。

% make docker-compose-build
ansible-playbook tools/ansible/dockerfile.yml -e build_dev=True -e receptor_image=quay.io/ansible/receptor:devel
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
[WARNING]: An error occurred while calling ansible.utils.display.initialize_locale (unsupported locale setting). This may result in incorrectly calculated text widths that can cause Display to print
incorrect line lengths

PLAY [Render AWX Dockerfile and sources] *******************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************************************
ok: [localhost]

TASK [dockerfile : Create _build directory] ****************************************************************************************************************************************************************
changed: [localhost]

TASK [dockerfile : Render supervisor configs] **************************************************************************************************************************************************************
changed: [localhost] => (item=supervisor.conf)
changed: [localhost] => (item=supervisor_task.conf)

TASK [dockerfile : Render Dockerfile] **********************************************************************************************************************************************************************
changed: [localhost]

PLAY RECAP *************************************************************************************************************************************************************************************************
localhost                  : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

DOCKER_BUILDKIT=1 docker build -t ghcr.io/ansible/awx_devel:devel \
        --build-arg BUILDKIT_INLINE_CACHE=1 \
        --cache-from=ghcr.io/ansible/awx_devel:devel .
[+] Building 120.1s (51/51) FINISHED
...(略)...
Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
%

この時点では、イメージは以下の1つがありました。

% docker images
REPOSITORY                  TAG       IMAGE ID       CREATED        SIZE
ghcr.io/ansible/awx_devel   devel     c7035a7d68e8   15 hours ago   1.83GB

起動

続いて起動です。これも make 経由です。

Playbpook で docker-compose.yml を生成して、docker-compose up する流れのようです。

https://github.com/ansible/awx/blob/devel/tools/docker-compose/README.md#start-the-containers

数分かかります。途中 Admin password: というログの後に、 admin ユーザーの自動生成パスワードが表示されるのでメモっておきます。

(2022/08/27 後日のPR #12753#12755 あたりで、admin のパスワードを自分で指定できるようになったかもしれません。試せてはいません。)

% make docker-compose
ansible-playbook -i tools/docker-compose/inventory tools/docker-compose/ansible/sources.yml \
        -e awx_image=ghcr.io/ansible/awx_devel \
        -e awx_image_tag=devel \
        -e receptor_image=quay.io/ansible/receptor:devel \
        -e control_plane_node_count=1 \
        -e execution_node_count=2 \
        -e minikube_container_group=false \
        -e enable_keycloak=false \
        -e enable_ldap=false \
        -e enable_splunk=false \
        -e enable_prometheus=false \
        -e enable_grafana=false
[WARNING]: An error occurred while calling ansible.utils.display.initialize_locale (unsupported locale setting). This may result in incorrectly calculated text widths that can cause Display to print
incorrect line lengths

PLAY [Render AWX Dockerfile and sources] *******************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************************************
ok: [localhost]

TASK [sources : Create _sources directories] ***************************************************************************************************************************************************************
changed: [localhost] => (item=secrets)
changed: [localhost] => (item=receptor)

TASK [sources : Detect secrets] ****************************************************************************************************************************************************************************
ok: [localhost] => (item=pg_password)
ok: [localhost] => (item=secret_key)
ok: [localhost] => (item=broadcast_websocket_secret)

...(略)...

tools_awx_1     | Superuser created successfully.
tools_awx_1     | Admin password: (ここにadminのパスワードが表示される)
tools_receptor_hop | WARNING 2022/08/25 11:37:01 Backend connection failed (will retry): dial tcp 172.18.0.4:2222: connect: connection refused
tools_awx_1     | System check identified some issues:
tools_awx_1     |

...(略)...

数分立つと、以下のログくらいしか出力されない、落ち着いた状態になりました。

tools_redis_1   | 1:M 25 Aug 2022 12:30:20.082 * 100 changes in 300 seconds. Saving...
tools_redis_1   | 1:M 25 Aug 2022 12:30:20.093 * Background saving started by pid 16
tools_redis_1   | 16:C 25 Aug 2022 12:30:20.117 * DB saved on disk
tools_redis_1   | 16:C 25 Aug 2022 12:30:20.118 * Fork CoW for RDB: current 0 MB, peak 0 MB, average 0 MB
tools_redis_1   | 1:M 25 Aug 2022 12:30:20.199 * Background saving terminated with success

フォアグラウンドで実行されてるので、このターミナルはそのままにしておきます。

なお、デフォルトでは git としてのブランチ名と同じ名前の ghcr.io/ansible/awx_devel:ブランチ名 を利用するようです。

もし、

Pulling awx_1 (ghcr.io/ansible/awx_devel:fix-awsome)...
ERROR: manifest unknown
make: *** [docker-compose] Error 1

のような、エラーになったら、COMPOSE_TAG=devel make docker-compose のように、存在するイメージのタグ名を明示指定します(参考)。

別ターミナルを立ち上げて・・・イメージ一覧を確認すると以下のようになりました。

% docker images
REPOSITORY                  TAG       IMAGE ID       CREATED        SIZE
ghcr.io/ansible/awx_devel   devel     c7035a7d68e8   15 hours ago   1.83GB
quay.io/ansible/receptor    devel     981db0fc0f90   40 hours ago   233MB
postgres                    12        f2f1f275f1a1   47 hours ago   373MB
redis                       latest    dc7b40a0b05d   2 days ago     117MB

この時点で、docker-compose ps の表示は以下のようになりました。docker-compose.yml が特定のディレクトリに生成されるので、-f で指定するか、そこまで移動します。

% docker-compose -f tools/docker-compose/_sources/docker-compose.yml ps
       Name                     Command               State                                                                       Ports
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tools_awx_1          /entrypoint.sh launch_awx.sh     Up      22/tcp, 0.0.0.0:2222->2222/tcp, 0.0.0.0:3000->3001/tcp, 0.0.0.0:6899->6899/tcp, 0.0.0.0:7899->7899/tcp, 0.0.0.0:7900->7900/tcp,
                                                              0.0.0.0:7901->7901/tcp, 0.0.0.0:7902->7902/tcp, 0.0.0.0:7903->7903/tcp, 0.0.0.0:7904->7904/tcp, 0.0.0.0:7905->7905/tcp,
                                                              0.0.0.0:7906->7906/tcp, 0.0.0.0:7907->7907/tcp, 0.0.0.0:7908->7908/tcp, 0.0.0.0:7909->7909/tcp, 0.0.0.0:7910->7910/tcp,
                                                              0.0.0.0:7911->7911/tcp, 0.0.0.0:7912->7912/tcp, 0.0.0.0:7913->7913/tcp, 0.0.0.0:7914->7914/tcp, 0.0.0.0:7915->7915/tcp,
                                                              0.0.0.0:7916->7916/tcp, 0.0.0.0:7917->7917/tcp, 0.0.0.0:7918->7918/tcp, 0.0.0.0:7919->7919/tcp, 0.0.0.0:7920->7920/tcp,
                                                              0.0.0.0:7921->7921/tcp, 0.0.0.0:7922->7922/tcp, 0.0.0.0:7923->7923/tcp, 0.0.0.0:7924->7924/tcp, 0.0.0.0:7925->7925/tcp,
                                                              0.0.0.0:7926->7926/tcp, 0.0.0.0:7927->7927/tcp, 0.0.0.0:7928->7928/tcp, 0.0.0.0:7929->7929/tcp, 0.0.0.0:7930->7930/tcp,
                                                              0.0.0.0:7931->7931/tcp, 0.0.0.0:7932->7932/tcp, 0.0.0.0:7933->7933/tcp, 0.0.0.0:7934->7934/tcp, 0.0.0.0:7935->7935/tcp,
                                                              0.0.0.0:7936->7936/tcp, 0.0.0.0:7937->7937/tcp, 0.0.0.0:7938->7938/tcp, 0.0.0.0:7939->7939/tcp, 0.0.0.0:7940->7940/tcp,
                                                              0.0.0.0:7941->7941/tcp, 0.0.0.0:7942->7942/tcp, 0.0.0.0:7943->7943/tcp, 0.0.0.0:7944->7944/tcp, 0.0.0.0:7945->7945/tcp,
                                                              0.0.0.0:7946->7946/tcp, 0.0.0.0:7947->7947/tcp, 0.0.0.0:7948->7948/tcp, 0.0.0.0:7949->7949/tcp, 0.0.0.0:7950->7950/tcp,
                                                              0.0.0.0:7951->7951/tcp, 0.0.0.0:7952->7952/tcp, 0.0.0.0:7953->7953/tcp, 0.0.0.0:7954->7954/tcp, 0.0.0.0:7955->7955/tcp,
                                                              0.0.0.0:7956->7956/tcp, 0.0.0.0:7957->7957/tcp, 0.0.0.0:7958->7958/tcp, 0.0.0.0:7959->7959/tcp, 0.0.0.0:7960->7960/tcp,
                                                              0.0.0.0:7961->7961/tcp, 0.0.0.0:7962->7962/tcp, 0.0.0.0:7963->7963/tcp, 0.0.0.0:7964->7964/tcp, 0.0.0.0:7965->7965/tcp,
                                                              0.0.0.0:7966->7966/tcp, 0.0.0.0:7967->7967/tcp, 0.0.0.0:7968->7968/tcp, 0.0.0.0:7969->7969/tcp, 0.0.0.0:7970->7970/tcp,
                                                              0.0.0.0:7971->7971/tcp, 0.0.0.0:7972->7972/tcp, 0.0.0.0:7973->7973/tcp, 0.0.0.0:7974->7974/tcp, 0.0.0.0:7975->7975/tcp,
                                                              0.0.0.0:7976->7976/tcp, 0.0.0.0:7977->7977/tcp, 0.0.0.0:7978->7978/tcp, 0.0.0.0:7979->7979/tcp, 0.0.0.0:7980->7980/tcp,
                                                              0.0.0.0:7981->7981/tcp, 0.0.0.0:7982->7982/tcp, 0.0.0.0:7983->7983/tcp, 0.0.0.0:7984->7984/tcp, 0.0.0.0:7985->7985/tcp,
                                                              0.0.0.0:7986->7986/tcp, 0.0.0.0:7987->7987/tcp, 0.0.0.0:7988->7988/tcp, 0.0.0.0:7989->7989/tcp, 0.0.0.0:7990->7990/tcp,
                                                              0.0.0.0:7991->7991/tcp, 0.0.0.0:7992->7992/tcp, 0.0.0.0:7993->7993/tcp, 0.0.0.0:7994->7994/tcp, 0.0.0.0:7995->7995/tcp,
                                                              0.0.0.0:7996->7996/tcp, 0.0.0.0:7997->7997/tcp, 0.0.0.0:7998->7998/tcp, 0.0.0.0:7999->7999/tcp, 0.0.0.0:8013->8013/tcp,
                                                              0.0.0.0:8043->8043/tcp, 0.0.0.0:8080->8080/tcp, 0.0.0.0:8888->8888/tcp
tools_postgres_1     docker-entrypoint.sh postg ...   Up      5432/tcp
tools_receptor_1     /entrypoint.sh receptor -- ...   Up      22/tcp, 8013/tcp, 8043/tcp, 8080/tcp
tools_receptor_2     /entrypoint.sh receptor -- ...   Up      22/tcp, 8013/tcp, 8043/tcp, 8080/tcp
tools_receptor_hop   /usr/local/bin/dumb-init - ...   Up      0.0.0.0:5555->5555/tcp, 7323/tcp
tools_redis_1        redis-server /usr/local/et ...   Up      6379/tcp
%

パスワードについて

もし、パスワードが分からなくなってしまった場合でも、以下のコマンドで新しい管理者ユーザーを作成できます。

% docker exec -ti tools_awx_1 awx-manage createsuperuser

API の確認

できたかなー、ということで、さっそく API を叩きます。ポートは 8043 です。

試すエンドポイントは、認証いらずで便利な ping を指定します。

% curl -ks https://localhost:8043/api/v2/ping/ | jq .
{
  "ha": false,
  "version": "16.0.1.dev4198+g4fbf5e9e2f",
  "active_node": "awx_1",
  "install_uuid": "6d9c484a-47f9-45c5-ac97-71c53b889792",
  "instances": [
    {
      "node": "awx_1",
      "node_type": "hybrid",
      "uuid": "00000000-0000-0000-0000-000000000000",
      "heartbeat": "2022-08-25T12:15:32.388568Z",
      "capacity": 59,
      "version": "16.0.1.dev4198+g4fbf5e9e2f"
    },
    {
      "node": "receptor-1",
      "node_type": "execution",
      "uuid": "e4b8a674-eaf5-48e6-804c-32d448d67b6e",
      "heartbeat": "2022-08-25T12:15:27.896150Z",
      "capacity": 59,
      "version": "ansible-runner-2.1.1.dev58"
    },
    ...(略)...
}
%

無事に返ってきました。これで API 側はできたようです。

(あとで色々試していたら "version": "21.5.1.dev3+g4fbf5e9e2f" と最新になりました。ずっと ghcr.io/ansible/awx_devel:devel を利用してたつもりではあるのですが・・)

コンテナ側の UI は特になにもせず

この時点で、localhost:8043 の通常の UI を見ても、以下のような文字列しか返ってきません。

<% if (process.env.NODE_ENV === 'production') { %> <% } %> <% if (process.env.NODE_ENV === 'production') { %> <% } else { %> <% } %> <% if (process.env.NODE_ENV === 'production') { %>

docker exec tools_awx_1 make clean-ui ui-devel を実行すれば、コンテナ側の UI も構築されるようです(うまくいくまで試せていません)。ですが、今回は UI はホストマシンに構築していじりたいので、コンテナ側はこのままにしておきます。

■ UI 側 (フロントエンド)

続いて、UI 側です。API 側を起動したターミナルはそのままにして、別のターミナルで作業します。

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

npm で必要なパッケージをインストールします。コマンドはこちらに記載されています。

% npm --prefix=awx/ui install

UI 側の起動

次に起動します。

% npm --prefix=awx/ui start

> prestart
> lingui compile

Compiling message catalogs…
Done!

> start
> GENERATE_SOURCEMAP=false ESLINT_NO_DEV_ERRORS=true PORT=3001 HTTPS=true DANGEROUSLY_DISABLE_HOST_CHECK=true react-scripts start

Browserslist: caniuse-lite is outdated. Please run:
  npx browserslist@latest --update-db
  Why you should do it regularly: https://github.com/browserslist/browserslist#browsers-data-updating
(node:56871) [DEP_WEBPACK_DEV_SERVER_HTTPS] DeprecationWarning: 'https' option is deprecated. Please use the 'server' option.
(Use `node --trace-deprecation ...` to show where the warning was created)
[HPM] Proxy created: /api,/websocket,/sso  -> https://localhost:8043
(node:56871) [DEP_WEBPACK_DEV_SERVER_ON_AFTER_SETUP_MIDDLEWARE] DeprecationWarning: 'onAfterSetupMiddleware' option is deprecated. Please use the 'setupMiddlewares' option.
(node:56871) [DEP_WEBPACK_DEV_SERVER_ON_BEFORE_SETUP_MIDDLEWARE] DeprecationWarning: 'onBeforeSetupMiddleware' option is deprecated. Please use the 'setupMiddlewares' option.
Starting the development server...        (ここで数分かかる)

You can now view ui in the browser.

  Local:            https://localhost:3001
  On Your Network:  https://192.168.1.135:3001

Note that the development build is not optimized.
To create a production build, use npm run build.

assets by path static/ 23.7 MiB
  assets by path static/js/*.js 19.9 MiB
    assets by chunk 2.83 MiB (id hint: vendors) 50 assets
    25 assets
  assets by path static/media/ 3.85 MiB
    assets by chunk 2.32 MiB (auxiliary name: main)
      assets by path static/media/*.woff2 1.22 MiB 38 assets
      assets by path static/media/*.woff 1.1 MiB 26 assets
    assets by path static/media/*.jpg 1.53 MiB 6 assets
    asset static/media/status-icon-sprite.4fee9fefc3971799d2dd.svg 3.44 KiB [emitted] [immutable] [from: node_modules/@patternfly/react-styles/css/assets/images/status-icon-sprite.svg] (auxiliary id hint: vendors)
asset asset-manifest.json 36 KiB [emitted]
asset index.html 1.27 KiB [emitted]
orphan modules 3.02 MiB [orphan] 2074 modules
runtime modules 59.8 KiB 30 modules
javascript modules 14.2 MiB
  modules by path ./node_modules/ 8.17 MiB 1821 modules
  modules by path ./src/ 6.02 MiB 971 modules
asset modules 8.32 KiB (javascript) 3.85 MiB (asset)
  modules by path ./node_modules/@patternfly/react-core/dist/styles/assets/fonts/ 2.54 KiB (javascript) 2.28 MiB (asset) 62 modules
  modules by path data:image/svg+xml;charset=utf8,%3Csvg xmlns=%27http://www.w3.org/2000/ 5.41 KiB 8 modules
  modules by path ./node_modules/@patternfly/react-styles/ 294 bytes (javascript) 1.54 MiB (asset) 7 modules
  modules by path ./node_modules/@patternfly/react-core/dist/styles/assets/pficon/ 84 bytes (javascript) 36.9 KiB (asset) 2 modules
json modules 30 KiB
  ./node_modules/entities/lib/maps/entities.json 28.4 KiB [built] [code generated]
  ./node_modules/entities/lib/maps/legacy.json 1.24 KiB [built] [code generated]
  ./node_modules/entities/lib/maps/xml.json 62 bytes [built] [code generated]
  ./node_modules/entities/lib/maps/decode.json 308 bytes [built] [code generated]
webpack 5.66.0 compiled successfully in 211217 ms
...(フォアグラウンド実行中)...

正常にアクセスできまで数分間かかりました。

https://localhost:3001/ を開いて、ログイン画面が表示され、admin と先程メモったパスワードでログインできれば一区切りです。

ジャガイモがお出迎え

ログインできた

いつものでデモデータもはいっていました。

admin のパスワードは、覚えやすく安全なものに変えちゃったほうがいいと思います。

なお、途中のログにあるように、デフォルトでは https://localhost:8043API を叩きに行くようです。今回は、docker compose で構築した API の口が https://localhost:8043 で同じなので、デフォルトのままでOKです。

もし、別のポートや別のサーバーを相手にしたい場合は、ドキュメントに記載があるように環境変数 TARGET をセットして起動します。(おためし

# 別のサーバーのAPIを使う例
TARGET='https://awx.local:8043' npm --prefix awx/ui start

UI側と機能の整合性があるのであれば、今回用にAPI側をわざわざ作るのではなく、既存のものを使ってもよいかと思います。

UI のコードがあるパス

ui/src ディレクトリ配下に、コンポーネントや hook のコードがあります。このあたりを触っていけばいいわけですね。

ということで、ほんとにやりたかったちょっとした修正にとりかかりました。

おわりに

API 側をコンテナで用意し、ホスト側にUIを用意しました。

AWX の画面表示が、どのような仕組みで成り立っているのか少し理解するきっかけになりました。

Ansible には日本語の公式ドキュメントがある(現状 ansible-core 2.13まで)

結構検索したときにもヒットしますが、Ansibleに日本語の公式ドキュメントがあります。

2020年に公開されました。

docs.ansible.com

バージョンスイッチャーに、最近のバージョンがないので 2.9 までしかない、と思われるかもしれません。私もそう思っていました。

ansible 日本語ドキュメントのバージョンスイッチャー

最近気がついたのですが、 ansible-core のドキュメントとしては、現状 2.13 までのドキュメントがありました。

docs.ansible.com

ansible-core 2.13 の日本語ドキュメント

メンテが大変だと思うんですが、助かる人は多いと思います。

[Ansible] ドキュメントを修正、ビルド、確認してプルリクエストを出すまでにやったこと

はじめに

Ansible のドキュメントは Sphinx で生成されるようになっています。

これまでちょっとした文言修正は、ちゃんとビルドして確認してこなかったのですが、先日書式レベルで修正したことがありました。そのため、ビルドする方法をしらべて試しました。

公式ドキュメントとしては、以下のページにまとめられています。

docs.ansible.com

このブログ記事では、私が実行した手順をまとめます。あくまで、今回私はこうやった、という記録だけです。詳細は前述の公式ドキュメントしてください。

git clone

予め GitHubansible/ansible リポジトリを、自分のアカウントに fork しておきます。

fork したほうを git clone します。

$ git clone git@github.com/akira6592/ansible
$ cd ansible
$ git status
On branch devel

今回のドキュメント修正用のブランチを devel から作成します。

$ git checkout -b fix-development_process

Python 環境の準備

Sphinx でビルドするために Python 環境を準備する必要があります。今回は専用の venv を作成します。

$ python3.9 -m venv ~/envs/adoc 
$ source ~/envs/adoc/bin/activate

clone した中の docs/docsite ディレクトリに、requirements.txt があるので、これをもとに pip install します。

$ cd docs/docsite
$ pip install -r requirements.txt

ドキュメント修正

実際にドキュメントを修正します。今回は、docs/docsite/rst/community/development_process.rst です。

ちょっとした修正です。

github.com

このリンクの書式

:ref:`backported <backport_process>`

の動作を確認したくて、ビルドしようと思った次第です。

この書式は、Ansible 側でもきちんと説明されていました。

なお、生成されているのは以下のページです。

The Ansible Development Cycle — Ansible Documentation

チェック

次に、rstcheck によるチェックです。

$ pwd
/Users/sakana/Documents/git/ansible/docs/docsite
$ rstcheck  rst/community/development_process.rst 
rst/community/development_process.rst:1: (INFO/1) Hyperlink target "community-development-process" is not referenced.
rst/community/development_process.rst:30: (INFO/1) Hyperlink target "community-pull-requests" is not referenced.
rst/community/development_process.rst:144: (INFO/1) Hyperlink target "community-changelogs" is not referenced.
rst/community/development_process.rst:168: (INFO/1) Hyperlink target "changelogs-how-to" is not referenced.
rst/community/development_process.rst:258: (INFO/1) Hyperlink target "changelogs-how-to-format" is not referenced.
rst/community/development_process.rst:302: (INFO/1) Hyperlink target "changelogs-how-to-format-playbooks" is not referenced.
rst/community/development_process.rst:320: (INFO/1) Hyperlink target "backport-process" is not referenced.
Error! Issues detected.

あれれ・・。今回修正したリンクとにたような文言 backport-process が表示されてしまいました。ちゃんと参照関係は通るはずなのですが。実際の動作はビルドして確認することにします。

(なお、修正前の状態でも同じ表示がされていました。)

ビルド

いよいよビルドです。ここでいうビルドは HTML の生成です。

ビルドする対象の範囲によってビルドする方法もいくつかあるようですが、今回は htmlsingle にしました。

内部で sphinx-build コマンドなどが実行されるようです。

コマンドとしては、make htmlsingle rst=rstファイルのパス なのですが、rst オプションで指定したパスに対して rst ディレクトリが補完されるので、rst ディレクトリを除いた形で指定します。

$ pwd
/Users/sakana/Documents/git/ansible/docs/docsite
$ make htmlsingle rst=community/development_process.rst
Creating symlinks in gettext_structure
ln -sf ../rst/core_index.rst rst/index.rst
ln -sf ../rst/dev_guide/core_index.rst rst/dev_guide/index.rst
ln -sf ../sphinx_conf/all_conf.py rst/conf.py
sphinx-build -j 4 -b html -d _build/doctrees ./rst _build/html rst/community/development_process.rst
Sphinx v5.1.1 を実行中
出力先ディレクトリを作成しています... 完了
/Users/sakana/Documents/git/ansible/docs/docsite/rst/dev_guide/index.rst: WARNING: ドキュメントを読めません。無視します。
https://docs.python.org/2/objects.inv から intersphinx インベントリをロード中...
https://docs.python.org/3/objects.inv から intersphinx インベントリをロード中...
http://jinja.palletsprojects.com/objects.inv から intersphinx インベントリをロード中...
https://docs.ansible.com/ansible/6/objects.inv から intersphinx インベントリをロード中...
...(略)...
ビルド中 [mo]: 指定された 0 件のpoファイル
ビルド中 [html]: コマンドラインで指定された1件のソースファイル
環境データを更新中[新しい設定] 9345 件追加, 0 件更新, 0 件削除
ソースを読み込み中...[  1%] 2.10_index .. collections/ansible/builtin/items_lookup    
ソースを読み込み中...[  3%] collections/ansible/builtin/jsonfile_cache .. collections/ansible/posix/debug_callback     
ソースを読み込み中...[  4%] collections/ansible/posix/firewalld_info_module .. collections/arista/eos/eos_linkagg_modul
...(略)...
ソースを読み込み中...[100%] scenario_guides/vmware_rest_scenarios/create_vm .. win_guide/windows_winrm                          
/Users/sakana/Documents/git/ansible/docs/docsite/rst/dev_guide/index.rst: WARNING: ドキュメントを読めません。無視します。
/Users/sakana/Documents/git/ansible/docs/docsite/rst/index.rst:65: WARNING: toctree に存在しないドキュメントへの参照が含まれています 'dev_guide/index'
...(略)...
/Users/sakana/Documents/git/ansible/docs/docsite/rst/dev_guide/core_index.rst: WARNING: ドキュメントはどの toctree にも含まれていません
完了
ドキュメントの出力準備中... WARNING: 検索インデックスを読み込めず、ドキュメントビルドの一部が不完全です。
完了
出力中...[100%] index                                                                                                     
索引を生成中... genindex py-modindex 完了
追加のページを出力中... search 完了
ダウンロードファイルをコピー中...[100%] network/getting_started/sample_files/first_playbook_ext.yml                                   
静的ファイルをコピー中... 完了
extraファイルをコピー中... 完了
English (code: en) の検索インデックスを出力... 完了
オブジェクト インベントリを出力... 完了
ビルド 成功, 982 警告.

HTMLページは_build/htmlにあります。
Output is in _build/html/community/development_process.html
$ 

私の環境では結構時間がかかりました。警告が表示さていていて少しもやもやしますが、エラーではないようです。

表示と確認

ビルド実行結果の最後にあるように、HTML ファイルが _build/html/community/development_process.html に生成されました。

リポジトリトップからのパスだと docs/docsite/_build/html/community/development_process.html です。これを実際にブラウザで表示して、修正したリンクや表示を確認します。

ビルドして生成されたHTML(ローカル)

あとは、CI でのテストに任せたいと思います。

git push と PR

通常と同じく、git push して PR を出します。

CI も通ってくれて、内容も問題ないと判断され、マージしていただきました。

今回 PR を出した devel ブランチは、現在 2.14 開発向けです。stable-2.13 へのバックポートは、別途まとめて出していただきました。最近は 週に一度程度 bulk backport されているようです。

まとめ

Ansible の公式ドキュメントを修正して、ビルド、確認、プルリクエストをだすまでやったことをまとめました。

これまでは、ビルドする方法が分からなかったので、書式レベルの修正は億劫だったのですが、今回できてよかったです。

ドキュメントの修正方法自体がちゃんとドキュメントにまとまってるのもとても助かりました。

docs.ansible.com

[ansible] 各コレクションを管理しているリポジトリの調べ方

はじめに

コレクションの不具合を調べたりする際、どのリポジトリで管理されてるかを特定する必要があります。その方法はいくつかありますが、2つご紹介します。

コレクション詳細ページから

コレクション詳細ページ(azure.azcollection であればここ)に、リポジトリへのリンクがあります。ここをクリックするとリポジトリ名がわかります。

コレクション詳細ページから

Ansible Galaxy のページから

Ansible Galaxy 側のコレクション詳細ページ(azure,azcollection であればここ)に、リポジトリへのリンクがありますので、ここをクリックするとリポジトリ名がわかります。

Ansible Galaxy のページから

[ansible] 未リリース状態のコレクションをインストールする

インストール方法

コレクションは各リポジトリで開発が進んでいて、適宜リリースされます。

リリースされたものは ansible-gallaxy collection install コレクション名 でインストールできます。

一方、バグ修正されたり、機能追加されたけどまだリリースされてない状態のものをインストールして試したいときもあります。

そんなときのインストール方法も公式ドキュメントに記載があります。

docs.ansible.com

例えば、azure.azcollection コレクションを管理しているリポジトリ ansible-collections/azuredev ブランチのものをインストールしたい場合は、以下のコマンドです。

ansible-galaxy collection install git+https://github.com/ansible-collections/azure.git,dev

実行例

$ ansible-galaxy collection install git+https://github.com/ansible-collections/azure.git,dev  
Cloning into '/Users/sakana/.ansible/tmp/ansible-local-28835hg8drawd/tmptdx3qd1l/azure36ypna5u'...
remote: Enumerating objects: 5834, done.
remote: Counting objects: 100% (625/625), done.
remote: Compressing objects: 100% (422/422), done.
remote: Total 5834 (delta 364), reused 312 (delta 147), pack-reused 5209
Receiving objects: 100% (5834/5834), 2.76 MiB | 4.73 MiB/s, done.
Resolving deltas: 100% (3832/3832), done.
Already on 'dev'
Your branch is up to date with 'origin/dev'.
Starting galaxy collection install process
Process install dependency map
Starting collection install process
Installing 'azure.azcollection:1.13.0' to '/Users/sakana/.ansible/collections/ansible_collections/azure/azcollection'
Created collection for azure.azcollection:1.13.0 at /Users/sakana/.ansible/collections/ansible_collections/azure/azcollection
azure.azcollection:1.13.0 was installed successfully
$ 

バージョン表記状は 1.13.0 とありますが、中身はそれ以降のものになっています。

リポジトリの調べ方

この方法は、コレクション名ではなくリポジトリ名を知っておく必要があります。

以下の記事を参考にどうぞ。

tekunabe.hatenablog.jp

[ansible] ansible-core 2.14 でコントロールノードで Python 3.9 以上が必要になる模様

こんな変更がありました。

github.com

コントロールノードで Python 3.9 以上を必要とするようになるようです。これまでは 3.8 以上でした。

devel ブランチへのマージのみです。おそらくこのまま行けば、2022年11月リリース予定の ansible-core 2.14が、この要件になるはずです。

まだポーティングガイドにはこの旨の記述が見当たりません。

(2022/08/10 追記 ポーティングガイドに追記しました

なお、ためしに Python 3.8 環境で、devel ブランチのものをインストールしようとしたらこんなエラーになりました。

$ python --version
Python 3.8.6
$
$ pip install pip --upgrade
Collecting pip
  Downloading https://files.pythonhosted.org/packages/1f/2c/d9626f045e7b49a6225c6b09257861f24da78f4e5f23af2ddbdf852c99b8/pip-22.2.2-py3-none-any.whl (2.0MB)
     |████████████████████████████████| 2.0MB 14.6MB/s 
Installing collected packages: pip
  Found existing installation: pip 19.3.1
    Uninstalling pip-19.3.1:
      Successfully uninstalled pip-19.3.1
Successfully installed pip-22.2.2
(py38) [admin@rhel84ac ~]$ pip install  git+https://github.com/ansible/ansible.git@devel
Collecting git+https://github.com/ansible/ansible.git@devel
  Cloning https://github.com/ansible/ansible.git (to revision devel) to /tmp/pip-req-build-j8_s8xtb
  Running command git clone --filter=blob:none --quiet https://github.com/ansible/ansible.git /tmp/pip-req-build-j8_s8xtb
  Resolved https://github.com/ansible/ansible.git to commit 85acf4d1e55e95c266a35c49f74af3c0f251de08
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Collecting cryptography
  Downloading cryptography-37.0.4-cp36-abi3-manylinux_2_24_x86_64.whl (4.1 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.1/4.1 MB 28.4 MB/s eta 0:00:00
Collecting resolvelib<0.9.0,>=0.5.3
  Downloading resolvelib-0.8.1-py2.py3-none-any.whl (16 kB)
Collecting jinja2>=3.0.0
  Downloading Jinja2-3.1.2-py3-none-any.whl (133 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 133.1/133.1 kB 63.7 MB/s eta 0:00:00
Collecting packaging
  Using cached packaging-21.3-py3-none-any.whl (40 kB)
Collecting PyYAML>=5.1
  Using cached PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (701 kB)
ERROR: Package 'ansible-core' requires a different Python: 3.8.6 not in '>=3.9'

[ansible] AAP (Ansible Automation Platform) が指すもの

私や私の周辺では、Ansible Automation Platformのことを、よく略して AAP と呼んでいます。

しかし、人によって AAP が指す範囲が微妙に違うように感じることがあります。

特に AAP 2 のリリース以降です。AAP は AAP 1 時代から AAP ですが(変な言い方ですが)、文脈的に AAP 2 以降を指してるときがあります。はたまた、Automation Controller のことを指しているようなときもあります。

私の解釈含め、簡単に図示します。

私の解釈

以下が私の解釈です。

私の解釈

AAP 1も AAP2 も AAP ですし、Ansible Tower や Automation Controller 以外の製品、サービスも含め AAP です。

2系なら AAP 2 などと表現し、Automation Controller は Automation Controller と表現します。

他の表現1

AAP 2系を AAP と表現する場合です。他の方の表現では、文脈上こういうケースがあります。

?

他の表現2

Ansible Tower の後継である、Automation controller を指して、AAP と表現する場合です。たまにこれっぽい時があります。私の周りはこのケースが多い気がします。

?

参考

What is included in Red Hat Ansible Automation Platform subscription? - Red Hat Customer Portal

Red Hat Ansible Automation Platform Life Cycle - Red Hat Customer Portal