Я пытаюсь запустить задания awx для экземпляров aws ec2, но продолжаю получать предупреждение «[ПРЕДУПРЕЖДЕНИЕ] Не удалось сопоставить предоставленный шаблон хоста, игнорируя: security_groups_webservers. Если я запускаю ту же книгу из командной строки, она работает.
Версии:
awx: 17.0.1 (same problem on 15.0.1)
ansible: 2.9.17
ansible.cfg
[defaults]
inventory = /opt/ansible/inventory/aws_ec2.yml
enable_plugins = aws_ec2
host_key_checking = false
private_key_file = [the key identified on the EC2 instance]
remote_user = ubuntu
Инвентаризация вакансий /opt/ansible/inventory/aws_ec2.yml:
plugin: aws_ec2
regions:
- us-east-2
strict: false
keyed_groups:
- key: tags
prefix: tag
- key: placement.region
prefix: aws_region
- key: 'security_groups|json_query("[].group_name")'
prefix: 'security_groups'
hostnames:
- ip-address
- dns-name
- tag:Name
- private-ip-address
Обратите внимание, как перечисленные ниже хосты перечислены по их IP-адресам, а не по именам общедоступных DNS. Это связано с разделом «hostnames» в приведенном выше файле инвентаризации aws_ec2.yml. Раздел hostname сообщает ansible-inventory в списке приоритетов, как отображать хосты.
ансибл-инвентарь --граф
@all:
|--@aws_ec2:
| |--###.###.166.103
| |--###.###.76.94
| @aws_region_us_east_2:
| |--###.###.166.103
| |--###.###.76.94
| @security_groups_dbservers:
| |--###.###.166.103
| @security_groups_webservers:
| |--###.###.76.94
...
Простая инструкция по настройке ping под названием ping.yml
---
- hosts:
- security_groups_dbservers
- security_groups_webservers
tasks:
- name: ping hosts
ping:
Запуск playbook из командной строки:
ansible-playbook ping.yml
PLAY [security_groups_dbservers,security_groups_webservers]****
TASK [Gathering Facts] ****************************************
ok: [###.###.76.94]
ok: [###.###.166.103]
TASK [ping hosts] *********************************************
ok: [###.###.76.94]
ok: [###.###.166.103]
PLAY RECAP ****************************************************
###.###.166.103 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
###.###.76.94 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Детали проекта AWX:
Name: ping-project
Organization: Default
Source Control Credential Type: Manual
Project Base Path: /var/lib/awx/projects
Playbook directory: lab1
Инвентарь:
Name: aws-ec2-inventory
Organization: Default
Источники инвентаря: (синхронизировано)
Name: aws-ec2-source
Source: Amazon EC2
Credential: aws-iam-user
Overwrite: (checked)
Хозяева инвентаря:
ec2-###-###-166-103.us-east-2.compute.amazonaws.com
ec2-###-###-76-94.us-east-2.compute.amazonaws.com
Вот первый признак того, что что-то не работает. Хосты перечислены по их DNS-именам. Если бы awx использовал тот же файл инвентаризации, что и ansible-inventory, они отображались бы как IP-адреса.
Вот детали (факты) AWX для одного из хостов:
...
network_interfaces:
- association:
...
groups:
group_name: dbservers
...
...
security_groups:
group_name: dbservers
...
Очевидно, что это не связывает группу security_groups_dbservers, созданную в плагине aws_ec2, с указанным выше security_groups.group_name: dbservers. Итак, я думаю, мне нужно преобразовать имя группы в playbook, чтобы говорить в терминологии awx. Вопрос в том, как?
Реквизиты для входа:
(AWS IAM user)
Name: aws-iam-user
Orgainzation: Default
Credential Type: Amazon Web Services
Access Key: [aws iam user's ACCESS key]
Secret Key: [aws iam user's SECRET key]
(AWS Ubuntu t2.micro instance)
Name: ubuntu-machine-ssh
Organization: Default
Credential Type: Machine
Username: ubuntu
SSH Private Key: [the key identified on the EC2 instance]
Шаблон вакансии AWX:
Name: ping-hosts
Job Type: Run
Inventory: aws-ec2-inventory
Project: ping-project
Playbook: ping.yml
Credentials: ubuntu-machine-ssh
Выход:
Identity added: /tmp/awx_288_j3vtwbvj/artifacts/288/ssh_key_data
(/tmp/awx_288_j3vtwbvj/artifacts/288/ssh_key_data)
[WARNING]: Could not match supplied host pattern, ignoring:
security_groups_dbservers
[WARNING]: Could not match supplied host pattern, ignoring:
security_groups_webservers
PLAY [security_groups_dbservers,security_groups_webservers] ********************
skipping: no hosts matched
PLAY RECAP *********************************************************************
Вывод отладки:
Using /tmp/awx_288_j3vtwbvj/project/ansible.cfg as config file
host_list declined parsing /tmp/awx_288_j3vtwbvj/tmpbc_m8p2g as it did
not pass its verify_file() method
Здесь меня бросает в глаза то, что модуль host_list отказался от синтаксического анализа. Но в ansible.cfg включен плагин aws_ec2, который должен был поместить его в список «инвентаризаций» для проверки вместе с модулем «host_list». Он говорит, что плагин aws_ec2 даже не проверялся.
Какие-либо предложения?