Ansible plays to build dev environment with zookeeper ensemble.
[lui-solr.git] / docker / docker-deploy.yml
1 ---
2 # deploy a Docker server with Zookeeper, Solr, HAProxy
3 - hosts: all
4
5   tasks:
6     - name: Install prereqs from apt
7       become: yes
8       apt: name={{ item }}
9       with_items:
10         - apt-transport-https
11         - ca-certificates
12         - python-virtualenv
13         - python-pip
14
15     - name: Install prereqs from pip
16       become: yes
17       pip: name={{ item }}
18       with_items:
19         - docker-py
20
21     - name: Install apt key for Docker
22       become: yes
23       apt_key: id=58118E89F3A912897C070ADBF76221572C52609D keyserver=hkp://p80.pool.sks-keyservers.net:80
24
25     - name: Install apt repository for Docker
26       become: yes
27       apt_repository: repo="deb https://apt.dockerproject.org/repo debian-jessie main"
28
29     - name: Create docker group
30       become: yes
31       group: name=docker
32
33     - name: Add users to docker group
34       become: yes
35       user: name={{ item }} groups=docker
36       with_items: "{{ docker_users }}"
37
38     - name: Install Docker Engine
39       become: yes
40       apt: name=docker-engine
41
42     - name: Start up Docker
43       become: yes
44       service: name=docker enabled=yes state=started
45
46     - name: Discover Docker networks
47       become: yes
48       command: docker network ls
49       register: docker_nets
50       changed_when: false
51
52     - name: Create luinet network
53       become: yes
54       command: docker network create luinet
55       when: docker_nets.stdout.find('luinet') == -1
56
57     - name: Copy ZooKeeper config if not present
58       become: yes
59       copy: src=zookeeper dest=/etc/masterkey/lui/ force=no
60
61     - name: Create ZooKeeper dataDirs
62       become: yes
63       file: path=/var/lib/masterkey/lui/zookeeper/zk{{ item }} state=directory
64       with_sequence: start=1 end={{ num_zk_servers }}
65
66     - name: Launch ZooKeeper containers
67       become: yes
68       docker_container:
69         name: zk{{ item }}
70         image: jplock/zookeeper
71         volumes:
72           - /etc/masterkey/lui/zookeeper:/opt/zookeeper/conf
73           - /var/lib/masterkey/lui/zookeeper/zk{{ item }}:/tmp/zookeeper
74       with_sequence: start=1 end={{ num_zk_servers }}
75
76     - name: Get ZooKeeper container networks
77       become: yes
78       command: docker inspect --format={% raw %}'{{json .NetworkSettings.Networks}}'{% endraw %} zk{{ item }}
79       register: zk_net
80       with_sequence: start=1 end={{ num_zk_servers }}
81       changed_when: false
82
83     - name: Connect ZooKeeper containers to luinet network
84       become: yes 
85       command: docker network connect luinet zk{{ item }}
86       with_sequence: start=1 end={{ num_zk_servers }}
87       when: (zk_net.results[item|int-1].stdout|from_json).luinet is not defined
88
89     - name: Disconnect ZooKeeper containers from bridge network
90       become: yes 
91       command: docker network disconnect bridge zk{{ item }}
92       with_sequence: start=1 end={{ num_zk_servers }}
93       when: (zk_net.results[item|int-1].stdout|from_json).bridge is defined
94
95     - name: Create ZooKeeper myid files
96       become: yes
97       copy: content={{ item }} dest=/var/lib/masterkey/lui/zookeeper/zk{{ item }}/myid
98       with_sequence: start=1 end={{ num_zk_servers }}
99       when: num_zk_servers > 1
100
101     # Note - this will not remove servers from config
102     - name: Update zoo.cfg for ensemble
103       become: yes
104       lineinfile: dest=/etc/masterkey/lui/zookeeper/zoo.cfg line="server.{{ item }}=zk{{ item }}:2888:3888"
105       register: zk_conf
106       with_sequence: start=1 end={{ num_zk_servers }}
107       when: num_zk_servers > 1
108
109     - name: Restart ZooKeeper
110       become: yes
111       command: docker restart zk{{ item }}
112       with_sequence: start=1 end={{ num_zk_servers }}
113       when: zk_conf|changed
114       
115     - name: Get contents of /solr path in ZooKeeper
116       become: yes
117       command: docker exec -t zk1 bin/zkCli.sh get /solr
118       register: zk1_solr
119       changed_when: false
120
121     - name: Create /solr path in ZooKeeper
122       become: yes
123       command: docker exec -t zk1 bin/zkCli.sh create /solr []
124       when: zk1_solr.stdout.find('Node does not exist') != -1
125
126     - name: Build the lui-solr image
127       become: yes
128       docker_image: name=lui-solr path={{ solr_image_path }}
129
130     - name: Build -z string for Solr
131       set_fact:
132         zk_solr: "{{ zk_solr|default([]) + ['zk'+item+':2181'] }}"
133       with_sequence: start=1 end={{ num_zk_servers }}
134
135     - name: Launch Solr containers
136       become: yes
137       docker_container:
138         name: solr{{ item }}
139         image: lui-solr
140         tty: yes
141         published_ports: "{{ 8983+item|int-1 }}:8983"
142         command: bash -c '/opt/solr/bin/solr start -f -z {{ zk_solr|join(",") }}/solr'
143       with_sequence: start=1 end={{ num_solr_servers }}
144
145     - name: Get Solr container networks
146       become: yes
147       command: docker inspect --format={% raw %}'{{json .NetworkSettings.Networks}}'{% endraw %} solr{{ item }}
148       register: solr_net
149       with_sequence: start=1 end={{ num_solr_servers }}
150       changed_when: false
151
152     - name: Connect Solr containers to luinet network
153       become: yes 
154       command: docker network connect luinet solr{{ item }}
155       with_sequence: start=1 end={{ num_solr_servers }}
156       register: solr_luinet
157       when: (solr_net.results[item|int-1].stdout|from_json).luinet is not defined
158
159     - name: Disconnect Solr containers from bridge network
160       become: yes 
161       command: docker network disconnect bridge solr{{ item }}
162       with_sequence: start=1 end={{ num_solr_servers }}
163       when: (solr_net.results[item|int-1].stdout|from_json).bridge is defined
164
165     - name: Restart solr on network change
166       become: yes
167       command: docker restart solr{{ item }}
168       with_sequence: start=1 end={{ num_solr_servers }}
169       when: solr_luinet.results[item|int-1]|changed
170
171     - name: Wait for ZooKeeper to see Solr
172       become: yes
173       command: docker exec -t zk1 bin/zkCli.sh get /solr/live_nodes
174       register: solr_nodes
175       until: solr_nodes.stdout.find('numChildren = {{ num_solr_servers }}') != -1
176       retries: 3
177       delay: 2
178       changed_when: false
179
180     - name: Check lui collection
181       become: yes
182       command: docker exec -t zk1 bin/zkCli.sh ls /solr/collections
183       register: lui_collection
184       changed_when: false
185
186     - name: Create lui collection
187       become: yes
188       command: docker exec -t solr1 bin/solr create -c lui -d /opt/solr/lui-solr -shards 2 -replicationFactor 2
189       when: (lui_collection.stdout_lines|last).find('lui') == -1