| # Licensed to the Apache Software Foundation (ASF) under one or more contributor |
| # license agreements; and to You under the Apache License, Version 2.0. |
| --- |
| # This role will run a CouchDB server on the db group |
| |
| - name: "Set the coordinator to the first node" |
| set_fact: |
| coordinator: "{{ groups['db'][0] }}" |
| |
| - name: check if db credentials are valid for CouchDB |
| fail: msg="The db provider in your {{ hosts_dir }}/group_vars/all is {{ db_provider }}, it has to be CouchDB, pls double check" |
| when: db_provider != "CouchDB" |
| |
| - name: check for persistent disk |
| shell: df -h |
| register: disk_status |
| when: block_device is defined |
| |
| - name: "set the volume_dir" |
| vars: |
| instance: "{{instances | selectattr('name', 'equalto', 'db') | list | first}}" |
| set_fact: |
| volume_dir: "{{ instance.volume.fsmount | default( '/mnt/' + group_names|first, true ) }}:/usr/local/var/lib/couchdb" |
| when: (block_device is defined) and (block_device in disk_status.stdout) |
| |
| - name: "(re)start CouchDB from '{{ couchdb_image }} ' " |
| vars: |
| couchdb_image: "{{ couchdb.docker_image | default('apache/couchdb:' ~ couchdb.version ) }}" |
| docker_container: |
| name: couchdb |
| image: "{{ couchdb_image }}" |
| state: started |
| recreate: true |
| restart_policy: "{{ docker.restart.policy }}" |
| volumes: "{{volume_dir | default([])}}" |
| ports: |
| - "{{ db_port }}:5984" |
| - "4369:4369" |
| - "9100:9100" |
| env: |
| COUCHDB_USER: "{{ db_username }}" |
| COUCHDB_PASSWORD: "{{ db_password }}" |
| NODENAME: "{{ ansible_host }}" |
| pull: "{{ couchdb.pull_couchdb | default(true) }}" |
| retries: "{{ docker.pull.retries }}" |
| delay: "{{ docker.pull.delay }}" |
| |
| - name: wait until CouchDB in this host is up and running |
| uri: |
| url: "{{ db_protocol }}://{{ ansible_host }}:{{ db_port }}/_utils/" |
| register: result |
| until: result.status == 200 |
| retries: 12 |
| delay: 5 |
| |
| - name: create '_users' database for singleton mode |
| uri: |
| url: "{{ db_protocol }}://{{ ansible_host }}:{{ db_port }}/_users" |
| method: PUT |
| status_code: 201 |
| user: "{{ db_username }}" |
| password: "{{ db_password }}" |
| force_basic_auth: yes |
| when: (couchdb.version|version_compare('2.0','>=')) and (db.instances|int == 1) |
| |
| - name: enable the cluster setup mode |
| uri: |
| url: "{{ db_protocol }}://{{ ansible_host }}:{{ db_port }}/_cluster_setup" |
| method: POST |
| body: > |
| {"action": "enable_cluster", "bind_address":"0.0.0.0", "username": "{{ db_username }}", "password":"{{ db_password }}", "port": {{ db_port }}, "node_count": "{{ groups['db'] | length }}", "remote_node": "{{ ansible_host }}", "remote_current_user": "{{ db_username }}", "remote_current_password": "{{ db_password }}"} |
| body_format: json |
| status_code: 201 |
| user: "{{ db_username }}" |
| password: "{{ db_password }}" |
| force_basic_auth: yes |
| when: (inventory_hostname == coordinator) and (db.instances|int >= 2) |
| |
| - name: add remote nodes to the cluster |
| uri: |
| url: "{{ db_protocol }}://{{ coordinator }}:{{ db_port }}/_cluster_setup" |
| method: POST |
| body: > |
| {"action": "add_node", "host":"{{ ansible_host }}", "port": {{ db_port }}, "username": "{{ db_username }}", "password":"{{ db_password }}"} |
| body_format: json |
| status_code: 201 |
| user: "{{ db_username }}" |
| password: "{{ db_password }}" |
| force_basic_auth: yes |
| when: (inventory_hostname != coordinator) and (db.instances|int >= 2) |
| |
| - name: finish the cluster setup mode |
| uri: |
| url: "{{ db_protocol }}://{{ ansible_host }}:{{ db_port }}/_cluster_setup" |
| method: POST |
| body: > |
| {"action": "finish_cluster"} |
| body_format: json |
| status_code: 201 |
| user: "{{ db_username }}" |
| password: "{{ db_password }}" |
| force_basic_auth: yes |
| when: (inventory_hostname == coordinator) and (db.instances|int >= 2) |