2014-09-02 34 views
29

Ho 2 server di app con un loadbalancer di fronte a loro e 1 server di database nel mio sistema. Li sto fornendo utilizzando Ansible. I server delle app hanno Nginx + Passenger e sono in esecuzione per un'app Rails. Userò capistrano per la distribuzione ma ho un problema con le chiavi ssh. Il mio repository git è in un altro server e devo generare ssh public key su appserver e aggiungerli al server Git (al file authorized_keys). Come posso farlo in un playbook ansible?Chiave ssh copia affidabile da un host a un altro

PS: posso avere più di 2 server di app.

enter image description here

+0

Potresti elaborare su come gestire le chiavi sul server Git? Questa è un'istanza di gitlab? Devi solo aggiungere chiavi in ​​un file authorized_keys? – leucos

+0

Devo solo aggiungere le chiavi al file authorized_keys – beydogan

risposta

23

Dai uno sguardo allo authorized_key module per ottenere informazioni su come gestire le tue chiavi pubbliche.

La soluzione più semplice che posso pensare sarebbe quella di generare una nuova coppia di chiavi per l'applicazione, da condividere con tutte le istanze dell'app. Questo potrebbe avere implicazioni sulla sicurezza (stai effettivamente condividendo le chiavi tra tutte le istanze!), Ma semplificherà molto il processo di provisioning.

È inoltre necessario un utente di distribuzione su ciascuna macchina dell'app, da utilizzare in un secondo momento durante il processo di distribuzione. Avrai bisogno della tua chiave pubblica (o jenkins uno) su ogni utente di distribuzione authorized_keys.

un playbook disegno:

--- 
- 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

vorrei creare un utente deploy che è limitato a tirare l'accesso ai vostri pronti contro termine. Puoi permetterlo tramite http o there are a few options to do it over ssh.

Se non si cura di limitare l'accesso in sola lettura al repository, è possibile creare un utente ssh normale. Una volta creato l'utente, è possibile utilizzare Ansible per aggiungere la chiave pubblica dell'utente al file chiave autorizzato sul server git, è possibile utilizzare authorized key module.

Una volta che è messa a punto si hanno due opzioni:

  1. Se si utilizza l'inoltro chiave SSH uso ssh in modo che l'utente che viene utilizzato per eseguire l'operazione Ansible invia la sua chiave pubblica al server dev.

  2. Trasferire temporaneamente la chiave e utilizzare ssh_optsgit module option per utilizzare la chiave pubblica dell'utente di distribuzione.

18

Questo fa il trucco per me, raccoglie le chiavi SSH pubbliche sui nodi e lo distribuisce su tutti i nodi. In questo modo possono comunicare tra loro.

- 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 

Info: Questo è per l'utente root

+2

Ho adattato questa idea ma con 'local_action: ssh-agent -L' e ho scritto su blogger: http://dannyman.toldme.com/2016/07/01/ansible-use -ssh-add-to-set-authorized_key/so ** grazie !! ** – dannyman

+3

Bene, funziona, ma non riesco a capire perché hai messo 'shell: user = root key ...' invece di ' authorized_key: user = root key ... '.Ho provato questo frammento ma non riesco a farlo funzionare con shell, con authorized_key funziona come fascino. – Thomas8

+0

@ Thomas8: probabilmente un errore da parte mia, bella scoperta! –

Problemi correlati