Memo/Ansible/AWX

https://dexlab.net:443/pukiwiki/index.php?Memo/Ansible/AWX
 

AWX: オープンソースのTower

有償のAnsible Towerをstable版とするなら、AWXはdev版。

  • AWX Project FAQ | Ansible.com
  • Aapach 2.0ライセンス
  • Webベースのユーザーインターフェイス
  • REST API
  • Ansibleの上に構築されたタスクエンジン
  • releases バージョンを使うのが良さそうだが、不具合はたくさんある。タグは適当に打ってるようで、変更点等が書いて無い
  • Docker Hub のdocker imageが使われる。
    • ansible/awx_web
    • ansible/awx_task
    • ansible/awx_rabbitmq
    • memcached:alpine
    • postgres
  • Ansible Tower版と異なる点
  • docker-composeで構成されている
  • dockerのため、ログがホストOS上に残らない。dockerコンテナ内で閉じている。

Vault: 暗号化された変数を使う

不具合がある。

  • バージョン毎の対応状況
    • awx 6.0.0: 3.2.5と同じ。
    • awx 3.2.5:
      • OK: インベントリー変数で「_ansible_vault: >-」と1行毎の改行が必要
      • NG: ジョブテンプレート内の追加変数「!vault |」が「Failed to parse variables.」で失敗。インベントリと同じ書式にしてダメ。
      • OK: playbook内に変数として埋め込む
    • awx 1.0.5:
      • NG: インベントリー変数。3.2.5のような書き方をしても、そのまま表示される。
      • NG: ジョブテンプレート内の追加変数「!vault |」が「Failed to parse variables.」で失敗。インベントリと同じ書式にしてダメ。
      • OK: playbook内に変数として埋め込む
  • ansible-vault用のパスワード生成
    sudo yum install expect -y
    mkpasswd -l 16 -s 0 > ~/local-test-vault.txt
  • ansible-vaultで値を暗号化
    ansible-vault encrypt_string 'Hello World!' --name vault_var1 --vault-password-file=~/local-test-vault.txt
    vault_var1: !vault |
              $ANSIBLE_VAULT;1.1;AES256
              62303734646130316662666334613735666234353833613537613861663566353937303334373263
              3432626334323535323932373862616262333932393536340a383034333333313137313937333736
              35643037356662666532393964396439333766623561313332353632646163356631613539383666
              3966373963326466350a653433303938346534633435373437366438346534656239313262346664
              6364
    Encryption successful
  • playbook内の「vars:」で変数を定義すると、インベントリより優先されるので注意。
  • playbook.vault.yml
    - hosts: localhost
      connection: local
      gather_facts: no
      become: no
      vars:
      - vault_inline1: !vault |
                  $ANSIBLE_VAULT;1.1;AES256
                  62303734646130316662666334613735666234353833613537613861663566353937303334373263
                  3432626334323535323932373862616262333932393536340a383034333333313137313937333736
                  35643037356662666532393964396439333766623561313332353632646163356631613539383666
                  3966373963326466350a653433303938346534633435373437366438346534656239313262346664
                  6364
      tasks:
      - name: message1
        debug:
          msg: "{{ message1|default('no data') }}"
      - name: vault_var1
        debug:
          msg: "{{ vault_var1|default('no data') }}"
      - name: vault_inline1
        debug:
          msg: "{{ vault_inline1|default('no data') }}"
  • localのansibleで実行
    ansible-playbook playbook.vault.yml --vault-id ~/local-test-vault.txt
    ...
    TASK [message1] *****************************************************************************************************************************************************
    ok: [localhost] => {
        "msg": "no data"
    }
    
    TASK [vault_var1] ***************************************************************************************************************************************************
    ok: [localhost] => {
        "msg": "no data"
    }
    
    TASK [vault_inline1] ************************************************************************************************************************************************
    ok: [localhost] => {
        "msg": "Hello World!"
    }
    ...

AWX UI上の作業

  • 認証情報 > 追加
    • 名前: local test vault
    • CREDENTIAL TYPE: Vault
    • VAULT パスワード: local-test-vault.txtの中身
  • インベントリ > local testの変数に追加
    ---
    vault_var1:
      __ansible_vault: >-
                  $ANSIBLE_VAULT;1.1;AES256
    
                  62303734646130316662666334613735666234353833613537613861663566353937303334373263
    
                  3432626334323535323932373862616262333932393536340a383034333333313137313937333736
    
                  35643037356662666532393964396439333766623561313332353632646163356631613539383666
    
                  3966373963326466350a653433303938346534633435373437366438346534656239313262346664
    
                  6364
  • テンプレート > 追加
    • 名前: vault test
    • ジョブタイプ: 実行
    • インベントリー: local test
    • プロジェクト: local test
    • playbook: playbook.vault.yml
    • 認証情報: local test vault
    • 詳細: 3 (Debug)
    • 追加変数: YAML
      ---
      # 日時を表示: YYYY-mm-dd HH:MI:SS
      message1: "{{ lookup('pipe','date \"+%Y-%m-%d %H:%M:%S\"') }}"
      # ここではvaultが「parse error」で使えない。インベントリと同じ書式で入力しても、そのまま表示されてしまう。

webhookを受け取る

AWX v1.0.5にはwebhookを受け取る方法が無い。webhook送信はある。


ロードバランサ、proxyの背後に置く場合


バックアップ/リストア


以下直接DBをバックアップ/リストアしたい場合

  • コンテナ名がバージョンによって違う
    # AWX 6.0.0
    PG_CONTAINER=awx_postgres
    # AWX 1.0.5
    #PG_CONTAINER=postgres
  • PostgreSQLのバックアップ
    sudo docker exec $PG_CONTAINER bash -c "pg_dump --clean --create -U awx -d awx | gzip > /var/lib/postgresql/data/awx.pg.$(date +%w).gz"
    # /var/lib/pgdocker/awx.pg.*.gz が出来る
  • リストア
    sudo docker stop $PG_CONTAINER awx_task
    sudo mv /var/lib/pgdocker/pgdata /var/lib/pgdocker/pgdata.$(date +%Y%m%d)
    
    sudo docker start $PG_CONTAINER
    sudo docker exec $PG_CONTAINER bash -c "zcat /var/lib/postgresql/data/awx.pg.$(date +%w).gz | psql -U awx -d awx"
    sudo docker start awx_task

バージョンの確認

  • Webコンソール > About AWX をクリック

不具合

  • アップデート
  • v1.0.6.5
  • 起動しない
  • v1.0.5.x
    • LDAP設定を更新すると、LDAP BIND PWが初期化される不具合。再設定が必要。
    • LDAP認証を使っていても、Basic認証が出る事がある。APIブラウザーのBasic認証が出ているようだ。
    • jobの並列実行は直っている
    • jobのリアルタイム更新もALBを使えばOK
    • jobのリアルタイム更新が止まる事がある。awx_taskを再起動すると直った。
      sudo docker restart awx_task
  • v1.0.2.x
  • v1.0.1.x
  • job結果のリアルタイム更新が動作しない。v1.0.2で直ったかも。
  • playbookの並列実行ができない。
  • jobのslack通知がされない。UIの問題で通知onにしても、リロードするとoffになったままになる。
  • docker PostgreSQLのデータディレクトリが 「/var/lib/postgresql/data」 から 「/var/lib/postgresql/data/pgdata」へ変わった。バージョンアップする時はpg_dump等でバックアップしておこう。
  • データディレクトリを移動すれば起動するようになる
  • docker PostgreSQLのデータディレクトリが「/tmp/pgdocker」に置いてあるせいで、tmpwatch(10日)で消されて壊れる不具合。以下が良いかもしれない。
  • postgres_data_dir: /var/lib/pgdocker

LDAP認証

  • ユーザ/グループをLDAPで管理できる。ユーザ認証だけLDAPで、権限/グループはAWXで管理も可能
  • ユーザの初回ログイン時にLDAPに接続して、AWX上にユーザを作成する。そのため、 LDAP GROUP SEARCHが未設定だとユーザは作成されるが、グループ検索に失敗してログインできなかった
  • LDAP認証に失敗する場合、以下を見ると分かる。直近1分
sudo docker logs -t --since "1m" awx_task
  • LDAPユーザ属性マップから「"email": "mail"」を削除すると、emailを必須項目から外せる。
  • LDAP BIND PWが「$enclipted$」の時に更新すると、別のパスワードに変わる事がある。BIND PWを再設定すると直る。バグっぽい。(v1.0.5)

ログを見る

  • awx_webコンテナのアクセスログを見る。直近1分
    sudo docker logs -t --since "1m" awx_web
  • awx_taskコンテナのログを見る。メインのエラーはここに出る。
    sudo docker logs -t --since "1m" awx_tack

Docker Container

  • 以下のコンテナが起動した
sudo docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}"
CONTAINER ID        IMAGE                        PORTS
6679d27d96c0        ansible/awx_task:1.0.5       8052/tcp
a641e866bcae        ansible/awx_web:1.0.5        0.0.0.0:80->8052/tcp
909dc2f013aa        memcached:alpine             11211/tcp
179ed843c916        ansible/awx_rabbitmq:3.7.4   4369/tcp, 5671-5672/tcp, 15671-15672/tcp, 25672/tcp
5f12da648e69        postgres:9.6                 5432/tcp
  • 何らかの理由でコンテナが落ちてしまった場合に、再起動させる
    cd /opt/awx/
    sudo ansible-playbook -i installer/inventory installer/install.yml

アップグレード

  • releases バージョンを指定するのが良さそうだが、変更点がChangelog等の形式で纏まってない。
  • データは引き継げない場合が多い。「AWX is Upgrading」のまま進まない。その場合は諦めて新規作成する。
  • PostgreSQLのバックアップ

「AWX is Upgrading」のまま進まない場合

  • 新規インストールでもセットアップ中は表示される。ただ、awx_taskのログにはエラーは無いので判断できる。
  • 自動アップグレードは無理なので、データ消去してやり直す。
  • awx_web,awx_taskコンテナをstop/startしてみる。バージョンによっては進む事も。
    # docker停止
    sudo docker stop $(sudo docker ps -aq)
    # DBディレクトリをバックアップ
    sudo mv /var/lib/pgdocker /var/lib/pgdocker.$(date +%Y%m%d-%H%M%S)
    # installer/install.yml を再実行
  • CentOS 7.5 のvm上で確認
    # 「django.db.utils.ProgrammingError: column main_instance.managed_by_policy does not exist」ログがずっと出ている
    sudo docker logs -t --since "1m" awx_task
    
    sudo docker stop awx_task
    
    # たぶんDB壊れているだろうが、一応バックアップ
    sudo docker exec awx_postgres bash -c "pg_dump --clean --create -U awx -d awx | gzip > /var/lib/postgresql/data/awx.pg.$(date +%w).gz"
    # /var/lib/pgdocker/awx.pg.*.gz にファイルが出来る
    
    sudo docker stop awx_postgres
    sudo rm -rf /var/lib/pgdocker/pgdata
    
    cd installer/
    sudo ansible-playbook -i inventory install.yml

AWX 6.0.0 へアップグレード

  • CentOS 7.5 のvm上で確認
    cd /opt/awx/
    sudo git fetch
    sudo git checkout 6.0.0
    sudo vim installer/inventory
    --
    postgres_data_dir: /var/lib/pgdocker
    dockerhub_version: 6.0.0
    project_data_dir=/var/lib/awx/projects
    --
    
    # ansible 2.5.2 ではエラーが出たので更新。更新後 ansible 2.8.1
    sudo yum update ansible -y
    
    # pipが古くてエラーが出るので更新。
    sudo pip install --upgrade pip
    
    # "Cannot have both the docker-py and docker python modules" docker-pyとdockerptyが重複しているらしい
    sudo pip uninstall docker docker-compose docker-py docker-pycreds dockerpty -y
    sudo pip install docker-compose
    
    # コンテナ名が変わっているので全てstop。古いコンテナは"awx"が付いていない
    sudo docker stop $(sudo docker ps -aq)
    # awx_task, awx_webの名前が重複して起動しないので、全て消す
    sudo docker rm $(sudo docker ps -aq)
    # 古いimageも全部消したい場合。時間がかかる。
    sudo docker rmi -f $(sudo docker images | grep awx | awk '{ print $3 }')
    
    # install
    cd installer/
    sudo ansible-playbook -i inventory install.yml
    
    # エラーログが出ていないか確認
    sudo docker logs -t --since "1m" awx_task
    
    # 起動しているコンテナ一覧
    sudo docker ps
    CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                                                 NAMES
    478c245937be        ansible/awx_task:6.0.0       "/tini -- /bin/sh ..."   23 seconds ago      Up 22 seconds       8052/tcp                                              awx_task
    ec85950fe4b2        ansible/awx_web:6.0.0        "/tini -- /bin/sh ..."   24 seconds ago      Up 23 seconds       0.0.0.0:80->8052/tcp                                  awx_web
    d6b537742b69        ansible/awx_rabbitmq:3.7.4   "docker-entrypoint..."   11 minutes ago      Up 24 seconds       4369/tcp, 5671-5672/tcp, 15671-15672/tcp, 25672/tcp   awx_rabbitmq
    a8ac0374577f        postgres:9.6                 "docker-entrypoint..."   11 minutes ago      Up 24 seconds       5432/tcp                                              awx_postgres
    ca7dd18fd62a        memcached:alpine             "docker-entrypoint..."   11 minutes ago      Up 25 seconds       11211/tcp                                             awx_memcached
    
    # 停止中コンテナ
    sudo docker ps -a
    ...
    761085d40a62        rabbitmq:3                   "docker-entrypoint..."   2 hours ago          Exited (0) 5 minutes ago                                                         rabbitmq
    909dc2f013aa        memcached:alpine             "docker-entrypoint..."   14 months ago        Exited (0) 5 minutes ago                                                         memcached
    5f12da648e69        postgres:9.6                 "docker-entrypoint..."   14 months ago        Exited (0) 5 minutes ago                                              
    
    # 使ってないコンテナは削除。データも消えるので注意
    sudo docker rm rabbitmq memcached 5f12da648e69
    
    # imagesの確認
    sudo docker images
    ...
    ansible/awx_task       1.0.5               9359e95d415b        14 months ago       1.01GB
    ansible/awx_web        1.0.5               9dba13b1e5ed        14 months ago       984MB
    ansible/awx_task       1.0.5.24            578ac27bdfd6        15 months ago       1.01GB
    ansible/awx_web        1.0.5.24            ed24a6014237        15 months ago       985MB
    ...
    rabbitmq               3                   8e186865bff8        21 months ago       124MB
    ...
    
    # 古いimageが不用であればディスクを食うので削除
    sudo docker rmi 9359e95d415b 9dba13b1e5ed 578ac27bdfd6 ed24a6014237 8e186865bff8

インストール

  • デフォルトでは「/root/awx」にgit cloneされるが、「/opt/awx」に変更
  • デフォルトのpostgresql datadirが「/tmp」上にあり10日で削除されて壊れるため、変更
  • デフォルトのBasic認証ID/Pass: admin/password
  • dockerhub_version: ansible/awx_web のバージョン参照。「latest」がデフォルトだが、動作しない事も多い。
  • group_vars/ または host_vars/ へ追加
    awx_repo_dir: /opt/awx
    postgres_data_dir: /var/lib/pgdocker
    dockerhub_version: 1.0.5 # OR 1.0.5.32
  • 「/var/lib/awx/projects」が無くて、local projectを作れない、playbookが実行できないので、local project用ディレクトリを作成するように設定を変える
    • AWXに/var/lib/awx/projectsがない時の対処 | 日常系エンジニアのTech Blog
      cd /opt/awx/
      sudo vim installer/inventory
      --
      postgres_data_dir: /var/lib/pgdocker
      dockerhub_version: 1.0.5
      project_data_dir=/var/lib/awx/projects
      --
      sudo ansible-playbook -i installer/inventory installer/install.yml
    • project毎にplaybookディレクトリを指定できるので、「local test」用ディレクトリを作成
      sudo mkdir -p /var/lib/awx/projects/test/
      sudo vim /var/lib/awx/projects/test/playbook.hello.yml
      --
      - hosts: localhost
        connection: local
        gather_facts: no
        become: no
        tasks:
        - debug:
            msg: "Hello World!"
      --
  • インベントリーの追加: playbookを実行するホストを指定する
    • 名前: local test
    • 保存
    • ホスト > ホストの追加
    • ホスト名: localhost
    • 変数: yaml
      ---
      ansible_connection: local
    • 保存
  • プロジェクトの追加: playbookのある git, svn, localといった場所を指定する
    • 名前: local test
    • 組織: Default
    • SCMタイプ: 手動
    • プロジェクトのベースパス(変更不能): /var/lib/awx/projects
    • 保存
  • ジョブテンプレートの追加: playbookを実行するテンプレートを作成する
    • 追加 > ジョブテンプレート
    • 名前: hello world
    • インベントリー: local test
    • プロジェクト: local test
    • playbook: playbook.hello.yml
    • 保存
  • 実行
    • PORTAL MODE > 「hellow world」 テンプレートを選択
    • アクションのロケットアイコンクリックで実行
    • 「"msg": "Hello World!"」のように表示されれば成功

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-11-13 (水) 18:55:54 (22d)