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 }}" }
我可以创建实例、安装和创建 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 }}" }