2017-06-19 8 views
2

J'essaie d'exécuter le cluster etcd dans docker via ansible.Comment lancer le cluster etcd dans docker en utilisant ansible?

J'utilise docker_container le module ansible et voici ce que j'ai:

- name: Run etcd KV node 
     docker_container: 
     name: "etcd0" 
     image: quay.io/coreos/etcd 
     network_mode: host 
     command: [ "/usr/local/bin/etcd", \ 
     "-name etcd0", \ 
     "-advertise-client-urls http://{{ ansible_default_ipv4['address'] }}:2379,http://{{ ansible_default_ipv4['address'] }}:4001", \ 
     "-listen-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001", \ 
     "-initial-advertise-peer-urls http://{{ ansible_default_ipv4['address'] }}:2380", \ 
     "-initial-cluster etcd0=http://{{ ansible_default_ipv4['address'] }}:2380", \ 
     "-initial-cluster-token etcd-cluster", \ 
     "-listen-peer-urls http://0.0.0.0:2380", \ 
     "-initial-cluster-state new" ] 

Ce travail en mode simple, mais les troubles viennent avec plus de 1 nœud, car il est le paramètre ETCD -initial-cluster qui doit contenir tous les nœuds, pour par exemple, en cas de 3 nœuds:

-initial-cluster etcd0=http://192.168.12.50:2380,etcd1=http://192.168.12.51:2380,etcd2=http://192.168.12.52:2380 

Je ne sais pas comment faire une boucle à travers tous les nœuds et construire cette chaîne pour exécuter un conteneur de docker. C'est possible?

Répondre

2

hostvars variables magie à votre service:

- name: Generate useful facts for current node 1 
    set_fact: 
    ip_addr: "{{ ansible_default_ipv4.address }}" 
    etcd_name: "etcd{{ ansible_play_hosts.index(inventory_hostname) }}" 

- name: Generate useful facts for current node 2 
    set_fact: 
    etcd_uri: "{{ etcd_name }}=http://{{ ip_addr }}:2380" 

- name: Run etcd KV node 
    docker_container: 
    name: "{{ etcd_name }}" 
    image: quay.io/coreos/etcd 
    network_mode: host 
    command: 
     - /usr/local/bin/etcd 
     - -name {{ etcd_name }} 
     - -advertise-client-urls http://{{ ip_addr }}:2379,http://{{ ip_addr }}:4001 
     - -listen-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001 
     - -initial-advertise-peer-urls http://{{ ip_addr }}:2380 
     - -initial-cluster {{ ansible_play_hosts | map('extract',hostvars,'etcd_uri') | list | join(',') }} 
     - -initial-cluster-token etcd-cluster 
     - -listen-peer-urls http://0.0.0.0:2380 
     - -initial-cluster-state new 

post-scriptum J'ai également reformaté votre argument command un peu.

+0

C'est vraiment ce dont j'avais besoin, merci! Juste une chose - je divise la tâche set_fact sur 2 parce qu'il est impossible d'utiliser simplement le fait déclaré dans le même set_fact. –

+0

Oui, c'est vrai. ne l'a pas testé avant de poster. changé dans la réponse. –