【问题标题】:Ansible - EC2 Create-Install-AMI-CopyAMIAnsible - EC2 创建-安装-AMI-CopyAMI
【发布时间】:2016-07-19 13:09:23
【问题描述】:

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

谢谢,

【问题讨论】:

  • 你能显示剧本中复制 ami 的部分以及你得到的错误吗?
  • 当然。我知道我做得不对。我想知道正确的方法。我尝试使用嵌套循环,但遇到了死胡同。主要是因为我缺乏理解我敢肯定。
  • 您能否编辑您的帖子(不是评论)以显示剧本和错误。
  • 您的问题是您使用的是“{{ ec2_region }}”而不是“{{ item }}”,因为根据我的回答,您正在使用 with_items 循环模块。
  • 嗯,抱歉,这是一个较旧的代码 sn-p。我已经尝试了很多方法......但显然我不能这样做?第一个循环 - 区域 第二个循环 - AMI 可以完成吗?

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


【解决方案1】:

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

【讨论】:

  • 看起来很棒,是否有可能让整个过程自动化?这意味着source_image_id 将取自创建 AMI 的先前角色?
  • 如果在同一个主机上则为yes,如果不是则为no。如果您尝试跨主机访问 ami_id,则必须使用模块或编写自定义过滤器。 ec2_ami_find 模块可以帮助你docs.ansible.com/ansible/ec2_ami_find_module.html#examples
  • 所以我现在想我应该把这个角色分成不同的剧本。调用ec2_ami_find,获取最新的,复制到各个区域。不过不确定是否要复制到所有地区。
【解决方案2】:

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

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

我是如何遍历区域的?事实证明这比我最初的尝试更容易。 关键是要了解“注册”的实际工作原理以及如何使用生成的 JSON。

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

使用寄存器意味着变量在同一剧本中的不同剧本中可用。 (起初对那部分很困惑)

- 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 也很有帮助。

【讨论】:

    【解决方案3】:

    经历了一段艰难的时期,因为复制很容易,但输出却很难。我正在为amiid 使用var_input,然后在这个程序中使用它。我想要一个包含区域和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 }}" } 
    

    【讨论】:

      猜你喜欢
      • 2011-09-02
      • 2021-10-16
      • 2012-07-20
      • 2022-05-25
      • 1970-01-01
      • 2014-08-05
      • 2018-03-01
      • 2017-12-22
      • 1970-01-01
      相关资源
      最近更新 更多