Рейтинг:1

Переменная результата отладочного сообщения Ansible print

флаг hk

У меня есть простая задача, которую я не могу решить.

У меня есть playbook, который возвращает конфигурацию экземпляра AWS EC2. Мне нужно только распечатать (показать) частный_ip_адрес.

Вот моя книга игр

---
- хозяева: местные
  подключение: местное
  сбор_фактов: ложь
  стать: да
  метод_становления: включить

  задачи:

  - имя: сбор-информация-ec2
    community.aws.ec2_instance_info:
      instance_ids:
        - я-XXXXXAAAAAA

    регистр: ec2

  - отладка: msg="{{ ec2.instances.network_interfaces.private_ip_address }}"

Когда я запускаю его таким образом, я получаю следующую ошибку.

фатальный: [localhost]: FAILED! => {"msg": "Задача включает параметр с неопределенной переменной. Ошибка: "объект списка" не имеет атрибута "network_interfaces"\n\nПохоже, ошибка находится в "/etc/ansible/playbooks/AWSLinuxMigration /gather_ec2_info.yaml': строка 16, столбец 5, но может быть\nв другом месте файла в зависимости от конкретной проблемы с синтаксисом.\n\nОшибочная строка:\n\n\n - debug: msg=\" {{ ec2.instances.network_interfaces.private_ip_address }}\"\n ^ здесь\nМожет быть, мы ошибаемся, но здесь похоже, что проблема связана с\nотсутствием кавычек. Всегда заключайте в скобки выражение шаблона,\nкогда они начинают значение. Например:\n\n with_items:\n - {{ foo }}\n\nДолжен быть записан как:\n\n with_items:\n - \"{{ foo }}\"\n"}

Когда я выполняю его без раздела DEBUG и с -ввв он отображает результат ниже. Как извлечь и распечатать этот адрес? Я немного сократил, но вы поняли

хорошо: [локальный хост] => {
    "сообщение": {
        «изменено»: ложь,
        «не удалось»: ложь,
        "экземпляры": [
            {
                "ami_launch_index": 0,
                "архитектура": "x86_64",
                "block_device_mappings": [
                    {
                        "имя_устройства": "/dev/xvda",
                        "эбс": {
                            "attach_time": "2020-04-15T16:11:19+00:00",
                            "delete_on_termination": правда,
                            "статус": "прикреплен",
                            "volume_id": "xxxxxx"
                        }
                    }
                ],
                "capacity_reservation_specification": {
                    "capacity_reservation_preference": "открыто"
                },
                "клиент_токен": "",
                "параметры_процессора": {
                    "core_count": 1,
                    "threads_per_core": 2
                },
                "ebs_optimized": правда,
                "ena_support": правда,
                "enclave_options": {
                    «включено»: ложь
                },
                "hibernation_options": {
                    «настроено»: ложь
                },
                "гипервизор": "xen",
                "iam_instance_profile": {
                    "арн": "хххххх",
                    «идентификатор»: «хххххх»
                },
                "image_id": "ххххх",
                "instance_id": "ххххх",
                "instance_type": "t3.medium",
                "имя_ключа": "ххххх",
                "launch_time": "2021-04-21T00:01:25+00:00",
                "метаданные_опции": {
                    "http_endpoint": "включено",
                    "http_put_response_hop_limit": 1,
                    "http_tokens": "необязательно",
                    "состояние": "применяется"
                },
                "мониторинг": {
                    "состояние": "отключено"
                },
                "сетевые_интерфейсы": [
                    {
                        "ассоциация": {
                            "ip_owner_id": "хххх",
                            "public_dns_name": "ххххх",
                            "public_ip": "хххх"
                        },
                        "вложение": {
                            "attach_time": "2020-04-15T16:11:18+00:00",
                            "attachment_id": "ххххх",
                            "delete_on_termination": правда,
                            "индекс_устройства": 0,
                            "network_card_index": 0,
                            "статус": "прикреплен"
                        },
                        "description": "Основной сетевой интерфейс",
                        "группы": [
                            {
                                "group_id": "ххххх",
                                "имя_группы": "ххххх"
                            }
                        ],
                        "interface_type": "интерфейс",
                        "ipv6_адреса": [],
                        "mac_address": "ххххх",
                        "network_interface_id": "хххх",
                        "id_владельца": "ххххх",
                        "private_dns_name": "ip-10-0-1-161.ec2.internal",
                        "частный_ip_адрес": "10.0.1.161",
                        "частные_ip_адреса": [
                            {
                                "ассоциация": {
                                    "ip_owner_id": "ххххх",
                                    "public_dns_name": "xxxx.compute-1.amazonaws.com",
                                    "public_ip": "2.2.2.2"
                                },
                                «первичный»: правда,
                                "private_dns_name": "ip-333333.ec2.internal",
                                "private_ip_address": "1.1.1.1."
                            }
                        ],
                        "source_dest_check": правда,
                        "статус": "используется"

                    }
                ]
        ]
    }
}
Рейтинг:0
флаг br

Оба атрибута экземпляры и network_interfaces являются списками. Использовать json_query, например

    - отладка:
        сообщение: "{{ ec2.instances|
                 json_query('[].network_interfaces[].private_ip_address') }}"

Результатом также будет список, потому что может быть больше сетевых интерфейсов и больше адресов. В вашем случае вы можете выбрать первый, например.

    - отладка:
        сообщение: "{{ ec2.instances|
                 json_query('[].network_interfaces[].private_ip_address')|
                 первый }}"
housemd avatar
флаг hk
отлично, это сработало!!! как мне зарегистрировать это в переменной, чтобы я мог повторно использовать внутри playbook?
флаг br
См. [set_fact](https://docs.ansible.com/ansible/latest/collections/ansible/builtin/set_fact_module.html#ansible-builtin-set-fact-set-host-variable-s-and-fact-s ). Затем прочитайте [Как работают комментарии?] (https://meta.stackexchange.com/questions/19756/how-do-comments-work) и "Для чего нужны комментарии и когда я не должен их комментировать?" в частности.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.