2016-01-27 30 views
6

Ho un'app Rails che sto distribuendo in contenitori Docker tramite Ansible. La mia applicazione include tre contenitori finora:Eseguire 'docker volume create' con Ansible?

  • Un contenitore di volume Docker (creato con docker volume create --name dbdata)
  • contenitore
  • Un Postgres (con volumes_from dbdata)
  • il contenitore applicazione Rails (che collega al contenitore Postgres)

Il mio playbook di implementazione funziona, ma ho dovuto eseguire il comando docker volume create sul server tramite SSH. Mi piacerebbe farlo tramite Ansible, quindi potrei distribuire una nuova istanza dell'app su un contenitore vuoto.

C'è un modo per eseguire docker volume create tramite Ansible, o c'è un altro modo per farlo? Ho controllato i documenti per il modulo Ansible Docker ma non sembra che supportino ancora volume create. A meno che mi manchi qualcosa?

+0

Ansible in grado di eseguire comandi arbitrari che utilizzano il 'comando' o' moduli shell', quindi tutto è possibile eseguire sul linea di comando che probabilmente puoi eseguire tramite ansible. – larsks

+0

Sì, ci ho pensato, ma non sapevo come fare 'state = present' come fa il modulo Docker per i contenitori. Anche se si esegue 'docker volume create' due volte con lo stesso nome, il secondo non farà nulla perché il volume esisterà già. Hmmm! –

risposta

10

Ecco un'opzione, utilizzando il modulo command.

- hosts: localhost 
    tasks: 
    - name: check if myvolume exists 
     command: docker volume inspect myvolume 
     register: myvolume_exists 
     failed_when: false 

    - name: create myvolume 
     command: docker volume create --name myvolume 
     when: myvolume_exists|failed 

Per prima controllare se il volume esistente utilizzando docker volume inspect. Salviamo il risultato di tale attività nella variabile myvolume_exists, quindi solo creiamo il volume se l'attività inspect non è riuscita.

+0

Questo dovrebbe funzionare alla grande. Grazie! –

3

È ora possibile utilizzare -v argomento per creare volumi con nome, dalla pagina man di corsa finestra mobile:

Se si fornisce un nome, Docker crea un volume chiamato con quel nome.

- name: Run mariadb 
    docker_container: 
     name: mariadb-container 
     image: mariadb 
     env: 
     MYSQL_ROOT_PASSWORD: "secret-password" 
     MYSQL_DATABASE: "db" 
     MYSQL_USER: "user" 
     MYSQL_PASSWORD: "password" 
     ports: 
     - "3306:3306" 
     volumes: 
     - mariadb-data:/var/lib/mysql 

mariadb-data è un volume di nome che è stato automaticamente creato da finestra mobile:

$ docker volume inspect mariadb-data 
[ 
    { 
     "Name": "mariadb-data", 
     "Driver": "local", 
     "Mountpoint": "/var/lib/docker/volumes/mariadb-data/_data", 
     "Labels": null, 
     "Scope": "local" 
    } 
] 
Problemi correlati