20578b581ce08cbc63f3efe66d55cc075eed8239
[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: Launch ZooKeeper containers
58       become: yes
59       docker_container:
60         name: zk{{ item }}
61         image: jplock/zookeeper
62       with_sequence: start=1 end={{ num_zk_servers }}
63
64     - name: Get ZooKeeper container networks
65       become: yes
66       command: docker inspect --format={% raw %}'{{json .NetworkSettings.Networks}}'{% endraw %} zk{{ item }}
67       register: zk_net
68       with_sequence: start=1 end={{ num_zk_servers }}
69       changed_when: false
70
71     - name: Connect ZooKeeper containers to luinet network
72       become: yes 
73       command: docker network connect luinet zk{{ item }}
74       with_sequence: start=1 end={{ num_zk_servers }}
75       when: (zk_net.results[item|int-1].stdout|from_json).luinet is not defined
76
77     - name: Disconnect ZooKeeper containers from bridge network
78       become: yes 
79       command: docker network disconnect bridge zk{{ item }}
80       with_sequence: start=1 end={{ num_zk_servers }}
81       when: (zk_net.results[item|int-1].stdout|from_json).bridge is defined
82
83     - name: Get contents of /solr path in ZooKeeper
84       become: yes
85       command: docker exec -t zk1 bin/zkCli.sh get /solr
86       register: zk1_solr
87       changed_when: false
88
89     - name: Create /solr path in ZooKeeper
90       become: yes
91       command: docker exec -t zk1 bin/zkCli.sh create /solr []
92       when: zk1_solr.stdout.find('Node does not exist') != -1
93
94     - name: Build the lui-solr image
95       become: yes
96       docker_image: name=lui-solr path={{ docker_image_path }}
97
98     - name: Build ZooKeeper links for Solr containers
99       set_fact:
100     #     zk_links: []
101         zk_solr: []
102
103     - set_fact:
104     #     zk_links: "{{ zk_links + ['zk'+item+':ZK'+item] }}"
105         zk_solr: "{{ zk_solr + ['zk'+item+':2181'] }}"
106       with_sequence: start=1 end={{ num_zk_servers }}
107
108     - name: Launch Solr containers
109       become: yes
110       docker_container:
111         name: solr{{ item }}
112         image: lui-solr
113         tty: yes
114         published_ports: "{{ 8983+item|int-1 }}:8983"
115         command: bash -c '/opt/solr/bin/solr start -f -z {{ zk_solr|join(",") }}/solr'
116       with_sequence: start=1 end={{ num_solr_servers }}
117
118     - name: Get Solr container networks
119       become: yes
120       command: docker inspect --format={% raw %}'{{json .NetworkSettings.Networks}}'{% endraw %} solr{{ item }}
121       register: solr_net
122       with_sequence: start=1 end={{ num_solr_servers }}
123       changed_when: false
124
125     - name: Connect Solr containers to luinet network
126       become: yes 
127       command: docker network connect luinet solr{{ item }}
128       with_sequence: start=1 end={{ num_solr_servers }}
129       register: solr_luinet
130       when: (solr_net.results[item|int-1].stdout|from_json).luinet is not defined
131
132     - name: Disconnect Solr containers from bridge network
133       become: yes 
134       command: docker network disconnect bridge solr{{ item }}
135       with_sequence: start=1 end={{ num_solr_servers }}
136       when: (solr_net.results[item|int-1].stdout|from_json).bridge is defined
137
138     - name: Restart solr on network change
139       become: yes
140       command: docker restart solr{{ item }}
141       with_sequence: start=1 end={{ num_solr_servers }}
142       when: solr_luinet.results[item|int-1]|changed
143
144     - name: Wait for ZooKeeper to see Solr
145       become: yes
146       command: docker exec -t zk1 bin/zkCli.sh get /solr/live_nodes
147       register: solr_nodes
148       until: solr_nodes.stdout.find('numChildren = {{ num_solr_servers }}') != -1
149       retries: 3
150       delay: 2
151       changed_when: false
152
153     - name: Check lui collection
154       become: yes
155       command: docker exec -t zk1 bin/zkCli.sh ls /solr/collections
156       register: lui_collection
157       changed_when: false
158
159     - name: Create lui collection
160       become: yes
161       command: docker exec -t solr1 bin/solr create -c lui -d /opt/solr/lui-solr -shards 2 -replicationFactor 2
162       when: (lui_collection.stdout_lines|last).find('lui') == -1