2014-11-22 22 views
3

我試圖創建一個EC2實例與一個ansible的劇本,並設置與卷的根卷大小。當然,在沒有包含音量變量的情況下工作良好。但是,我想爲根卷設置不同的默認大小。錯誤嘗試更改使用可變的EC2實例的根卷volume_size

我的劇本是這樣的:

# Use the ec2 module to create a new host and then add 
# it to a special "ec2hosts" group. 

- hosts: localhost 
    connection: local 
    gather_facts: False 
    vars: 
    instance_type: "t2.micro" 
    image: "ami-1420b57c" 
    region: "us-east-1" 
    volumes: 
    - device_name: /dev/xvda 
     volume_size: 10 

    tasks: 
    - name: make one instance 
     ec2: image="{{ image }}" 
      instance_type="{{ instance_type }}" 
      keypair="{{ keypair }}" 
      region="{{ region }}" 
      group="{{ group }}" 
      volumes="{{ volumes }}" 
      instance_tags='{"Name":"{{instance_name}}"}' 
      wait=true 
     register: ec2_host 

    - debug: var=ec2_host 
    - debug: var=item 
     with_items: ec2_host.instance_ids 

    - add_host: hostname={{ item.public_ip }} groupname=ec2hosts 
     with_items: ec2_host.instances 

,然後當我運行劇本命令,我碰到下面的錯誤。

ansible-playbook ec2-simple.yml -e "instance_name=testnode keypair=mykeypair group=testgroup" 

PLAY [localhost] ************************************************************** 

TASK: [make one instance] ***************************************************** 
failed: [localhost] => {"failed": true} 
msg: Device name must be set for volume 

FATAL: all hosts have already failed -- aborting 

我試過了其他方法。有和沒有引號等,沒有什麼作品。有時候,我得到一個不同的錯誤。

我在Mac上使用Ansible 1.7.2。

回答

3

我有興趣回答這個問題,因爲你把(幾乎)完全有效的例子。我將其複製到本地,在我的AWS賬戶中進行了一些小改動,並重復找出解決方案。

我懷疑是YAML + Ansible問題。我嘗試了一堆東西並環顧四周。 Michael DeHaan(Ansible的創造者)said the complex argument/module style is required as seen in the ec2 examples。以下是該模塊現在的外觀 - 其他地方無變化。

tasks: 
    - name: make one instance 
     local_action: 
      module: ec2 
      image: "{{ image }}" 
      instance_type: "{{ instance_type }}" 
      keypair: "{{ keypair }}" 
      region: "{{ region }}" 
      group: "{{ group }}" 
      volumes: "{{volumes}}" 
      instance_tags: '{"Name":"{{instance_name}}"}' 
      wait: true 
     register: ec2_host 

轉換它實施─或至少到了下一個錯誤,這是因爲EC2實例需要在一個VPC(誤差下文)後。我希望你能解決這個問題 - 如果不能,請留下評論,我會盡快完成工作。

TASK: [make one instance] ***************************************************** 
<127.0.0.1> REMOTE_MODULE ec2 region=us-east-1 keypair=mykey instance_type=t2.micro image=ami-1420b57c group=default 
failed: [127.0.0.1 -> 127.0.0.1] => {"failed": true} 
msg: Instance creation failed => VPCResourceNotSpecified: The specified instance type can only be used in a VPC. A subnet ID or network interface ID is required to carry out the request. 
+1

謝謝。那確實解決了它。我不情願走這條路,想看看爲什麼它不能像我這樣做。 本質上,這就是他們如何在他們的AWS指南 - > http://docs.ansible.com/guide_aws.html 我討厭它,當文檔不符合工具的實際工作。啊! 無論哪種方式,謝謝! – 2014-11-22 18:51:55

+0

哦,這個劇本對我來說很好,就像我發佈的那樣。不知道爲什麼它不適合你。我的意思是,你已經在那裏提供了一個組。除非「默認」組尚未創建。 我不知道Ansible是否創建了一個組。 – 2014-11-22 18:54:27

+0

是的,[它在EC2頁面上指定正確](http://docs.ansible.com/ec2_module.html)。我提出了一個拉取請求,以使錯誤消息更加詳細。而這只是VPC配置,導致它對我來說失敗了,沒什麼大不了的,很高興它可以完全發揮作用! – tedder42 2014-11-22 22:00:07

0

這裏是我的完整EC2勞克例如劇本(工作示例),希望這會幫助你或任何人需要幫助:

這個劇本將推出EC2實例(S)與可變你已經在劇本中定義了,在羣組[ec2host]下自動添加已激活的EC2實例的公共IP到主機文件。本手冊假設您在運行手冊的目錄中有主機文件。

--- 
    - 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: ec2host 
     image: ami-98aa1cf0 
     region: us-east-1 
     keypair: ansible 
     volumes: 
     - device_name: /dev/xvda 
     volume_size: 10 
     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 ec2host 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: 6800 
       to_port: 6800 
       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 }} 
         volumes={{ volumes }} 
         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="[ec2host]" 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: ec2host 

hosts文件將是這個樣子:

[local] 
localhost 

[ec2host] 

請使用下面的命令來運行這個劇本:

ansible-playbook -i hosts ec2_launch.yml 

這裏的 「ec2_launch.yml」 是的名稱我們在上面定義的劇本。

+0

你應該爲此添加一些解釋。僅有代碼的答案很難理解。此外,在我看來,你的配置並不侷限於TO所面臨的問題。 – 2014-12-25 12:05:56

+0

謝謝我已添加評論以獲取幫助。我認爲這與TO正面臨的問題有關。你能指點我嗎,你覺得它沒有關係。謝謝 – 2014-12-25 13:21:55

0

如果你預備的Ubuntu的盒子,你可能期望的xvda1卷名,但如果你去通過嚮導,你會看到AWS默認sdasdb等來電卷 - 所以你可以使用這些名稱相反,知道在你的運行實例中,他們將映射到他們的Ubuntu等價物(例如sda1 =>xvda1,sdb =>xvdb等。)

的體積聲明我必須掛載四卷(內,加xvdbxvdcxvdd)看起來是這樣的:

- name: Bootstrap EC2 instance and volumes 
    ec2: 
     key_name: "{{ec2_keypair}}" 
     group_id: foo 
     instance_type: "{{aws_instance_size}}" 
     image: bar 
     wait: yes 
     wait_timeout: 500 
     region: eu-west-1 
     volumes: 
     - device_name: /dev/sda1 
     volume_size: 24 
     delete_on_termination: true 
     - device_name: /dev/sdb 
     volume_size: 24 
     - device_name: /dev/sdc 
     volume_size: 300 
     - device_name: /dev/sdd 
     volume_size: 10 
     monitoring: no 
    register: new_ec2