Шаблон задания AWX не распознает группу инвентаря aws_ec2, но ansible-playbook распознает - один и тот же файл yaml для обоих

Я пытаюсь запустить задания 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 даже не проверялся.

Какие-либо предложения?


person Dan Seeland    schedule 24.02.2021    source источник


Ответы (1)


[Решено] awx явно не импортирует файл инвентаря из настройки 'inventory' в ansible.cfg. Я решил эту проблему, скопировав содержимое файла инвентаризации (aws_ec2.yml) в текстовое поле 'SOURCES VARIABLES' источника инвентаризации проекта, повторно синхронизировав источник инвентаризации и воала! Теперь у каждого хоста есть нужные мне группы, и он может перечислить хосты по их группам в рабочих сценариях. Я изменил задание ping, чтобы перечислить хосты по их группам безопасности (например, security_groups_webservers, security_groups_dbservers), и шаблон задания awx сработал. Так же, как и запуск командной строки!

person Dan Seeland    schedule 26.02.2021