2017-08-17 12 views
5

我創建了一個Ansible Playbook,並創建了一個新的AWS EC2實例。我現在想要SSH進入這個實例並運行一些命令。我會如何去做這件事?有沒有辦法通過可靠的方法來生成密鑰對,還是最好使用現有的密鑰對?如何生成一個密鑰對,然後通過全部ssh轉換成aws實例

我已經在線查看了Ansible ec2的在線資源 - 在ec2(http://docs.ansible.com/ansible/latest/ec2_module.html)以及在線博客中創建,終止,啓動或停止一個實例。儘管如此,我還是無法弄清楚如何通過SSH連接到實例,或者在線看到一個示例。

使用:

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

從ansible-劇本文檔生成以下錯誤:

"msg": "Timeout when waiting for :22"

該實例沒有公開DNS還創建用來SSH到經由CLI實例。

任何有關如何通過ansible-playbook ssh進入實例或爲實例生成公有DNS名稱的幫助將不勝感激。

回答

4

這似乎是你的AWS實例是如何工作的一個根本性的誤解。創建實例時,它爲默認用戶分配了一個密鑰對。 (例如,對於Amazon Linux實例,用戶將是ec2用戶,ubuntu映像使用ubuntu用戶)。

此密鑰對可以在ec2控制檯中查看其詳細信息中的實例。所有現有密鑰對都可以在ec2控制檯的密鑰對部分下看到。

爲了能夠ssh到你開始與您剛剛創建的密鑰的情況下,你需要做幾件事情:

  1. 生成密鑰對本地(使用shell: ssh-keygen ...
  2. 創建一個從本地生成密鑰對EC2密鑰對(使用ec2_key: ...
  3. 使用名爲EC2密鑰對啓動實例(使用ec2: ...
  4. 通話使用的關鍵GE只是在同一劇本開始實例請參閱步驟1中的步驟。

步驟1-3應該作爲hosts: 127.0.0.1運行。

步驟4將需要在同一個劇本中作爲單獨的hosts:調用完成,並不像看起來那麼容易。您需要通過某種方式在hosts文件中指定新創建的實例,使用add_hosts模塊指定Ansible group_vars路徑,並/或以某種方式(可能通過使用實例標籤)查找其IP地址。

一旦找到實例,就可以使用Ansible private_key_file變量來指定步驟1中的密鑰,並將ssh指定到實例中。

不是說它不能完成,但是由於這樣做的困難和不切實際,爲了在每次進入實例時都有一個新的密鑰對,我建議不要這樣做,除非絕對必要。如果出於安全考慮,最好只是制定適當的關鍵輪換政策。

+0

ansible也允許你用'localhost'指定127.0.0.1 @ – Erich

+0

@真的,這是個人喜好的問題。 –

0

使用ec2_key模塊首先:

- ec2_key: 
    name: example2 
    key_material: 'ssh-rsa AAAAxyz...== [email protected]' 
    state: present 

- ec2: 
    key_name: example2 
    instance_type: t2.micro 
    image: ami-123456 
    wait: yes 
    group: webserver 
    vpc_subnet_id: subnet-29e63245 
    assign_public_ip: yes 
+0

謝謝。我已經這樣做來創建一個新的密鑰對。我怎樣才能使用它通過ansible-playbook ssh進入實例? – fuzzii

1

Ansible使用SSH連接到實例,然後在客戶端上使用python進行大部分的執行。 您可以使用rawshell模塊引導客戶端來執行諸如安裝python2之類的操作,然後使用aws模塊繼續執行。

然而,您需要了解有關安理的一些東西,它可以在清單文件中指定的許多主機上執行,而不是單獨執行。因爲這個原因,不可能「以一個合理的方式進入一個實例」,因爲這對於可行的事情沒有實際的目的。在配置100臺服務器時,管理員不應該通過SSH進入服務器,而是創建一個環境的過程,也許運行一個服務的容器,都應該在高層次上處理。如前所述,如果您的目的是使用可以被ssh進入的ansible來創建EC2實例,那麼您應該使用ec2_key模塊並在創建實例之前創建密鑰。然後,當您創建實例時,您將通過key_name字段指定SSH密鑰。

確保您指定的安全組允許來自端口22的傳入連接,否則您將無法與其通信。

如果您想要自動報告PublicDNS地址,您應該看看ec2_remote_facts。這將返回一個可以解析的JSON來報告公共DNS。