首页 文章

使用ansible启动aws ec2实例的最佳方法

提问于
浏览
26

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

非常感谢 .

3 回答

  • 12

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

    Prerequisite

    • Ansible

    • Python boto库

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

    创建EC2实例:

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

    • region#想要启动实例的地方,美国,澳大利亚,爱尔兰等

    • count#要创建的实例数

    有一次,您提到了这些参数,请运行以下命令:

    ansible-playbook -i hosts 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
    
  • 37

    正如其他人所说, Cloud 模块几乎包含您需要的所有AWS配置支持 . 也就是说,一旦有一台现有的SSH:能够定位和连接的机器,Ansible的范例就更有意义了 . 相比之下,实例化阶段基本上要求您定位本地计算机并从那里调用AWS API endpoints .

    和你一样,我想要一个单次命令,从EC2实例化到其配置的优雅过渡 . 有关如何在the documentation中完成这样的事情的建议,但它依赖于add_host模块来调整Ansible 's idea of current host inventory, and even then I couldn't找到一个解决方案,感觉不是我反对而不是系统 .

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

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

  • 2

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

    如果你想要“最佳”的方式,那么很难击败可以从Ansible发布的CloudFormation .

相关问题