2014-09-02 95 views
29

我有2個應用服務器,在它們前面有一個負載均衡器,在我的系統中有1個數據庫服務器。我正在使用Ansible供應它們。應用程序服務器有Nginx + Passenger並運行Rails應用程序。將使用capistrano進行部署,但我有一個關於ssh密鑰的問題。我的git repo在另一臺服務器上,我必須在appservers上生成ssh公鑰並將它們添加到Git服務器(授權文件)。我該如何在劇本中做到這一點?Ansible將ssh密鑰從一臺主機複製到另一臺主機

PS:我可能有超過2個應用服務器。

enter image description here

+0

你能對你如何管理的Git服務器上的按鍵詳細點嗎?這是一個gitlab實例嗎?你只需要在authorized_keys文件中添加密鑰? – leucos 2014-09-03 06:51:45

+0

我只需要將keys添加到authorized_keys文件中 – beydogan 2014-09-03 10:58:10

回答

23

看看authorized_key module獲取有關如何管理您的公鑰的信息。

我能想到的最直接的解決方案是爲您的應用程序生成一個新的密鑰對,以便在所有應用程序實例中共享。 這可能具有安全隱患(您確實在所有實例之間共享密鑰!),但它將簡化大量配置過程。

您還需要在每臺應用程序機器上部署一個用戶,以便稍後在部署過程中使用。您需要在每個部署用戶的authorized_keys上使用公鑰(或jenkins一個)。

草圖劇本:

--- 
- name: ensure app/deploy public key is present on git server 
    hosts: gitserver 
    tasks: 
    - name: ensure app public key 
     authorized_key: 
     user: "{{ git_user }}" 
     key: app_keys/id_dsa.pub 
     state: present 

- name: provision app servers 
    hosts: appservers 
    tasks: 
    - name: ensure app/deploy user is present 
     user: 
     name: "{{ deploy_user }}" 
     state: present 

    - name: ensure you'll be able to deploy later on 
     authorized_key: 
     user: "{{ deploy_user }}" 
     key: "{{ path_to_your_public_key }}" 
     state: present 

    - name: ensure private key and public one are present 
     copy: 
     src: keys/myapp.private 
     dest: "/home/{{ deploy_user }}/.ssh/{{ item }}" 
     mode: 0600 
     with_items: 
     - app_keys/id_dsa.pub 
     - app_keys/id_dsa 
1

我會創建一個限定爲拉你回購訪問部署用戶。你可以通過http或there are a few options to do it over ssh來允許。

如果你不關心限制用戶對只讀存儲庫的只讀訪問,那麼你可以創建一個普通的ssh用戶。創建用戶後,您可以使用Ansible將用戶的公鑰添加到git服務器上的授權密鑰文件中,您可以使用authorized key module

一旦這個設置有兩個選項:

  1. 如果使用SSH使用SSH密鑰轉發功能,即用來運行Ansible任務的用戶發送他的公鑰來開發服務器。

  2. 暫時轉移密鑰並使用ssh_optsgit module option來使用部署用戶的公鑰。

18

這是否把戲對我來說,它收集節點上的公共SSH密鑰並在所有節點進行分發。這樣他們可以相互溝通。

- hosts: controllers 
    gather_facts: false 
    remote_user: root 
    tasks: 
    - name: fetch all public ssh keys 
     shell: cat ~/.ssh/id_rsa.pub 
     register: ssh_keys 
     tags: 
     - ssh 

    - name: check keys 
     debug: msg="{{ ssh_keys.stdout }}" 
     tags: 
     - ssh 

    - name: deploy keys on all servers 
     authorized_key: user=root key="{{ item[0] }}" 
     delegate_to: "{{ item[1] }}" 
     with_nested: 
     - "{{ ssh_keys.stdout }}" 
     - "{{groups['controllers']}}" 
     tags: 
     - ssh 

信息:這是用戶root

+2

我改編了這個想法,但使用了'local_action:ssh-agent -L'並對其進行了博客:http://dannyman.toldme.com/2016/07/01/ansible-use -ssh-add-to-set-authorized_key/so **謝謝!! ** – dannyman 2016-07-01 23:13:43

+3

好,這個工程,但我不明白你爲什麼把'shell:user = root key ...'而不是' authorized_key:user = root密鑰...'。我試過這個片段,但不能使它與shell一起工作,authorized_key的作用就像魅力一樣。 – Thomas8 2016-09-12 08:31:33

+0

@ Thomas8:我犯了一個錯誤,很好的發現! – 2017-01-26 15:11:51

相關問題