Skip to content

#ToolTip - AWX (Ansible Tower)

Pra você que está mexendo com Ansible a um tempo, com certeza já deve conhecer essa ferramenta. Simplesmente uma das interfaces de gerenciamento mais conhecidas para o ansible. AWX também é o projeto upstream do Ansible Tower, que pertence a Red Hat.

Com base na documentação oficial, existem 3 formas de instalação, Openshift, Kubernetes e Docker compose. Irei mostrar o procedimento para instalação utilizando Containers(docker) em cima do CentOS 7. Vamos iniciar com os pre-requisitos para o correta instalação.

yum install -y yum-utils git ansible python3 libselinux-python3 -y

Agora instalação do Docker.

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io -y 

systemctl start docker
systemctl enable docker
Instalação do docker-compose (módulo python).

pip3 install docker-compose
alternatives --set python /usr/bin/python3

Instalação do Docker compose.

curl -L "https://github.com/docker/compose/releases/download/1.26.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

Criação das regras de firewall necessárias para o funcionamento do serviço.

firewall-cmd --zone=public --add-masquerade --permanent
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload

Criação do diretório default do projeto para o postgres, conforme arquivo de configuração. E download dos arquivos do projeto oficial no github.

mkdir /var/lib/pgdocker
git clone https://github.com/ansible/awx.git
cd awx/installer/

Execução do playbook de instalação.

ansible-playbook -i inventory install.yml

Com isso você pode acessar no ip ou hostname da Máquina que você instalou. Irá aparecer uma página como esta. Login e Senha padrão , admin / password.

Agora, é cadastrar os hosts, configurar os playbooks e os jobs.

Workaround1 – AWX is Upgrading

Caso após o procedimento de instalação tenha aparecido uma tela como esta e permaneça por muito tempo.

Você pode enviar o comando a partir da máquina onde está instalado:

docker logs -f awx_task

Com isso você irá acompanhar os logs do container, awx_task. Caso você encontre repetidamente a existência do seguinte trecho nos logs, significa que algo ocorreu durante o boot dos containers e não está comunicando corretamente

django.db.utils.ProgrammingError: relation "main_instance" does not exist
LINE 1: SELECT (1) AS "a" FROM "main_instance" WHERE "main_instance"...
                               ^

2020-07-03 20:16:21,353 INFO exited: dispatcher (exit status 1; not expected)
2020-07-03 20:16:21,353 INFO exited: dispatcher (exit status 1; not expected)
2020-07-03 20:16:22,357 INFO spawned: 'dispatcher' with pid 237
2020-07-03 20:16:22,357 INFO spawned: 'dispatcher' with pid 237
2020-07-03 20:16:23,359 INFO success: dispatcher entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2020-07-03 20:16:23,359 INFO success: dispatcher entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2020-07-03 20:16:25,793 WARNING  awx.main.dispatch.periodic periodic beat started
Traceback (most recent call last):
  File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedTable: relation "main_instance" does not exist
LINE 1: SELECT (1) AS "a" FROM "main_instance" WHERE "main_instance"...
                               ^


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/bin/awx-manage", line 8, in <module>
    sys.exit(manage())
  File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/awx/__init__.py", line 154, in manage
    execute_from_command_line(sys.argv)
  File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/core/management/__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/core/management/base.py", line 323, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/core/management/base.py", line 364, in execute
    output = self.handle(*args, **options)
  File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/awx/main/management/commands/run_dispatcher.py", line 55, in handle
    reaper.reap()
  File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/awx/main/dispatch/reaper.py", line 38, in reap
    (changed, me) = Instance.objects.get_or_register()
  File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/awx/main/managers.py", line 144, in get_or_register
    return (False, self.me())
  File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/awx/main/managers.py", line 100, in me
    if node.exists():
  File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/models/query.py", line 766, in exists
    return self.query.has_results(using=self.db)
  File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/models/sql/query.py", line 522, in has_results
    return compiler.has_results()
  File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1110, in has_results
    return bool(self.execute_sql(SINGLE))
  File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 1140, in execute_sql
    cursor.execute(sql, params)
  File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/backends/utils.py", line 67, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/backends/utils.py", line 76, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/var/lib/awx/venv/awx/lib/python3.6/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: relation "main_instance" does not exist
LINE 1: SELECT (1) AS "a" FROM "main_instance" WHERE "main_instance"...
                               ^

Uma solução que encontrei para isso foi, reiniciar o serviço docker. Após o reboot, os serviços normalizaram e subiram corretamente, e o log do awx_task ficou, assim:

RESULT 2
OKREADY
2020-07-04 02:44:02,426 DEBUG    awx.main.dispatch task f6eee5e4-5a28-4b36-81e0-0742d680a54e starting awx.main.tasks.awx_periodic_scheduler(*[])
2020-07-04 02:44:02,433 DEBUG    awx.main.tasks Starting periodic scheduler
2020-07-04 02:44:02,436 DEBUG    awx.main.tasks Last scheduler run was: 2020-07-04 02:43:32.404286+00:00
2020-07-04 02:44:12,437 DEBUG    awx.main.dispatch task d38b3829-0bc3-4476-a164-c9b8017e8711 starting awx.main.scheduler.tasks.run_task_manager(*[])
2020-07-04 02:44:12,438 DEBUG    awx.main.scheduler Running Tower task manager.
2020-07-04 02:44:12,452 DEBUG    awx.main.scheduler Starting Scheduler
2020-07-04 02:44:12,479 DEBUG    awx.main.scheduler Finishing Scheduler
2020-07-04 02:44:32,477 DEBUG    awx.main.dispatch task e9f7f38b-5638-41d9-bf20-daa04b43f792 starting awx.main.tasks.awx_periodic_scheduler(*[])
2020-07-04 02:44:32,595 DEBUG    awx.main.tasks Starting periodic scheduler
2020-07-04 02:44:32,473 DEBUG    awx.main.dispatch task 68163837-51b6-4b4b-ac7d-569206898d86 starting awx.main.tasks.awx_k8s_reaper(*[])
2020-07-04 02:44:32,472 DEBUG    awx.main.dispatch task f5352616-419a-42fb-a13f-0606d3764423 starting awx.main.tasks.cluster_node_heartbeat(*[])
2020-07-04 02:44:32,598 DEBUG    awx.main.tasks Cluster node heartbeat task.
2020-07-04 02:44:32,599 DEBUG    awx.main.tasks Last scheduler run was: 2020-07-04 02:44:02.434157+00:00
2020-07-04 02:44:32,486 DEBUG    awx.main.dispatch task 6dbd2e92-0279-4557-b70a-edd2f40da337 starting awx.main.scheduler.tasks.run_task_manager(*[])
2020-07-04 02:44:32,611 DEBUG    awx.main.scheduler Running Tower task manager.
2020-07-04 02:44:32,618 DEBUG    awx.main.scheduler Starting Scheduler
2020-07-04 02:44:32,643 DEBUG    awx.main.scheduler Finishing Scheduler
2020-07-04 02:44:52,502 DEBUG    awx.main.dispatch task ab829c24-ce33-4f25-aece-2a5fab0eecea starting awx.main.scheduler.tasks.run_task_manager(*[])
2020-07-04 02:44:52,504 DEBUG    awx.main.scheduler Running Tower task manager.
2020-07-04 02:44:52,518 DEBUG    awx.main.scheduler Starting Scheduler
2020-07-04 02:44:52,545 DEBUG    awx.main.scheduler Finishing Scheduler
RESULT 2

Caso queira automatizar ainda mais a instalação, segue o link de um playbook em ansible, assim como outros projetos.