Ansible - EC2 Create-Install-AMI-CopyAMI

时间:2016-07-19 13:09:24

标签: amazon-ec2 amazon ansible ansible-playbook ami

我可以创建一个实例,安装并创建一个AMI。当我想将AMI复制到所有可用区域时,我陷入困境。

类似的东西:
forEach (region in regions): copy-ami to region done

我拥有什么:
  - 创建实例
  - 安装东西
  - 根据“创建实例”返回的值创建AMI
  - 根据“创建AMI”将AMI复制到所有区域 - (不工作!)

这是正确的方法吗? 我该如何正确地做到这一点?

(我知道这不是正确的方法,试图学习如何做到这一点) 剧本示例:
- hosts: local connection: local gather_facts: no roles: - { role: copy_ami, ec2_region: [ "ap-south-1" ]}

错误消息:
fatal: [localhost]: FAILED! => {"failed": true, "msg": "'dict object' has no attribute 'region'"}

这个角色是什么样的:
- ec2_ami_copy: source_region: "{{ item.region }}" region: "{{ ec2_region }}" source_image_id: "{{ item.image_id }}" wait: yes tags: Name: "{{ item.tags.Name }}" description: "{{ item.tags.Name }}" with_items: "{{ec2_storm_ami}}" register: ec2_ami_copy

谢谢,

3 个答案:

答案 0 :(得分:0)

根据ec2_ami_copy模块的文档。

- ec2_ami_copy:
    source_region: us-east-1
    region: eu-west-1
    source_image_id: ami-xxxxxxx

因为您要复制到多个区域。您可以执行set_fact并在剧本中创建区域列表。使用with_items插件将允许您遍历列表或字典。

- set_fact:
    aws_regions:
      - us-west-1
      - us-west-2

- ec2_ami_copy:
    source_region: us-east-1
    region: "{{ item }}"
    source_image_id: ami-xxxxxxx
  with_items: "{{ aws_regions }}"

答案 1 :(得分:0)

整个" with_items" &安培; "寄存器"我花了一些时间来完全理解,特别是在使用多个角色时。

解决方案: Playbook - 包含AWS播放(Create_EC2,安装/配置,AMI和AMI_Copy) 角色 - (如上所述)

我是如何遍历区域的?这比我最初的尝试更容易。 关键是要了解"注册"实际上工作并使用生成的JSON。

变量" ec2_instance"注册为创建实例的一部分,您可以只注册" ec2_instance.instances"并节省一些打字。 (如果你没有使用json的其他部分)

使用注册表示该变量在同一个剧本中的游戏中可用。 (起初对这部分非常困惑)

- debug: var=myvariable 您可以使用数组来表示" with_items"这里。这只是快速和脏。

希望这有助于将来有更多的新手。

最终建议: 使用:{{1}}使用不同的变体以确保获得所需内容,使用-vvvv运行也很有帮助。

答案 2 :(得分:0)

度过了一段艰难的时期,因为复制很容易但是输出很难。我正在为amiid使用var_input,然后在此程序中使用它。我想要一个包含region和ami信息的输出文件。粘贴这个有用的工具,可以帮助那些希望输出打印在某个文件中的人

---

- ec2_ami_copy:
    source_region: us-east-1
    region: "{{ item  }}"
    source_image_id: "{{  amiid  }}"
    encrypted: no
    wait: yes
    name: "image copied from {{ amiid  }} of N.Virginia"
    description: "This is working"
  with_items:
    - us-west-1
    - eu-west-1
  register: imageid

- name: Debug variables
  debug:
    msg: "{{ imageid }}"

- name: "Write info to Region-Ami.txt "
  lineinfile:
    dest: "{{ playbook_dir }}/Region-AMI-Info/Region-Ami.txt"
    regexp: "^{{ item.key }}"
    line: "{{ item.key }}: {{ '\"' + item.value + '\"' }}"
  with_items:
    - { key: 'aws_region', value: "{{ imageid.results[0].item }}" }
    - { key: 'AMI-ID', value: "{{ imageid.results[0].image_id }}" } 
    - { key: 'aws_region', value: "{{ imageid.results[1].item }}" }
    - { key: 'AMI-ID', value: "{{ imageid.results[1].image_id }}" }