2016-04-19 18 views
2

かなり標準的なタスクのように思えるので、誰かが私を助けてくれることを願っています。私はこれを狂ったように笑ってしまいました。ほとんどの例はVPCにはなく、廃止された構造を使用しているため、ユースケースで間違ったり使えなくなったりします。ここでAWS EC2 VPCでn個の新しいインスタンスを作成してそれらを設定する

が私の目標です:

  1. 私は私のVPCで新しいインスタンスの全体の混乱を起動する(以下同じ コードは3を持っていますが、それは百かもしれない)
  2. 私は待ちたいですthoseinstancesは、(などなど、いくつかのサービスを有効にする、 ホスト名を変更、それらにはsshを)私はその後、それらのインスタンスを設定したい
  3. 生きて来るのを

N私はおそらく2つのタスクでこれを行うことができます。私は1つの演劇帳でインスタンスを作成することができました。彼らが落ち着くのを待ってください。次に、第2プレイブックを実行して設定します。それはおそらく今私がやっていることなので、私は動いていきたいと思っていますが、これにワンショットで答える必要があります。

は、ここで私は脚本

--- 
- hosts: localhost 
    connection: local 
    gather_facts: False 
    tasks: 
    - name: Provision Lunch 
     with_items: 
     - hostname: eggroll1 
     - hostname: eggroll2 
     - hostname: eggroll3 
     ec2: 
     region: us-east-1 
     key_name: eggfooyong 
     vpc_subnet_id: subnet-8675309 
     instance_type: t2.micro 
     image: ami-8675309 
     wait: true 
     group_id: sg-8675309 
     exact_count: 1 
     count_tag: 
      Name: "{{ item.hostname }}" 
     instance_tags: 
      Name: "{{ item.hostname }}" 
      role: "supper" 
      ansibleowned: "True" 
     register: ec2 

    - name: Wait for SSH to come up 
     wait_for: host={{ item.private_ip }} port=22 delay=60 timeout=900 state=started 
     with_items: '{{ec2.instances}}' 

    - name: Update hostname on instances 
     hostname: name={{ item.private_ip }} 
     with_items: '{{ec2.instances}}' 

そして、そのdoens't仕事のために、これまで持っているものです。私が得るのは

TASK [Wait for SSH to come up] ************************************************* 
[DEPRECATION WARNING]: Skipping task due to undefined Error, in the future this will be a fatal error.. This feature will be removed in a future release. Deprecation warnings can be disabled by setting 
deprecation_warnings=False in ansible.cfg. 

TASK [Update hostname on instances] ******************************************** 
[DEPRECATION WARNING]: Skipping task due to undefined Error, in the future this will be a fatal error.. This feature will be removed in a future release. Deprecation warnings can be disabled by setting 
deprecation_warnings=False in ansible.cfg. 

私は悲しいです。これは私の最新作です。しかし、私はインターネット上で見つけることができるすべての例を使って書き直そうとしました。彼らのほとんどはwith_itemsが別の方法で書かれていますが、ansibleは道が分かりにくく、失敗すると私に伝えます。

これまでのところ、楽しく簡単でしたが、これは私のノートパソコンを通りの向こう側に投げたいと思っています。

提案がありますか?私はregisterとwith_itemsを使うべきですか?私はこのような何かを使うのがよいのでしょうか?

add_host: hostname={{item.public_ip}} groupname=deploy 

私はここに書き直すために広く開いています。私は2つのプレイブックにこれを書いて、提案を得るのが大好きです。

ありがとうございます!

**** EDIT **** 今は壊れているか、または大きく変更され始めています。私は数多くの例を捜したが、それらはすべて同じ方法で書かれており、すべて同じエラーで失敗する。これは私の簡単なプレイブックです:

--- 
- hosts: localhost 
    connection: local 
    gather_facts: False 
    vars: 
    builderstart: 93 
    builderend: 94 
    tasks: 
    - name: Provision Lunch 
     ec2: 
     region: us-east-1 
     key_name: dakey 
     vpc_subnet_id: subnet-8675309 
     instance_type: t2.micro 
     image: ami-8675309 
     wait: True 
     group_id: sg-OU812 
     exact_count: 1 
     count_tag: 
      Name: "{{ item }}" 
     instance_tags: 
      Name: "{{ item }}" 
      role: "dostuff" 
      extracheese: "True" 
     register: ec2 
     with_sequence: start="{{builderstart}}" end="{{builderend}}" format=builder%03d 


    - name: the newies 
     debug: msg="{{ item }}" 
     with_items: "{{ ec2.instances }}" 

これは本当に簡単ではありませんでした。 「{{ec2.instances}}」行のエラーを引き起こしている:だからそれはwith_itemsをだように見える

[DEPRECATION WARNING]: Skipping task due to undefined Error, in the future this will be a fatal error.: 'dict object' has no attribute 'instances'.

:どんなに私はそれを書くか、関係なく、私はそれをどのように変化するか、私は同じ基本的なエラーを取得していません。

私はec2を印刷するためにdebugを使用しましたが、そのエラーは正確です。構造が私に変わったようです。 ec2に、結果が別の辞書オブジェクトのキーとしての辞書を含み、そのインスタンスがその辞書のキーであるように見えます。しかし、私はデータにアクセスするための純粋な方法を見つけることができません。

これは価値がありますが、私は2.0.1,2.0.2、および2.2でこれにアクセスしようとしましたが、すべてのケースで同じ問題が発生します。

残りの人は1.9などですか?どこでも動作するサンプルが見つかりません。非常にイライラしています。

もう一度お手数をおかけします。

+0

"可変インフラストラクチャ"パラダイムを使用する必要がありますか? 1つの選択肢は、Packerを使用して事前にAMIを設定することです。あなたはPackerにあなたのためにAnsibleのプレイブックを実行させることさえできます。その後、AMIを直接起動することができます。あなたの可能性のあるエラーについては、それには分かりません。 –

+0

まあ、あなたの問題は、EC2モジュールをどう使用しているのですか? – vvchik

+0

自動拡張グループを使ってec2を追加してから、設定をオフにすることができます – Vorsprung

答えて

1

このようにそれをしないでください:ので、あなたがあなたの項目でEC2からすべての情報をフラッシュし、それを使用することにより
- name: Provision Lunch with_items: - hostname: eggroll1 - hostname: eggroll2 - hostname: eggroll3 ec2: region: us-east-1


あなたは次のように出力受ける:

TASK [Launch instance] ********************************************************* 
changed: [localhost] => (item={u'hostname': u'eggroll1'}) 
changed: [localhost] => (item={u'hostname': u'eggroll2'}) 

が、項目は次のようにする必要があります:

changed: [localhost] => (item={u'kernel': None, u'root_device_type': u'ebs', u'private_dns_name': u'ip-172-31-29-85.ec2.internal', u'public_ip': u'54.208.138.217', u'private_ip': u'172.31.29.85', u'id': u'i-003b63636e7ffc27c', u'ebs_optimized': False, u'state': u'running', u'virtualization_type': u'hvm', u'architecture': u'x86_64', u'ramdisk': None, u'block_device_mapping': {u'/dev/sda1': {u'status': u'attached', u'delete_on_termination': True, u'volume_id': u'vol-37581295'}}, u'key_name': u'eggfooyong', u'image_id': u'ami-fce3c696', u'tenancy': u'default', u'groups': {u'sg-aabbcc34': u'ssh'}, u'public_dns_name': u'ec2-54-208-138-217.compute-1.amazonaws.com', u'state_code': 16, u'tags': {u'ansibleowned': u'True', u'role': u'supper'}, u'placement': u'us-east-1d', u'ami_launch_index': u'1', u'dns_name': u'ec2-54-208-138-217.compute-1.amazonaws.com', u'region': u'us-east-1', u'launch_time': u'2016-04-19T08:19:16.000Z', u'instance_type': u't2.micro', u'root_device_name': u'/dev/sda1', u'hypervisor': u'xen'}) 

はコード

- name: Create a sandbox instance 
    hosts: localhost 
    gather_facts: False 
    vars: 
    keypair: eggfooyong 
    instance_type: t2.micro 
    security_group: ssh 
    image: ami-8675309 
    region: us-east-1 
    subnet: subnet-8675309 
    instance_names: 
     - eggroll1 
     - eggroll2 
    tasks: 
    - name: Launch instance 
     ec2: 
     key_name: "{{ keypair }}" 
     group: "{{ security_group }}" 
     instance_type: "{{ instance_type }}" 
     image: "{{ image }}" 
     wait: true 
     region: "{{ region }}" 
     vpc_subnet_id: "{{ subnet }}" 
     assign_public_ip: no 
     count: "{{ instance_names | length }}" 
     register: ec2 

    - name: tag instances 
     ec2_tag: 
     resource: '{{ item.0.id }}' 
     region: '{{ region }}' 
     tags:   
      Name: '{{ item.1 }}' 
      role: "supper" 
      ansibleowned: "True" 
     with_together: 
     - '{{ ec2.instances }}' 
     - '{{ instance_names }}' 

    - name: Wait for SSH to come up 
     wait_for: host={{ private_ip }} port=22 delay=60 timeout=320 state=started 
     with_items: '{{ ec2.instances }}' 

あなたansibleホストがVPC

の内側に位置することを前提以下使用するようにしてくださいを
+0

有能なホストが私のVPCの中にあります。これは有望で、自分の検索で見つけたものとは非常に異なっています。私はそれを試し、あなたに知らせるでしょう。ありがとう! –

+0

@ericwoodworthどのようにものが行くの? – vvchik

+0

他のものに襲われました。私は仕事を終わらせるために2つの不可解なプレイブックを一緒に叩きました、そして、私はちょうどそれらを順番に実行します。それは人々を働かせるほど十分だったが、私は明日か週末にそれを書き直すつもりだ。ここでの示唆は有望に見え、私は確かにフォローアップを残す。 –

0

この目標を達成するために、私は本当に小さなフィルタプラグインget_ec2_infoを書きました。

次の内容のプラグインファイルget_ec2_info.pyを作成という名前filter_plugins

でディレクトリを作成します。

from jinja2.utils import soft_unicode 

class FilterModule(object): 

    def filters(self): 
     return { 
      'get_ec2_info': get_ec2_info, 
     } 

def get_ec2_info(list, ec2_key): 

    ec2_info = [] 
    for item in list: 
     for ec2 in item['instances']: 
      ec2_info.append(ec2[ec2_key]) 
    return ec2_info 

次に、あなたがあなたの脚本でこれを使用することができます。

--- 
- hosts: localhost 
    connection: local 
    gather_facts: False 
    tasks: 
    - name: Provision Lunch 
     ec2: 
     region: us-east-1 
     key_name: eggfooyong 
     vpc_subnet_id: subnet-8675309 
     instance_type: t2.micro 
     image: ami-8675309 
     wait: true 
     group_id: sg-8675309 
     exact_count: 1 
     count_tag: 
      Name: "{{ item.hostname }}" 
     instance_tags: 
      Name: "{{ item.hostname }}" 
      role: "supper" 
      ansibleowned: "True" 
     register: ec2 
     with_items: 
     - hostname: eggroll1 
     - hostname: eggroll2 
     - hostname: eggroll3 
    - name: Create SSH Group to login dynamically to EC2 Instance(s) 
    add_host: 
     hostname: "{{ item }}" 
     groupname: my_ec2_servers 
    with_items: "{{ ec2.results | get_ec2_info('public_ip') }}" 

    - name: Wait for SSH to come up on EC2 Instance(s) 
    wait_for: 
     host: "{{ item }}" 
     port: 22 
     state: started 
    with_items: "{{ ec2.results | get_ec2_info('public_ip') }}" 

# CALL THE DYNAMIC GROUP IN THE SAME PLAYBOOK 
- hosts: my_ec2_servers 
    become: yes 
    remote_user: ubuntu 
    gather_facts: yes 
    tasks: 
    - name: DO YOUR TASKS HERE 

EXTRAインフォメーション:

その後、SSHキーが正しく

をしてください設定されていると仮定しremote_user: ubuntu

  • で値を変更しない場合は、あなたがUbuntuのインスタンスをスピンアップしていると仮定しansible 2.0.1.0
  • を使用して10
+0

これは面白そうです。私が見ている情報抽象化の余分な層を扱っているようです。あなたはまた、あなたが本当にその中に住みたいと思う情報でec2.resultsを得ています。私はあなたのフィルターをチェックアウトします。あなたが最初にこれを書いたとき、私はあなたがしていたことを見るのに十分なほどうまくいっていた問題を理解しませんでした。今私はそうすると思うし、これは私にはもっと意味がある。 –

+0

@ericwoodworth、完全な例については、提供されているgithubリファレンスを確認することもできます –