基于区域的基于环境的动态vars文件加载

时间:2020-05-26 13:24:15

标签: amazon-ec2 ansible ansible-inventory

我想根据区域和环境类型来加载特定的var文件。 我有一本剧本,使用以下类型的配置可一次创建多个ec2实例-

---
- 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角色相关的var,这些var可能因地区而异,也取决于环境,是prod还是在测试。但我找不到办法。

我需要某种结构..假设用户在运行诸如--extra-vars "environment=prod location=EU"之类的剧本时提供了额外的变量 然后剧本将在特定区域创建ec2实例,以读取特定的ec2.yml文件,例如ec2_prod_EU.yml

ec2_testing_US.yml

或者以更好的方式将vars文件从特定目录加载

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

我该怎么做.. include_vars是一个选项,但是有没有更好的方法来实现它。预先感谢

2 个答案:

答案 0 :(得分:0)

我将所有这些信息都放在了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

还需要设置一些其他内容。我不知道您的环境,但这就是我为ACA(又称Obamacare)构建EC2服务器的方式。

答案 1 :(得分:0)

我已经通过以下方式做到了- 我在执行剧本时通过的角色和条件参数中有条件添加的vars文件-

- 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 

并在调用剧本时-

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}"