Применять, когда условно для вложенных списков с Ansible, а не только для верхнего уровня - PullRequest
0 голосов
/ 08 апреля 2020

Итак, у меня проблема с Ansible + AWS EC2.

Если тип диска - «io1», следует указать «iops», иначе они не должны указываться. Если я хочу сделать тип диска настраиваемым, я должен подать заявку когда, но он не работает:

- name: Provision AWS Instances
  ec2:
    instance_type: "{{ ec2_instance_type }}"
    image: "{{ ec2_ami_id }}"
    ...
    volumes:
      - device_name: "{{ ec2_root_disk_name }}"
        volume_type: "{{ ec2_root_disk_type }}"
        volume_size: "{{ ec2_root_disk_size }}"
        delete_on_termination: "{{ ec2_root_disk_delete_on_termination }}"
        iops: "{{ ec2_root_disk_iops }}"
        when: ec2_root_disk_type == 'io1'
      - device_name: "{{ ec2_root_disk_name }}"
        volume_type: "{{ ec2_root_disk_type }}"
        volume_size: "{{ ec2_root_disk_size }}"
        delete_on_termination: "{{ ec2_root_disk_delete_on_termination }}"
        when: ec2_root_disk_type != 'io1'

Но это вложенное условие «когда» не обрабатывается, и диск добавляется дважды:

"volumes": [
    {
        "delete_on_termination": "true", 
        "device_name": "/dev/sda1", 
        "iops": "100", 
        "volume_size": "30", 
        "volume_type": "gp2", 
        "when": "ec2_root_disk_type == 'io1'"
    }, 
    {
        "delete_on_termination": "true", 
        "device_name": "/dev/sda1", 
        "volume_size": "30", 
        "volume_type": "gp2", 
        "when": "ec2_root_disk_type != 'io1'"
    }, 
]

Я мог бы добавить «когда» ко всей команде, за исключением того, что у меня может быть до 5 дисков, поэтому это будет означать копирование более 32 раз.

Можно ли сделать процесс Ansible 'когда' во вложенных списках?

Можно ли собрать этот список в переменную, ссылаясь на него в этой команде? Документация Ansible ничего не говорит о нестроковых, структурированных переменных. Может быть, я могу применить фильтрацию коллекции как-нибудь?

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

Ответы [ 3 ]

1 голос
/ 08 апреля 2020

Укажите объемы в инвентаре, а не в игре.

Например, файл group_vars/with_iops.yml:

volumes:
  - device_name: "{{ ec2_root_disk_name }}"
    volume_type: "{{ ec2_root_disk_type }}"
    volume_size: "{{ ec2_root_disk_size }}"
    delete_on_termination: "{{ ec2_root_disk_delete_on_termination }}"
    iops: "{{ ec2_root_disk_iops }}"

Файл group_vars/without_iops.yml:

volumes:
  - device_name: "{{ ec2_root_disk_name }}"
    volume_type: "{{ ec2_root_disk_type }}"
    volume_size: "{{ ec2_root_disk_size }}"
    delete_on_termination: "{{ ec2_root_disk_delete_on_termination }}"

спектакль:

- name: Provision AWS Instances
  ec2:
    instance_type: "{{ ec2_instance_type }}"
    image: "{{ ec2_ami_id }}"
    ...
    volumes: "{{ volumes }}"
0 голосов
/ 09 апреля 2020

В действительности я добавил пустой пользовательский модуль python к library/ и соответствующий плагин действий к action_plugins/ моей пьесы. В этом плагине я обрабатываю входные аргументы, формируя список томов, который мне нужен, и вызываю ec2 с улучшенными аргументами.

0 голосов
/ 08 апреля 2020

Вы можете использовать встроенное условие, например:

- device_name: "{{ ec2_root_disk_name }}"
  volume_type: "{{ ec2_root_disk_type }}"
  volume_size: "{{ ec2_root_disk_size }}"
  delete_on_termination: "{{ ec2_root_disk_delete_on_termination }}"
  iops: "{{ ec2_root_disk_iops if ec2_root_disk_type == 'io1' }}"
...