web-dev-qa-db-ja.com

ansibleでAWS EC2インスタンスを起動する最良の方法

Amazon AWSでansibleを使用して小さなwebappインフラストラクチャを作成しようとしています。インスタンスの起動、サービスの設定など、すべてのプロセスを実行したいのですが、ansibleからそれを処理する適切なツールまたはモジュールが見つかりません。主にEC2の起動。

どうもありがとう。

27
JorelC

これはあなたの質問の短い答えです。詳細と完全に自動化された役割が必要な場合は、お知らせください。ありがとう

前提条件

  • アンシブル

  • Python botoライブラリ

  • 環境設定でAWSアクセスキーとシークレットキーを設定する
    (ベストは〜。/ boto内にあります)

EC2インスタンスを作成するには:

EC2インスタンスを作成するには、「vars」の下の「ec2_launch.yml」ファイル内にあるこれらのパラメーターを変更してください。

  • インスタンスを起動する地域#、米国、オーストラリア、アイルランドなど
  • 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
39
Arbab Nazar

他の人が言ったように、クラウドモジュールには、必要なAWSプロビジョニングサポートがほぼすべて含まれています。とはいえ、Ansibleのパラダイムは、ターゲットにして接続する既存のSSH:可能なマシンがあれば、最も意味があります。これに対して、インスタンス化フェーズでは、基本的にローカルマシンをターゲットにするように求められ、そこからAWS APIエンドポイントを呼び出します。

あなたと同じように、私はEC2のインスタンス化からその構成へのスムーズな移行を伴うシングルショットコマンドが必要でした。 ドキュメント にこのようなことを実現する方法に関する提案がありますが、現在のホストインベントリに関するTweak Ansibleのアイデアに対するadd_Hostモジュールに依存しており、それでも解決しなかったソリューションは見つかりませんでした。私は、システムではなく反対に取り組んでいたように感じます。

最終的に、2つの異なるプレイブックを選択しました。ec2、ec2_group、ec2_vol、ec2_eip、およびroute53モジュールを使用して「ハードウェア」を配置し、configure.ymlを従来のAnsibleサイトのように使用することを保証するprovision.yml .ymlは、ホストインベントリ(私の場合は静的ですが、動的に機能します)を指定されたものとして扱い、宣言的な状態遷移をすべて実行できます。

どちらのプレイブックもdem等ですが、長い目で見れば繰り返し実行されることを意図したconfigure.ymlです。

13
Pär Winzell

EC2モジュール は、インスタンスを作成および破棄するために正確に設計されました。

「最良の」方法が必要な場合、Ansibleから起動できるCloudFormationに勝るものはありません。

3
tedder42