2016-05-02 6 views
0

をec2.pyを使用して -私はansibleを使ってその場でEC2インスタンスを作成するために管理しているダイナミックインベントリの

タスク:

- name: Launch Instance 
    ec2: 
    group_id: "{{ item.group_id }}" 
    count: 1 
    instance_type: 't2.micro' 
    image: '{{ item.image }}' 
    wait: true 
    region: 'us-east-1' 
    aws_access_key: '' 
    aws_secret_key: '' 
    key_name: "{{ pem }}" 
    instance_profile: "{{ profile }}" 
    register: ec2 
    with_items: ec2_instances 

と私は私ができるec2.py --listを実行しますjsonの応答を参照してください。 私はこれをどのような不可解なプレイブックでも使っていますか?これらを動的に作成してホストにファイルを追加するにはどうしたらいいですか?

答えて

0

あなたのインスタンスにタグを付けてから、タグを使用してインスタンスを呼び出すことができます。

まず、あなたの脚本が存在するディレクトリfilter_pluginsを作成し、名前get_ec2_info.pyでファイル内のコードをコピーします。

- name: Launch Instance 
    ec2: 
    group_id: "{{ item.group_id }}" 
    count: 1 
    instance_type: 't2.micro' 
    image: '{{ item.image }}' 
    wait: true 
    region: 'us-east-1' 
    aws_access_key: '' 
    aws_secret_key: '' 
    key_name: "{{ pem }}" 
    instance_profile: "{{ profile }}" 
    instance_tags: 
     Name: "myserver" 
     Environment: "staging" 
     Server_Role: "webserver" 
    register: ec2 
    with_items: ec2_instances 

- name: Create SSH Group to login dynamically to EC2 Instance(s) 
    add_host: 
    hostname: "{{ item }}" 
    groupname: webserver 
    with_items: "{{ ec2.results | get_ec2_info('public_ip') }}" 

- name: Add the newly created EC2 instance(s) to the local host group (located at ./inventory/hosts) 
    lineinfile: 
    dest: "./inventory/hosts" 
    regexp: "{{ item }}" 
    insertafter: "[webserver]" 
    line: "{{ item }}" 
    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') }}" 

セット:ここにあなたの例の変更されたコードがある

from jinja2.utils import soft_unicode 

''' 
USAGE: 
- debug: 
    msg: "{{ ec2.results | get_ec2_info('id') }}" 
Some useful ec2 keys: 
id 
dns_name 
public_ip 
private_ip 
''' 

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 

システム上の環境変数としてec2.pyのインベントリ(または-iパラメータでインベントリを呼び出すことができます):

export ANSIBLE_HOSTS=/your-inventory-path/ec2.py 
export EC2_INI_PATH=/your-inventory-path/ec2.ini 

そのセットアップした後、あなたのSSHキー:今すぐ

cp /tmp/mykey.pem ~/.ssh/ 
chmod 600 ~/.ssh/mykey.pem 
ssh-agent bash 
ssh-add ~/.ssh/mykey.pem 

あなたも(それに応じてユーザーを変更してください、私はあなたがUbuntuのインスタンスを使用していると仮定しています)あなたのインスタンスを呼び出すためにタグを使用することができます。

ansible -m ping tag_Name_myserver -u ubuntu 

または

ansible -m ping tag_Environment_staging -u ubuntu 

または

ansible -m ping tag_Server_Role_webserver -u ubuntu 

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

- hosts: tag_Name_myserver 
    become: yes 
    remote_user: ubuntu 
    roles: 
    - your-role-here 

これはあなたを助けることを願っています。完全なリファレンスについては、これらの場所を確認してください。

+0

私はそれを – Merv

+0

TASK [ローカルホストに新しく作成されたEC2インスタンス(複数可)を追加を実行するには、次のエラーを取得していますグループ(./inventory/hostsにある)] *** [DEPRECATION WARNING]:定義されていないエラーによるタスクのスキップ。将来的には致命的なエラーになります。 'dict object'には 'instances'属性がありません。 この機能は、将来のリリースで削除されます。 deprecation_warnings = Falseを ansible.cfgに設定すると、非推奨の警告を無効にすることができます。 – Merv

+0

私は答えを更新しました。今すぐ確認してください。プレイリストを実行しているホストファイルとインベントリディレクトリがそのインベントリディレクトリ内に存在していることを確認してください。これにより、インベントリディレクトリにipを書き込むことができます。 –

関連する問題