1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Ansible AWX】インストール

Last updated at Posted at 2018-10-20

まとめ

  • Ansible AWX をインストールする。
  • 面倒臭いため全ての操作を root ユーザで行っています。良くないことはわかっています。ごめんなさい。

検証用ホストの調達

AWS にて、デフォルト VPC のデフォルトサブネット内にインスタンス(ホスト名は awx とする)を作成する。

Ansible AWX の導入

公式のインストールガイドに従ってインストールする。
https://github.com/ansible/awx/blob/devel/INSTALL.md

Docker のインストール

Dockerdocker-py が必要らしい。

まずは docker-ce をインストールしようと思ったところ...

[root@awx ~]# yum search docker-ce
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-
                   : motd
警告: 一致するものが見つかりません: docker-ce
No matches found

yum リポジトリがない模様。

Docker 公式を参考に yum リポジトリに追加する。

[root@awx ~]# yum-config-manager \
> --add-repo https://download.docker.com/linux/centos/docker-ce.repo
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-
                   : motd
adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
[root@awx ~]#

再度 yum search で確認したところ、無事追加されたようです。

[root@awx ~]# yum search docker-ce
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-
                   : motd
==================== N/S matched: docker-ce ====================
docker-ce.x86_64 : The open-source application container engine
docker-ce-selinux.noarch : SELinux Policies for the open-source
                         : application container engine

  Name and summary matches only, use "search all" for everything.
[root@awx ~]# 

ようやくインストール。

[root@awx ~]# yum install docker-ce

docker-py とやらもインストールしておく。

pip が入っていなかったので、こいつを入れた上で pip install docker-py します。

[root@awx ~]# easy_install pip
[root@awx ~]# pip install docker-py

Ansible のインストール

ついでにこのタイミングで Ansible もインストールする( Ansible AWX のインストールに使うので)。

[root@awx ~]# pip install ansible

Ansible AWX のインストール

それっぽいディレクトリに公式リポジトリを git clone する。

[root@awx local]# git clone https://github.com/ansible/awx.git

docker を起動して、いよいよ Ansible AWX のインストールです。

[root@awx local]# cd /usr/local/awx/installer
[root@awx installer]# ansible-playbook --inventory inventory install.yml 

...
(省略)
...

TASK [local_docker : Activate AWX Web Container] *********************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Error creating container: unhashable type: 'list'"}
	to retry, use: --limit @/usr/local/awx/installer/install.retry

PLAY RECAP ***********************************************************************************************************************
localhost                  : ok=10   changed=0    unreachable=0    failed=1  

まじかよ。

unhashable type: 'list'

とは、 python の辞書のキーに配列を渡してることに起因しているらしい。

失敗したタスクを確認してみる。

- name: Activate AWX Web Container
  docker_container:
    name: awx_web
    state: started
    restart_policy: unless-stopped
    image: "{{ awx_web_docker_actual_image }}"
    volumes:
      - "{{ project_data_dir + ':/var/lib/awx/projects:rw' if project_data_dir is defined else [] }}"
      - "{{ ca_trust_dir + ':/etc/pki/ca-trust/source/anchors:ro' if ca_trust_dir is defined else [] }}"
    user: root
    ports:
      - "{{ host_port }}:8052"
    links: "{{ awx_web_container_links|list }}"
    hostname: "{{ awx_web_hostname }}"
    dns_search_domains: "{{ awx_container_search_domains.split(',') if awx_container_search_domains is defined else omit }}"
    dns_servers: "{{ awx_alternate_dns_servers.split(',') if awx_alternate_dns_servers is defined else omit }}"
    env:
      http_proxy: "{{ http_proxy | default('') }}"
      https_proxy: "{{ https_proxy | default('') }}"
      no_proxy: "{{ no_proxy | default('') }}"
      SECRET_KEY: "{{ secret_key }}"
      DATABASE_NAME: "{{ pg_database }}"
      DATABASE_USER: "{{ pg_username }}"
      DATABASE_PASSWORD: "{{ pg_password }}"
      DATABASE_PORT: "{{ pg_port }}"
      DATABASE_HOST: "{{ pg_hostname_actual }}"
      RABBITMQ_USER: "{{ rabbitmq_default_username }}"
      RABBITMQ_PASSWORD: "{{ rabbitmq_default_password }}"
      RABBITMQ_HOST: "rabbitmq"
      RABBITMQ_PORT: "{{ rabbitmq_port }}"
      RABBITMQ_VHOST: "{{ rabbitmq_default_vhost }}"
      MEMCACHED_HOST: "memcached"
      MEMCACHED_PORT: "11211"
      AWX_ADMIN_USER: "{{ default_admin_user|default('admin') }}"
      AWX_ADMIN_PASSWORD: "{{ default_admin_password|default('password') }}"
  register: awx_web_container

docker_container モジュールで失敗しているようですが、

 volumes:
       - "{{ project_data_dir + ':/var/lib/awx/projects:rw' if project_data_dir is defined else [] }}"
       - "{{ ca_trust_dir + ':/etc/pki/ca-trust/source/anchors:ro' if ca_trust_dir is defined else [] }}"

の部分が非常に怪しい。

変数が定義されている場合は文字列を、定義されていない場合は空の配列を返すらしい。えぇ...

-vvv オプションをつけて再度実行してみましょう。

...
(省略)
...
TASK [local_docker : Activate AWX Web Container] *********************************************************************************
task path: /usr/local/awx/installer/roles/local_docker/tasks/standalone.yml:79
<localhost> ESTABLISH LOCAL CONNECTION FOR USER: root
<localhost> EXEC /bin/sh -c 'echo ~root && sleep 0'
<localhost> EXEC /bin/sh -c '( umask 77 && mkdir -p "` echo /root/.ansible/tmp/ansible-tmp-1539493799.13-47679237691830 `" && echo ansible-tmp-1539493799.13-47679237691830="` echo /root/.ansible/tmp/ansible-tmp-1539493799.13-47679237691830 `" ) && sleep 0'
Using module file /usr/lib/python2.7/site-packages/ansible/modules/cloud/docker/docker_container.py
<localhost> PUT /root/.ansible/tmp/ansible-local-4387s0rrtI/tmpo9Accv TO /root/.ansible/tmp/ansible-tmp-1539493799.13-47679237691830/AnsiballZ_docker_container.py
<localhost> EXEC /bin/sh -c 'chmod u+x /root/.ansible/tmp/ansible-tmp-1539493799.13-47679237691830/ /root/.ansible/tmp/ansible-tmp-1539493799.13-47679237691830/AnsiballZ_docker_container.py && sleep 0'
<localhost> EXEC /bin/sh -c '/usr/bin/env python /root/.ansible/tmp/ansible-tmp-1539493799.13-47679237691830/AnsiballZ_docker_container.py && sleep 0'
<localhost> EXEC /bin/sh -c 'rm -f -r /root/.ansible/tmp/ansible-tmp-1539493799.13-47679237691830/ > /dev/null 2>&1 && sleep 0'
The full traceback is:
Traceback (most recent call last):
  File "/root/.ansible/tmp/ansible-tmp-1539493799.13-47679237691830/AnsiballZ_docker_container.py", line 113, in <module>
    _ansiballz_main()
  File "/root/.ansible/tmp/ansible-tmp-1539493799.13-47679237691830/AnsiballZ_docker_container.py", line 105, in _ansiballz_main
    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)
  File "/root/.ansible/tmp/ansible-tmp-1539493799.13-47679237691830/AnsiballZ_docker_container.py", line 48, in invoke_module
    imp.load_module('__main__', mod, module, MOD_DESC)
  File "/tmp/ansible_docker_container_payload_YPzsaG/__main__.py", line 2177, in <module>
  File "/tmp/ansible_docker_container_payload_YPzsaG/__main__.py", line 2172, in main
  File "/tmp/ansible_docker_container_payload_YPzsaG/__main__.py", line 1772, in __init__
  File "/tmp/ansible_docker_container_payload_YPzsaG/__main__.py", line 1801, in present
  File "/tmp/ansible_docker_container_payload_YPzsaG/__main__.py", line 1245, in has_different_configuration
  File "/tmp/ansible_docker_container_payload_YPzsaG/__main__.py", line 1672, in _get_expected_volumes
TypeError: unhashable type: 'list'

fatal: [localhost]: FAILED! => {
    "changed": false, 
    "module_stderr": "Traceback (most recent call last):\n  File \"/root/.ansible/tmp/ansible-tmp-1539493799.13-47679237691830/AnsiballZ_docker_container.py\", line 113, in <module>\n    _ansiballz_main()\n  File \"/root/.ansible/tmp/ansible-tmp-1539493799.13-47679237691830/AnsiballZ_docker_container.py\", line 105, in _ansiballz_main\n    invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\n  File \"/root/.ansible/tmp/ansible-tmp-1539493799.13-47679237691830/AnsiballZ_docker_container.py\", line 48, in invoke_module\n    imp.load_module('__main__', mod, module, MOD_DESC)\n  File \"/tmp/ansible_docker_container_payload_YPzsaG/__main__.py\", line 2177, in <module>\n  File \"/tmp/ansible_docker_container_payload_YPzsaG/__main__.py\", line 2172, in main\n  File \"/tmp/ansible_docker_container_payload_YPzsaG/__main__.py\", line 1772, in __init__\n  File \"/tmp/ansible_docker_container_payload_YPzsaG/__main__.py\", line 1801, in present\n  File \"/tmp/ansible_docker_container_payload_YPzsaG/__main__.py\", line 1245, in has_different_configuration\n  File \"/tmp/ansible_docker_container_payload_YPzsaG/__main__.py\", line 1672, in _get_expected_volumes\nTypeError: unhashable type: 'list'\n", 
    "module_stdout": "", 
    "msg": "MODULE FAILURE\nSee stdout/stderr for the exact error", 
    "rc": 1
}

公式ソースで _get_expected_volumes を検索してみたところ、多分このへんが原因です。

/path/to/awx/installer/inventory の変数定義をアンコメントする必要があるようです。

# AWX project data folder. If you need access to the location where AWX stores the projects
# it manages from the docker host, you can set this to turn it into a volume for the container.

## ★ここをアンコメント★
project_data_dir=/var/lib/awx/projects
## ★ここをアンコメント★

# CA Trust directory. If you need to provide custom CA certificates, supplying
# this variable causes this directory on the host to be bind mounted over
# /etc/pki/ca-trust in the awx_task and awx_web containers.
# NOTE: only obeyed in local_docker install

## ★ここをアンコメント★
ca_trust_dir=/etc/pki/ca-trust
## ★ここをアンコメント★

再度 ansible-playbook を実行して、今度は成功。

http://xx.xx.xx.xxxx.xx.xx.xx はグローバルIP)にアクセスしてみると...

awx.png

とりあえずインストールは完了です。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?