Ansible - EC2 创建-安装-AMI-CopyAMI

Ansible - EC2 Create-Install-AMI-CopyAMI

我可以创建实例、安装和创建 AMI。当我想将该 AMI 复制到所有可用区域时遇到困难。

类似于:
forEach (region in regions): copy-ami to region done

我有:
- 创建实例
- 安装东西
- 根据 "Create Instance"
返回的值创建 AMI - 将 AMI 复制到基于 "Create 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

谢谢,

根据 ec2_ami_copy 模块的文档。

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

因为你要复制到多个区域。你可以做一个 set_fact and create a list of regions in the playbook. using the 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 }}"

整个 "with_items" 和 "register" 我花了一些时间才完全理解,尤其是在使用多个角色时。

解决方法: 剧本 - 包含 AWS 剧本(Create_EC2、Install/Configure、AMI 和 AMI_Copy) 角色 -(如上所述)

我是如何遍历区域的?这比我最初的尝试更容易。 关键是要了解 "register" 实际如何工作以及如何处理结果 JSON.

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

使用 register 意味着变量在同一 playbook 中的 plays 中可用。 (一开始对那部分很困惑)

- name: Copying AMI ec2_ami_copy: source_region: "{{ ec2_instance.instances[0].region }}" region: "{{ item }}" source_image_id: "{{ ec2_instance.instances[0].image_id }}" wait: yes with_items: - us-west-1 - eu-west-1 您可以在此处为 "with_items" 使用数组。这只是又快又脏。

希望对以后的新手有帮助。

最终推荐: 使用:- debug: var=myvariable 不同的变体以确保你得到你想要的,运行 -vvvv 也很有帮助。

有一段艰难的时光,因为复制很容易,但输出却很难。我正在为 amiid 使用 var_input,然后在此 program.I 中使用它想要一个包含区域和 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 }}" }