Как зарегистрировать переменную в Ansible, извлеченную из вывода JSON?

Я пытаюсь автоматизировать настройку дистрибутива Amazon Cloudfront с помощью Ansible. В настоящее время мне нужно найти в Amazon Certificate Manager ARN (имя ресурса Amazon) моего сертификата и сохранить ARN в качестве переменной для последующего использования в конфигурации моего дистрибутива Cloudfront.

Мой поиск для этого выглядит следующим образом:

- name: Check for existence of a certificate for this project in Amazon Certificate Manager
  command: >
    aws acm list-certificates 
      --profile "{{ project_name }}"-deploy
      --region us-east-1 
  register: cert_list
  ignore_errors: True

- name: Record list-certificates output to Json  
  set_fact: 
    this_project_arn: # I want to set this from the output of list-certficates

- debug: msg="{{ cert_list.stdout | from_json }}"

Вывод этой отладки в настоящее время выглядит следующим образом:

TASK [configure-cloudfront : debug] ********************************************
ok: [localhost] => {
    "msg": {
        "CertificateSummaryList": [
            {
                "CertificateArn": "arn:aws:acm:us-east-1:123456789101:certificate/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", 
                "DomainName": "*.foo.com"
            }
        ]
    }
}

У меня две цели:

  1. Вытащите значение CertificateArn из возвращаемого там JSON;
  2. Сделайте его устойчивым, специально найдя в результатах «foo.com» (у меня есть домен как Ansible var, готовый для сравнения) и сохранив только ARN для сертификата этого домена на случай, если list-certificates вернет более одного сертификата.

Есть ли способ записать мой set_fact из обхода вывода JSON из cert_list.stdout и вернуть только значение ARN, где значение DomainName содержит foo.com?

Спасибо!


person Ben    schedule 09.10.2016    source источник


Ответы (1)


Вам нужно with_items в проанализированных данных, чтобы перебрать сводки сертификатов, затем вы можете фильтровать с помощью when, чтобы выборочно set_fact:

- name: Set ARN for passed in domain
  set_fact:
    project_arn: "{{ item.CertificateArn }}"
  when: item.DomainName == "*.foo.com"
  with_items: "{{ (cert_list.stdout|from_json).CertificateSummaryList }}"
person guido    schedule 09.10.2016
comment
Это хороший пример использования фильтра jinja2 внутри скобок в шаблонах. - person Rob H; 10.10.2016
comment
Это идеально. Действительно полезный шаблон, который я, несомненно, буду использовать снова в будущем. Большое спасибо! - person Ben; 10.10.2016