diff --git a/ansible/roles/ceilometer/defaults/main.yml b/ansible/roles/ceilometer/defaults/main.yml index dd481fe8007432ba3a5feeec295c783a904b8a5d..6546dc1d033bba6235adacb274c1d8acd35ad3fa 100644 --- a/ansible/roles/ceilometer/defaults/main.yml +++ b/ansible/roles/ceilometer/defaults/main.yml @@ -7,9 +7,7 @@ project_name: "ceilometer" #################### ceilometer_database_name: "ceilometer" ceilometer_database_user: "ceilometer" -# TODO(HuiKang): Update this so that connection to mongodb could be through -# haproxy; haproxy conf needs configurations for mongodb. -ceilometer_database_address: "{{ hostvars[groups['mongodb'][0]]['ansible_' + hostvars[groups['mongodb'][0]]['api_interface']]['ipv4']['address'] }}" +ceilometer_database_address: "{% for host in groups['mongodb'] %}{{ hostvars[host]['ansible_' + hostvars[host]['api_interface']]['ipv4']['address'] }}:{{ mongodb_port }}{% if not loop.last %},{% endif %}{% endfor %}" #################### diff --git a/ansible/roles/mongodb/defaults/main.yml b/ansible/roles/mongodb/defaults/main.yml index 4dfddf874ec83715ad7d61eaae2cd1584a77e1ea..d57ce5f20bc245b5884871faea7b383a9ed54233 100644 --- a/ansible/roles/mongodb/defaults/main.yml +++ b/ansible/roles/mongodb/defaults/main.yml @@ -9,6 +9,9 @@ mongodb_image: "{{ docker_registry ~ '/' if docker_registry else '' }}{{ docker_ mongodb_tag: "{{ openstack_release }}" mongodb_image_full: "{{ mongodb_image }}:{{ mongodb_tag }}" + #################### # Mongodb #################### + +mongodb_replication_set_name: "rs0" diff --git a/ansible/roles/mongodb/tasks/bootstrap_cluster.yml b/ansible/roles/mongodb/tasks/bootstrap_cluster.yml new file mode 100644 index 0000000000000000000000000000000000000000..8d445f36f990ed1c71ee0eb94b2a859e8ec3d778 --- /dev/null +++ b/ansible/roles/mongodb/tasks/bootstrap_cluster.yml @@ -0,0 +1,19 @@ +--- +- name: Copying the mongodb replication set bootstrap script + template: src=bootstrap_cluster.js.j2 dest=/tmp/mongodb_bootstrap_replication_set.js + delegate_to: "{{ groups['mongodb'][0] }}" + run_once: True + +- name: Bootstraping the mongodb replication set + command: "docker exec -t mongodb mongo {{ hostvars[inventory_hostname]['ansible_' + api_interface]['ipv4']['address'] }} --quiet --eval '{{ lookup('file','/tmp/mongodb_bootstrap_replication_set.js') }}'" + register: bootstrap_mongodb_cluster + failed_when: "{{ (bootstrap_mongodb_cluster.stdout|from_json).ok != 1 }}" + delegate_to: "{{ groups['mongodb'][0] }}" + run_once: True + +- name: Deleting the mongodb replication set bootstrap script + file: path=/tmp/mongodb_bootstrap_replication_set.js state=absent + changed_when: false + failed_when: false + delegate_to: "{{ groups['mongodb'][0] }}" + run_once: True diff --git a/ansible/roles/mongodb/tasks/start.yml b/ansible/roles/mongodb/tasks/start.yml index 40edba8e4e9999da38fe5ccdddef010c08d2dfcf..3926a7316830793ea97f69e1160c24757b7c8dd6 100644 --- a/ansible/roles/mongodb/tasks/start.yml +++ b/ansible/roles/mongodb/tasks/start.yml @@ -11,3 +11,16 @@ - "/etc/localtime:/etc/localtime:ro" - "kolla_logs:/var/log/kolla/" - "mongodb:/var/lib/mongodb" + +- name: Waiting for the mongodb startup + wait_for: host={{ hostvars[inventory_hostname]['ansible_' + api_interface]['ipv4']['address'] }} port={{ mongodb_port }} + +- name: Checking current replication status + command: "docker exec -t mongodb mongo {{ hostvars[inventory_hostname]['ansible_' + api_interface]['ipv4']['address'] }} --quiet --eval rs.status().ok" + register: mongodb_replication_status + changed_when: false + delegate_to: "{{ groups['mongodb'][0] }}" + run_once: True + +- include: "bootstrap_cluster.yml" + when: mongodb_replication_status.stdout != "1" diff --git a/ansible/roles/mongodb/templates/bootstrap_cluster.js.j2 b/ansible/roles/mongodb/templates/bootstrap_cluster.js.j2 new file mode 100644 index 0000000000000000000000000000000000000000..05ea1c655ad01021028ab3448ee1bb8aefb0d147 --- /dev/null +++ b/ansible/roles/mongodb/templates/bootstrap_cluster.js.j2 @@ -0,0 +1,14 @@ +printjson(rs.initiate( + { + "_id" : "{{ mongodb_replication_set_name }}", + "version" : 1, + "members" : [ + {% for host in groups["mongodb"] %} + { + "_id" : {{ loop.index }}, + "host" : "{{ hostvars[host]['ansible_' + storage_interface]['ipv4']['address'] }}:{{ mongodb_port }}" + }{% if not loop.last %},{% endif %} + {% endfor %} + ] + } +)) diff --git a/ansible/roles/mongodb/templates/mongodb.conf.j2 b/ansible/roles/mongodb/templates/mongodb.conf.j2 index d3863e935e33104e93e97b337d45996dbb0d7867..c5cc8344dbaef775c6db5ca4a9919af8d5d17c52 100644 --- a/ansible/roles/mongodb/templates/mongodb.conf.j2 +++ b/ansible/roles/mongodb/templates/mongodb.conf.j2 @@ -1,15 +1,17 @@ -# mongodb.conf +systemLog: + destination: file + logAppend: true + path: /var/log/kolla/mongodb/mongodb.log -# Where to store the data. -dbpath = /var/lib/mongodb +storage: + dbPath: /var/lib/mongodb + # Enable journaling, http://www.mongodb.org/display/DOCS/Journaling + journal: + enabled: true -# where to log -logpath = /var/log/kolla/mongodb/mongodb.log +net: + bindIp: {{ hostvars[inventory_hostname]['ansible_' + api_interface]['ipv4']['address'] }} + port: {{ mongodb_port }} -logappend = true - -bind_ip = {{ hostvars[inventory_hostname]['ansible_' + api_interface]['ipv4']['address'] }} -port = {{ mongodb_port }} - -# Enable journaling, http://www.mongodb.org/display/DOCS/Journaling -journal = true +replication: + replSetName: {{ mongodb_replication_set_name }} diff --git a/releasenotes/notes/implement-mongo-replicate-set-cluster-0d3f140f7116c3ba.yaml b/releasenotes/notes/implement-mongo-replicate-set-cluster-0d3f140f7116c3ba.yaml new file mode 100644 index 0000000000000000000000000000000000000000..14aaa421df3ff39b42b846aaf0cd7ce0313acdc0 --- /dev/null +++ b/releasenotes/notes/implement-mongo-replicate-set-cluster-0d3f140f7116c3ba.yaml @@ -0,0 +1,3 @@ +--- +features: + - Implement MongoDB replicate set cluster