【问题标题】:Best way to launch aws ec2 instances with ansible使用 ansible 启动 aws ec2 实例的最佳方式
【发布时间】:2020-08-01 20:11:19
【问题描述】:

我正在尝试在 Amazon AWS 上创建一个带有 ansible 的小型 webapp 基础设施,我想完成所有过程:启动实例、配置服务等,但我找不到合适的工具或模块来处理它来自 ansible。主要是 EC2 启动。

非常感谢。

【问题讨论】:

    标签: amazon-web-services amazon-ec2 ansible ansible-playbook


    【解决方案1】:

    这是您问题的简短回答,如果您需要详细信息和完全自动化的角色,请告诉我。谢谢

    先决条件

    • Ansible

    • Python boto 库

    • 在环境设置中设置 AWS 访问密钥和密钥
      (最好在 ~./boto 里面)

    创建 EC2 实例:

    为了创建 EC2 实例,请修改您可以在“vars”下的“ec2_launch.yml”文件中找到的这些参数:

    • region # 要在哪里启动实例,美国、澳大利亚、爱尔兰等
    • count # 要创建的实例数

      一旦你提到了这些参数,请运行以下命令:

    ansible-playbook -i 托管 ec2_launch.yml

    hosts 文件的内容:

    [local]
    localhost
    
    [webserver]
    

    ec2_launch.yml 文件的内容:

    ---
      - name: Provision an EC2 Instance
        hosts: local
        connection: local
        gather_facts: False
        tags: provisioning
        # Necessary Variables for creating/provisioning the EC2 Instance
        vars:
          instance_type: t1.micro
          security_group: webserver # Change the security group name here
          image: ami-98aa1cf0 # Change the AMI, from which you want to launch the server
          region: us-east-1 # Change the Region
          keypair: ansible # Change the keypair name
          count: 1
    
        # Task that will be used to Launch/Create an EC2 Instance
        tasks:
    
          - name: Create a security group
            local_action: 
              module: ec2_group
              name: "{{ security_group }}"
              description: Security Group for webserver Servers
              region: "{{ region }}"
              rules:
                - proto: tcp
                  type: ssh
                  from_port: 22
                  to_port: 22
                  cidr_ip: 0.0.0.0/0
                - proto: tcp
                  from_port: 80
                  to_port: 80
                  cidr_ip: 0.0.0.0/0
              rules_egress:
                - proto: all
                  type: all
                  cidr_ip: 0.0.0.0/0
    
    
          - name: Launch the new EC2 Instance
            local_action: ec2 
                          group={{ security_group }} 
                          instance_type={{ instance_type}} 
                          image={{ image }} 
                          wait=true 
                          region={{ region }} 
                          keypair={{ keypair }}
                          count={{count}}
            register: ec2
    
          - name: Add the newly created EC2 instance(s) to the local host group (located inside the directory)
            local_action: lineinfile 
                          dest="./hosts" 
                          regexp={{ item.public_ip }} 
                          insertafter="[webserver]" line={{ item.public_ip }}
            with_items: "{{ ec2.instances }}"
    
    
          - name: Wait for SSH to come up
            local_action: wait_for 
                          host={{ item.public_ip }} 
                          port=22 
                          state=started
            with_items: "{{ ec2.instances }}"
    
          - name: Add tag to Instance(s)
            local_action: ec2_tag resource={{ item.id }} region={{ region }} state=present
            with_items: "{{ ec2.instances }}"
            args:
              tags:
                Name: webserver
    

    【讨论】:

    • 应该是 with_items: "{{ ec2.instances }}" etc. 至少对于当前版本
    • 什么时候应该使用local_action,什么时候不应该?我已经看到了像上面这样的代码 sn-ps(例如local_action: ec2 ...),我也看到了直接执行 ec2: ... 的代码 sn-ps,但我找不到任何关于何时可能更喜欢一个而不是其他。 AWS 上的 ansible docs intro 没有使用它,例如:docs.ansible.com/ansible/guide_aws.html
    • 在“等待 SSH 启动”任务中,我遇到了超时错误。我有与上面相同的任务,其中的操作是等待 item.public_ip。当我检查实例时,会填充 public_ip。对可能出现的问题有什么建议吗?
    【解决方案2】:

    正如其他人所说,云模块包含您需要的几乎所有 AWS 配置支持。也就是说,一旦有一个现有的 SSH:able 机器可以定位和连接,Ansible 的范例就最有意义。相比之下,实例化阶段本质上要求您以本地计算机为目标并从那里调用 AWS API 端点。

    和您一样,我想要一个从 EC2 实例化到其配置的优雅过渡的单次命令。在the documentation 中有关于如何完成这样的事情的建议,但它依赖于 add_host 模块来调整 Ansible 对当前主机清单的想法,即使那样我也找不到一个我觉得我在工作的解决方案反对而不是反对制度。

    最后我选择了两个不同的剧本:一个使用 ec2、ec2_group、ec2_vol、ec2_eip 和 route53 模块的 provision.yml,以确保我有“硬件”,然后是 configure.yml,更像是一个传统的 Ansible site.yml,它能够将主机清单(在我的情况下是静态的,但动态的会很好)作为给定的,并进行所有良好的声明性状态转换。

    这两个 playbook 都是幂等的,但它是 configure.yml,从长远来看,它意味着要一遍又一遍地重新运行。

    【讨论】:

    • 不能再同意了。我遇到的主要问题是似乎不可能将单独的 EC2 实例的 Ansible ec2 任务参数保留在单独的 group_varshost_vars 文件中 - 因为还没有主机可以与 @ 987654325@ 任务正在针对localhost 运行。你是如何在provision.yml 剧本中解决这个问题的?
    【解决方案3】:

    EC2 module 专为创建和销毁实例而设计。

    如果您想要“最好”的方式,很难击败 CloudFormation,它可以从 Ansible 启动。

    【讨论】:

    • 没有最好的方法,但我仍然更喜欢使用 ansible 而不是 CloudFormation,因为它更难在更大的系统上维护 CF 清单。 Ansible 让一切变得更简单 恕我直言
    • Ansible 很棒,但是你需要管理所有的临时性——安全组、角色等。
    • 是的,这就是我喜欢的方式?
    • 我同意 Filipe 的观点,即 CloudFormation 更难维护。它也很容易慢一个数量级。仅仅因为等待时间,使用起来真的很痛苦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多