---
-# deploy a Docker server with 1 Zookeeper, 3 Solr, 1 HAProxy
+# deploy a Docker server with Zookeeper, Solr, HAProxy
- hosts: all
tasks:
become: yes
service: name=docker enabled=yes state=started
- - name: Check for luinet network
- command: docker network ls -f name=luinet -q
- register: luinet
+ - name: Discover Docker networks
+ become: yes
+ command: docker network ls
+ register: docker_nets
+ changed_when: false
- name: Create luinet network
+ become: yes
command: docker network create luinet
- when: luinet.stdout == ""
+ when: docker_nets.stdout.find('luinet') == -1
- - name: Launch ZooKeeper
- docker_container: name=zk1 image=jplock/zookeeper
+ - name: Copy ZooKeeper config if not present
+ become: yes
+ copy: src=zookeeper dest=/etc/masterkey/lui/ force=no
- - name: Get networks for ZooKeeper
- shell: "docker inspect --format={% raw %}'{{json .NetworkSettings.Networks}}'{% endraw %} zk1"
- register: zk1_networks
+ - name: Create ZooKeeper dataDirs
+ become: yes
+ file: path=/var/lib/masterkey/lui/zookeeper/zk{{ item }} state=directory
+ with_sequence: start=1 end={{ num_zk_servers }}
- - name: Attach ZooKeeper to luinet network
- command: docker network connect luinet zk1
- when: (zk1_networks.stdout|from_json).luinet is not defined
+ - name: Launch ZooKeeper containers
+ become: yes
+ docker_container:
+ name: zk{{ item }}
+ image: jplock/zookeeper
+ volumes:
+ - /etc/masterkey/lui/zookeeper:/opt/zookeeper/conf
+ - /var/lib/masterkey/lui/zookeeper/zk{{ item }}:/tmp/zookeeper
+ with_sequence: start=1 end={{ num_zk_servers }}
+
+ - name: Get ZooKeeper container networks
+ become: yes
+ command: docker inspect --format={% raw %}'{{json .NetworkSettings.Networks}}'{% endraw %} zk{{ item }}
+ register: zk_net
+ with_sequence: start=1 end={{ num_zk_servers }}
+ changed_when: false
+
+ - name: Connect ZooKeeper containers to luinet network
+ become: yes
+ command: docker network connect luinet zk{{ item }}
+ with_sequence: start=1 end={{ num_zk_servers }}
+ when: (zk_net.results[item|int-1].stdout|from_json).luinet is not defined
+
+ - name: Disconnect ZooKeeper containers from bridge network
+ become: yes
+ command: docker network disconnect bridge zk{{ item }}
+ with_sequence: start=1 end={{ num_zk_servers }}
+ when: (zk_net.results[item|int-1].stdout|from_json).bridge is defined
+
+ - name: Create ZooKeeper myid files
+ become: yes
+ copy: content={{ item }} dest=/var/lib/masterkey/lui/zookeeper/zk{{ item }}/myid
+ with_sequence: start=1 end={{ num_zk_servers }}
+ when: num_zk_servers > 1
- - name: Detach ZooKeeper from bridge network
- command: docker network disconnect bridge zk1
- when: (zk1_networks.stdout|from_json).bridge is defined
+ # Note - this will not remove servers from config
+ - name: Update zoo.cfg for ensemble
+ become: yes
+ lineinfile: dest=/etc/masterkey/lui/zookeeper/zoo.cfg line="server.{{ item }}=zk{{ item }}:2888:3888"
+ register: zk_conf
+ with_sequence: start=1 end={{ num_zk_servers }}
+ when: num_zk_servers > 1
-- hosts: dev
- roles:
- - dev
+ - name: Restart ZooKeeper
+ become: yes
+ command: docker restart zk{{ item }}
+ with_sequence: start=1 end={{ num_zk_servers }}
+ when: zk_conf|changed
+
+ - name: Get contents of /solr path in ZooKeeper
+ become: yes
+ command: docker exec -t zk1 bin/zkCli.sh get /solr
+ register: zk1_solr
+ changed_when: false
-- hosts: prod
- roles:
- - prod
+ - name: Create /solr path in ZooKeeper
+ become: yes
+ command: docker exec -t zk1 bin/zkCli.sh create /solr []
+ when: zk1_solr.stdout.find('Node does not exist') != -1
-- hosts: all
+ - name: Build the lui-solr image
+ become: yes
+ docker_image: name=lui-solr path={{ solr_image_path }}
- tasks:
- - name: Get networks for Solr
- shell: "docker inspect --format={% raw %}'{{json .NetworkSettings.Networks}}'{% endraw %} solr1"
- register: solr1_networks
-
- - name: Attach Solr to luinet network
- command: docker network connect luinet solr1
- when: (solr1_networks.stdout|from_json).luinet is not defined
-
- - name: Detach Solr from bridge network
- command: docker network disconnect bridge solr1
- when: (solr1_networks.stdout|from_json).bridge is defined
-
- # - name: Create Solr container
- # docker_container:
- # name: solr1
- # tty: yes
- # published_ports: 8983:8983
- # #volumes: /vagrant/conf/solr/solr-home:/opt/solr/server/solr
- # command: bash -c '/opt/solr/bin/solr start -f -z zk1:2181'
+ - name: Build -z string for Solr
+ set_fact:
+ zk_solr: "{{ zk_solr|default([]) + ['zk'+item+':2181'] }}"
+ with_sequence: start=1 end={{ num_zk_servers }}
+
+ - name: Launch Solr containers
+ become: yes
+ docker_container:
+ name: solr{{ item }}
+ image: lui-solr
+ tty: yes
+ published_ports: "{{ 8983+item|int-1 }}:8983"
+ command: bash -c '/opt/solr/bin/solr start -f -z {{ zk_solr|join(",") }}/solr'
+ with_sequence: start=1 end={{ num_solr_servers }}
+
+ - name: Get Solr container networks
+ become: yes
+ command: docker inspect --format={% raw %}'{{json .NetworkSettings.Networks}}'{% endraw %} solr{{ item }}
+ register: solr_net
+ with_sequence: start=1 end={{ num_solr_servers }}
+ changed_when: false
+
+ - name: Connect Solr containers to luinet network
+ become: yes
+ command: docker network connect luinet solr{{ item }}
+ with_sequence: start=1 end={{ num_solr_servers }}
+ register: solr_luinet
+ when: (solr_net.results[item|int-1].stdout|from_json).luinet is not defined
+
+ - name: Disconnect Solr containers from bridge network
+ become: yes
+ command: docker network disconnect bridge solr{{ item }}
+ with_sequence: start=1 end={{ num_solr_servers }}
+ when: (solr_net.results[item|int-1].stdout|from_json).bridge is defined
+
+ - name: Restart solr on network change
+ become: yes
+ command: docker restart solr{{ item }}
+ with_sequence: start=1 end={{ num_solr_servers }}
+ when: solr_luinet.results[item|int-1]|changed
+
+ - name: Wait for ZooKeeper to see Solr
+ become: yes
+ command: docker exec -t zk1 bin/zkCli.sh get /solr/live_nodes
+ register: solr_nodes
+ until: solr_nodes.stdout.find('numChildren = {{ num_solr_servers }}') != -1
+ retries: 3
+ delay: 2
+ changed_when: false
+
+ - name: Check lui collection
+ become: yes
+ command: docker exec -t zk1 bin/zkCli.sh ls /solr/collections
+ register: lui_collection
+ changed_when: false
+
+ - name: Create lui collection
+ become: yes
+ command: docker exec -t solr1 bin/solr create -c lui -d /opt/solr/lui-solr -shards 2 -replicationFactor 2
+ when: (lui_collection.stdout_lines|last).find('lui') == -1