【问题标题】:Having trouble provisioning EC2 instances using Ansible使用 Ansible 配置 EC2 实例时遇到问题
【发布时间】:2015-04-24 21:19:41
【问题描述】:

我对您应该如何使用 Ansible 启动 EC2 实例感到非常困惑。

我正在尝试使用 ec2.py 库存脚本。我不确定应该使用哪一个,因为 Ansible 安装了三个:

  • ansible/lib/ansible/module_utils/ec2.py
  • ansible/lib/ansible/modules/core/cloud/amazon/ec2.py
  • ansible/plugins/inventory/ec2.py

我认为在inventory/中运行它最有意义,所以我使用:

ansible-playbook launch-ec2.yaml -i ec2.py

这给了我:

msg: Either region or ec2_url must be specified

所以我添加了一个区域(即使我指定了 vpc_subnet_id),我得到:

msg: Region us-east-1e does not seem to be available for aws module boto.ec2. If the region definitely exists, you may need to upgrade boto or extend with endpoints_path

我在想亚马逊一定是最近更改了 ec2,所以您需要使用 VPC?即使我尝试从 Amazon 的控制台启动实例,“EC2 Classic”选项也被禁用。

当我尝试在 cloud/amazon/ 中使用 ec2.py 脚本时,我得到:

ERROR: Inventory script (/software/ansible/lib/ansible/modules/core/cloud/amazon/ec2.py) had an execution error:

没有比这更多的细节了。

经过一番搜索,我看到 /module_utils has been changed 中有 ec2.py 模块,因此不需要指定区域。我尝试运行此文件但得到:

错误:文件 /software/ansible/lib/ansible/module_utils/ec2.py 被标记为可执行文件,但未能正确执行。如果这不应该是可执行脚本,请使用chmod -x /software/ansible/lib/ansible/module_utils/ec2.py 进行更正。

因此,正如错误提示,我删除了 ec2.py 文件的可执行权限,但随后出现以下错误:

ERROR: /software/ansible/lib/ansible/module_utils/ec2.py:30: Invalid ini entry: distutils.version - need more than 1 value to unpack

有没有人对如何让它工作有任何想法?要使用的正确文件是什么?在这一点上,我完全不知道如何让它发挥作用。

【问题讨论】:

    标签: ansible ansible-playbook


    【解决方案1】:

    您的帖子中有几个问题。我将尝试将它们总结为三项:

    1. 是否仍然可以在 EC2 Classic(无 VPC)中启动实例?
    2. 如何使用 Ansible 创建新的 EC2 实例?
    3. 如何启动动态库存文件ec2.py?

    1。 EC2 经典

    您的选项会有所不同,具体取决于您创建 AWS 账户的时间、实例类型和使用的 AMI 虚拟化类型。参考:aws account,instance type.

    如果上述参数均未限制 EC2 经典的使用,您应该能够在不定义任何 VPC 的情况下创建新实例。

    2。使用 Ansible 创建一个新的 EC2 实例

    由于您的实例尚不存在,因此动态清单文件 (ec2.py) 是无用的。尝试指示 ansible 在您的本地机器上运行。

    创建一个新的库存文件,例如new_hosts 内容如下:

    [localhost]
    127.0.0.1
    

    然后是你的剧本,例如create_instance.yml 应该使用本地连接和hosts: localhost。请参阅下面的示例:

    --- # Create ec2 instance playbook
    
    - hosts: localhost
      connection: local
      gather_facts: false
      vars_prompt:
        inst_name: "What's the name of the instance?"
      vars:
          keypair: "your_keypair"
          instance_type: "m1.small"
          image: "ami-xxxyyyy"
          group: "your_group"
          region: "us-west-2"
      tasks:
        - name: make one instance
          ec2: image={{ image }}
               instance_type={{ instance_type }}
               keypair={{ keypair }}
               instance_tags='{"Name":"{{ inst_name }}"}'
               region={{ region }}
               group={{ group }}
               wait=true
          register: ec2_info
    
        - name: Add instances to host group
          add_host: hostname={{ item.public_ip }} groupname=ec2hosts
          with_items: ec2_info.instances
    
        - name: Wait for SSH to come up
          wait_for: host={{ item.public_dns_name }} port=22 delay=60 timeout=320 state=started
          with_items: ec2_info.instances
    

    这个游戏将创建一个 EC2 实例,并将其公共 IP 注册为 ansible 主机变量ec2hosts 即。就好像您在清单文件中定义了它一样。如果您想配置刚刚创建的实例,这很有用,只需使用 hosts: ec2hosts 添加一个新游戏。

    最终,启动 ansible 如下:

    export ANSIBLE_HOST_KEY_CHECKING=false
    export AWS_ACCESS_KEY=<your aws access key here>
    export AWS_SECRET_KEY=<your aws secret key here>
    
    ansible-playbook -i new_hosts create_instance.yml
    

    环境变量ANSIBLE_HOST_KEY_CHECKING=false的作用是避免在连接实例时被提示添加ssh主机密钥。

    注意:boto需要安装在运行上述ansible命令的机器上。

    3。使用 ansible 的 ec2 动态库存

    EC2 动态清单由两个文件组成,ec2.py 和 ec2.ini。在您的特定情况下,我认为您的问题是由于ec2.py 无法找到ec2.ini 文件。

    要解决您的问题,请将 ec2.py 和 ec2.ini 复制到您打算运行 ansible 的机器中的同一文件夹中,例如到/etc/ansible/。

    Pre Ansible 2.0 版本(相应地更改分支).

    cd /etc/ansible
    wget https://raw.githubusercontent.com/ansible/ansible/stable-1.9/plugins/inventory/ec2.py
    wget https://raw.githubusercontent.com/ansible/ansible/stabe-1.9/plugins/inventory/ec2.ini
    chmod u+x ec2.py
    

    对于 Ansible 2:

    cd /etc/ansible
    wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.py
    wget https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/ec2.ini
    chmod u+x ec2.py
    

    配置ec2.ini 并运行ec2.py,它应该将一个ini 格式的主机列表打印到标准输出。

    【讨论】:

    • 感谢您非常彻底的回答。我很快就会试一试。我想我对何时使用 ec2 动态清单感到困惑。如果你不使用它来启动实例,你会用它来做什么?您概述的剧本似乎创建了一个名为 ec2hosts 的新实例文件,然后您不会使用该清单文件与您启动的 ec2 服务器进行进一步交互吗?
    • 我会使用动态库存来配置,例如将 nginx 配置更新到所有应用程序服务器,假设您已经配置了一些自动缩放规则,但实际上您不知道在任何给定时刻有多少应用程序服务器正在运行。在这种情况下,我将使用动态清单来查询 EC2 并返回应用程序服务器的实际列表。
    • @BrianDiCasa 关于“ec2hosts”变量。这有点像你所说的,实际上就像是你的库存文件中的一个新条目,比如[ec2hosts],但只是保存在内存中。请参阅add_host 模块。这是进行实例第一次引导的好方法,例如更改主机名,/etc/sudoers,...但是当剧本结束时,有关这些实例的当前位于内存中 [ec2hosts] 下的信息将丢失。对此实例的任何进一步修改都需要使用动态库存文件。
    猜你喜欢
    • 2016-08-16
    • 2015-09-05
    • 2016-01-23
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 2012-12-25
    • 2019-05-16
    • 1970-01-01
    相关资源
    最近更新 更多