региональная среда на основе Dynami c загрузка файла vars в ansible - PullRequest
0 голосов
/ 26 мая 2020

Я хочу загрузить определенные c файлы var в ansible в зависимости от региона и типа среды. У меня есть playbook, который создает несколько экземпляров ec2 в go со следующей конфигурацией -

---
- hosts: local
  gather_facts: true
  any_errors_fatal: true
  vars_files:
    - group_vars/ec2.yml

  roles:
    - role-for-instance-1-creation
    - role-for-instance-1-creation

, но проблема в том ... в зависимости от требований пользователя, он может создавать экземпляры в регионе ЕС однажды, в регионе США, в другой раз. ec2.yml содержит переменные, связанные с ролями ec2, которые могут различаться в зависимости от региона, а также в зависимости от среды, является ли это продуктом или тестируется. но я не смог найти способ.

Мне нужна какая-то структура ... где предположим, что пользователь предоставил дополнительные переменные при запуске playbook, например --extra-vars "environment=prod location=EU", и playbook создаст instnaces ec2 в specfi c спецификация чтения региона c файл ec2.yml, например ec2_prod_EU.yml или как

ec2_testing_US.yml

, или, что лучше, файлы vars будут загружаться из указанного c каталога

group_vars/prod/ec2-EU.yml
group_vars/testing/ec2-US.yml

как я могу это сделать .. include_vars - это вариант, но есть ли лучший способ добиться этого. Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 02 июня 2020

Я сделал это следующим образом - условно добавил файл vars для ролей и параметров условия, которые я передал при выполнении playbook -

- name: dynamic ec2 yml load
  include_vars:
        file: group_vars/test/ec2_us_test_session_host_1.yml
  when: environment_use == 'test' and location == 'us'
  tags:
          - ec2-creation 

и при вызове playbook -

ansible-playbook my-playbook.yml --extra-vars "source_ami=${Source_AMI} Description_new_hosts=${description} environment_use=${environment_use} location=${location} availability_zone=${AZ} subnet=${subnet}"
0 голосов
/ 26 мая 2020

Я помещаю всю эту информацию в group_vars/all, поэтому localhost автоматически получит необходимые переменные. Итак, файл group_vars/all/infrastructure.yml может выглядеть так:

environments:
- environment: prod
  region: us-east1
  servers:
  - type: app
    count: 50
    instance_type: m4.xlarge
  - type: data
    count: 15
    instance_type: m4.xlarge
- environment: test
  region: us-west2
  servers:
  - type: app
    count: 5
    instance_type: m4.xlarge
  - type: data
    count: 3
    instance_type: m4.xlarge

Теперь ваш ec2 вызов должен пройти через все это.

---
- hosts: localhost
  connection: local
  gather_facts: false
  tasks:
  - name: Provision a set of instances
    ec2:
        instance_type: "{{ item.1.instance_type }}"
        image: "{{ image }}"
        region: "{{ item.0.region }}"
        vpc_subnet_id: "{{ subnets[item.0.env] }}"
        tenancy: "{{ tenancy }}"
        group_id: "{{ group_id }}"
        key_name: "{{ key_name }}"
        wait: true
        instance_tags:
           Type: "{{ item.1.type }}"
           Env: "{{ item.0.env }}"
        count_tag:
           Type: "{{ item.1.type }}"
           Env: "{{ item.0.env }}"
        exact_count: "{{ item.1.count }}"
    with_subelements:
      - "{{ environments }}"
      - servers

Там есть еще кое-что, что вы нужно будет установить. Я не знаю вашего окружения, но именно так я построил серверы EC2 для ACA (он же Obamacare).

...