diff --git a/.gitignore b/.gitignore
index 36bd50c5974888212ddb4d87ceb5f3286dd79c22..d3bc778b6eeaa0473190cff40e215a2d8d9fe714 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,7 +2,10 @@ downloaded_files
inventories/opengauss/credentials
inventories/opengauss/assembled_vars
inventories/opengauss/report*
+inventories/opengauss/hostvars
vagrant/.vagrant
vagrant/packer_cache
vagrant/output*
-log
\ No newline at end of file
+log
+test.yml
+inventories/opengauss/cluster_config.xml
diff --git a/README.md b/README.md
index 505c674354ca324980328cb674f65810c5061508..5d676c1ce816bf1fd3dae932036eab0a689e18db 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,13 @@
# Ansible role for openGauss
-自动部署 openGauss,根据分组定义,自适应部署单点、一主一从、一主多从以及级联节点等架构模式。
+本项目基于 openGauss 的官方安装脚本,结合 Ansible 自动化编排流程,实现自动部署 openGauss。
+
+使用者只需给目标机器编排好集群角色,即可通过一行命令,自适应部署单点、一主一备、一主多备以及级联节点等架构模式。
+
+本项目适用于以下场景或用户:
+
+1. 同一网络环境下的快速部署以及扩容。
+1. 需要多次重新部署数据库集群的测试工程师。
# 已适配的系统
@@ -13,9 +20,18 @@
* 5.1.0
* 5.0.0
+# 不足之处
+
+1. 暂不支持 DCF 模式的集群部署。
+1. 暂不支持离线部署。
+1. 暂不支持多地容灾部署。
+
# 优势特点
-1. 1 主 4 从 1 级联的架构,十分钟内部署完成(不含安装包的下载时间)。
+1. 自带 Dockerfile,可通过 docker-compose 在本地启动一个 Ansible 容器,免除不同系统安装 Ansible 所带来的兼容性问题。
+1. 部署完成后自动生成部署报告,markdown 格式。
+1. 以 1 主 4 备 1 级联的架构为例,十分钟内部署完成(不含 openGauss 压缩包及 Linux 系统安装包的下载时间)。
+1. 支持从 1 主单节点,逐步扩展为多节点集群。
1. 自动匹配 CPU 架构以及操作系统。
1. 支持自定义 cluster_config.xml.j2 模板,优先使用 `{{ inventory_dir }}/templates/openGauss/cluster_config.xml.j2`。
1. 默认自动生成数据库管理员密码,也可自定义变量进行替换。全程自动化,无交互步骤。
@@ -57,8 +73,24 @@
# 更新日志
-* 2023-10-13: 支持集群扩容。
+* 2023-11-10:优化流程,解决扩容难点,可直接从单节点扩容到多节点。
+* 2023-10-26: 大量修复和优化,可完美实现从单点部署,到逐步扩容为 1 主 4 备 4 级联的架构。
+ ```
+ 已测试的扩容场景如下
+
+ 1 主
+ -> 1 主 1 备
+ -> 1 主 1 备 1 级联
+ -> 1 主 2 备 2 级联
+ -> 1 主 4 备 4 级联
+ ```
* 2023-10-18: 支持 openEuler 20.03 LTS SP3。
+* 2023-10-13: 支持集群扩容。
+
+# 待开发功能
+
+1. 提供 DCF 模式的部署。
+1. 基于 gs_guc 批量配置自动修改功能。
# 开发指南
diff --git a/ansible-docker/Dockerfile b/ansible-docker/Dockerfile
index 8c55e8a6b6f714760c476337c9f1b999ef534377..6c9cd7f9117de06f6793ee46f02b565c2d5d616f 100644
--- a/ansible-docker/Dockerfile
+++ b/ansible-docker/Dockerfile
@@ -4,14 +4,22 @@ ARG TIMEZONE="Asia/Shanghai"
ADD ssh_config /root/.ssh/config
-RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.cloud.tencent.com/g' /etc/apk/repositories \
+RUN addgroup dbgrp \
+ && adduser -D -G dbgrp omm \
+ && sed -i 's/dl-cdn.alpinelinux.org/mirrors.cloud.tencent.com/g' /etc/apk/repositories \
+ && apk upgrade -U --no-cache \
&& apk --no-cache add bzip2 nano ansible fish byobu \
sshpass tzdata rsync wget curl net-tools tar unzip \
- openssh-client py3-netaddr musl-locales py3-jmespath
+ openssh-client py3-netaddr musl-locales py3-jmespath \
+ inetutils-telnet \
+ && ln -sf /usr/share/zoneinfo/$TIMEZONE /etc/localtime \
+ && sed -i 's/\/bin\/ash/\/usr\/bin\/fish/g' /etc/passwd
+
+USER omm
RUN byobu-select-backend tmux \
&& byobu-ctrl-a screen \
&& byobu-enable \
- && ln -sf /usr/share/zoneinfo/$TIMEZONE /etc/localtime \
- && sed -i 's/\/bin\/ash/\/usr\/bin\/fish/g' /etc/passwd \
- && fish -c "alias pansible='ansible-playbook' && funcsave pansible"
\ No newline at end of file
+ && fish -c "alias pansible='ansible-playbook' && funcsave pansible"
+
+
diff --git a/ansible.cfg b/ansible.cfg
index b38abadda75ec7db03fd12b6ebe6a351abe40d90..89309017093754ab31ae8dac775e03934c8d30f4 100644
--- a/ansible.cfg
+++ b/ansible.cfg
@@ -9,9 +9,9 @@ pipelining = True
become = True
host_key_checking = False
deprecation_warnings = False
-callback_whitelist = profile_tasks,log_plays
-display_skipped_hosts = False
-#stdout_callback = yaml
+callback_whitelist = profile_tasks,timer,profile_roles
+; display_skipped_hosts = False
+stdout_callback = yaml
[callback_log_plays]
log_folder = ./log/
\ No newline at end of file
diff --git a/docs/03-deploy.md b/docs/03-deploy.md
index 764b302f846bcc5cf1012abdf43edf680957705e..665c9870aae12cb44fed06369440a92a3c0264fb 100644
--- a/docs/03-deploy.md
+++ b/docs/03-deploy.md
@@ -10,6 +10,8 @@
关于 byobu 的使用,大家可自行搜索一些教程。在 byobu 里运行的程序或命令,不会因为 SSH 断开而终止。
+ 也可以很方便地在同一个 SSH 连接里,切换不同的窗口。
+
基本键盘操作有:
```
diff --git a/docs/04-expansion.md b/docs/04-expansion.md
index 40ff58c93c0952c28f7acc68edf82148ca77784e..2057ab8089455c136f8d77383805dcdab23cc7c6 100644
--- a/docs/04-expansion.md
+++ b/docs/04-expansion.md
@@ -10,7 +10,13 @@
备机数量不可超过 8 台。
-假设原编排为 1 主 1 备 1 级联。
+### 请注意:
+
+### 如果是对 1 主 1 备进行扩容,会增加一些部署 Cluster Manager 的流程,请确保扩容前没有数据库读写操作。
+
+### 如果是从 1 主单节点开始扩容,建议先增加 1 个备节点,扩容为 1 主 1 备的架构后,再进行多节点同时扩容。
+
+假设原编排为 1 主 1 备。
```
; 主服务器组,仅设置 1 个目标机。
@@ -20,14 +26,9 @@
; 从服务器组,可设置若干个或留空。
[opengauss_follower]
192.168.56.12
-
-; 级联服务器组,可设置若干个或留空。
-[opengauss_cascade]
-192.168.56.13
-
```
-增加 2 台备机,1 台级联机,则在对应的组里增加目标服务器。
+增加 2 台备机,2 台级联机,则在对应的组里增加目标服务器。
```
; 主服务器组,仅设置 1 个目标机。
diff --git a/docs/99-get-involved.md b/docs/99-get-involved.md
new file mode 100644
index 0000000000000000000000000000000000000000..2f291efc897aecb2275dfe41b1294b42de0e7470
--- /dev/null
+++ b/docs/99-get-involved.md
@@ -0,0 +1,9 @@
+# 贡献你的代码
+
+## 前提条件
+
+1. 需要你非常熟悉 [Ansible](https://docs.ansible.com/ansible/latest/collections/index.html) 的模块文档,一切编写以官方文档为准。
+1. 不论你使用哪款 IDE 编辑器,请务必安装启动与 ansible-lint 相关的插件。确保你的代码编写规范符合官方要求。
+
+## 规范要求
+1. 每个 task 的 name,相当于作用解释,请务必清晰表达。
\ No newline at end of file
diff --git a/inventories/opengauss/cluster_config.xml b/inventories/opengauss/cluster_config.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ad3066fadec3ed5ed6ec1818bd575a86eec48f5e
--- /dev/null
+++ b/inventories/opengauss/cluster_config.xml
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/inventories/opengauss/group_vars/opengauss.yml b/inventories/opengauss/group_vars/opengauss.yml
index d0f31c0d14758833c2a63cd0561aa6ddfa722671..036acd3ca43e75762212e2d1dabefd9f0307e22e 100644
--- a/inventories/opengauss/group_vars/opengauss.yml
+++ b/inventories/opengauss/group_vars/opengauss.yml
@@ -1,3 +1,5 @@
# ansible_python_interpreter: "python3"
opengauss_version: 5.0.0
+
+# global_pkg_mirror: https://mirrors.aliyun.com
diff --git a/inventories/opengauss/hosts.ini b/inventories/opengauss/hosts.ini
index 12aa6e78e674b3638236ccbcbd628a2c867f1f0b..5353de2fa6a63971308bf29ceb3936aa4cce0305 100644
--- a/inventories/opengauss/hosts.ini
+++ b/inventories/opengauss/hosts.ini
@@ -1,20 +1,20 @@
; 主机,仅设置 1 个目标机。
[opengauss_master]
-192.168.56.17
+192.168.56.18
-; 备机,可设置若干个或留空。不可大于 8。
+; 备机,可设置若干个或留空。
[opengauss_follower]
-192.168.56.11
+; 192.168.56.13
192.168.56.15
-192.168.56.12
-192.168.56.13
+192.168.56.19
; 级联机,可设置若干个或留空。
[opengauss_cascade]
-192.168.56.19
-192.168.56.18
-192.168.56.16
+; 192.168.56.11
+; 192.168.56.12
192.168.56.14
+192.168.56.16
+; 192.168.56.17
; 以上 3 个分组的合并组,勿动。
[opengauss:children]
@@ -22,16 +22,10 @@ opengauss_master
opengauss_follower
opengauss_cascade
-; 同步复制节点分组
-[opengauss_sync_nodes:children]
-opengauss_master
+; 备节点分组,总数不可大于 8。
+[opengauss_replicas:children]
opengauss_follower
-
-;
-; 备节点分组
-[opengauss_replica_nodes:children]
opengauss_cascade
-opengauss_follower
; 机器的 SSH 信息,请根据你的实际情况修改。
[opengauss:vars]
diff --git a/roles/opengauss/README.md b/roles/opengauss/README.md
index 660ff95b0bc156d198cd99d2d3e49d95fd5b8645..17ab66584f5a070540fafa90e4adf817e838d26b 100644
--- a/roles/opengauss/README.md
+++ b/roles/opengauss/README.md
@@ -2,7 +2,7 @@
自动部署 openGauss,根据分组定义,自适应部署单点、一主一从、一主多从以及级联节点等架构模式。
-目前仅支持初次部署,不支持对集群架构做变更。
+目前仅支持初次部署以及扩容,暂不支持对集群角色做变更。
# 优势特点
diff --git a/roles/opengauss/defaults/main.yml b/roles/opengauss/defaults/main.yml
index b71fc4f2f9e043bd84e075225f2879cf7b0b91cb..8eb539e7a14b398ebed2a72f2718ba8c83d20255 100644
--- a/roles/opengauss/defaults/main.yml
+++ b/roles/opengauss/defaults/main.yml
@@ -33,12 +33,21 @@ opengauss_env:
length=8
) | password_hash
}}
+ ca_file_pass: >-
+ {{
+ lookup(
+ 'password',
+ inventory_dir + '/credentials/opengauss_ca_file_pass',
+ chars=['ascii_letters', 'digits', 'punctuation'],
+ length=8
+ )
+ }}
iface_mtu: 8192
clusterName: openGauss
dataPortBase: 15400
cmServerPortBase: 15300
azName: AZ1
- swap_off: true # 关闭 swap
+ swap_off: false # 关闭 swap
syncNum: 0 # dataNode1_syncNum
# locale: SQL_ASCII
@@ -86,7 +95,7 @@ opengauss_download:
og_hostname: "og{{ inventory_hostname | ipaddr('int') }}"
og_all_nodes: "{{ groups['opengauss'] | sort }}"
og_master: "{{ groups['opengauss_master'] | first }}"
-og_replicas: "{{ groups['opengauss_replica_nodes'] | sort }}"
+og_replicas: "{{ groups['opengauss_replicas'] | sort }}"
og_upload_path: "/opt/software/openGauss"
og_cm_enabled: "{{ (groups['opengauss'] | count) > 2 }}"
og_expansion: false
diff --git a/roles/opengauss/handlers/main.yml b/roles/opengauss/handlers/main.yml
index 798c84c1f2b8267e21a3e6a7a47bc289ec091699..3005875c210eff3b31ef0f5933c0d926e00bf5f5 100644
--- a/roles/opengauss/handlers/main.yml
+++ b/roles/opengauss/handlers/main.yml
@@ -4,4 +4,5 @@
ansible.builtin.service:
name: systemd-logind
state: restarted
- enabled: true
\ No newline at end of file
+ enabled: true
+ daemon_reload: true
diff --git a/roles/opengauss/tasks/deploy/cluster_check.yml b/roles/opengauss/tasks/deploy/cluster_check.yml
index 3bdad597d8f45c417a864ce242393f44e3545853..50c7f0e5a46b133c7c1e0bd11a348d2be3853f27 100644
--- a/roles/opengauss/tasks/deploy/cluster_check.yml
+++ b/roles/opengauss/tasks/deploy/cluster_check.yml
@@ -1,50 +1,65 @@
- name: Check cluster status
block:
- name: "Query cluster detail"
- ansible.builtin.command: >-
- gs_om -t status --detail
+ ansible.builtin.command: "gs_om -t status --detail"
changed_when: false
- register: cluster_detail
+ register: gs_detail
become_user: "{{ og_user }}"
delegate_to: "{{ og_master }}"
run_once: true
+ - name: Import tasks to create runtime groups
+ ansible.builtin.import_tasks:
+ file: deploy/runtime_groups.yml
+ run_once: true
+
rescue:
- - name: Start pre tasks
+ - name: Import pre tasks
ansible.builtin.import_tasks:
file: pre_tasks.yml
become_user: root
- - name: Start deploy
+ - name: Import runtime tasks
+ ansible.builtin.import_tasks:
+ file: deploy/runtime_groups.yml
+
+ - name: Import deploy tasks
ansible.builtin.import_tasks:
file: deploy/main.yml
delegate_to: "{{ og_master }}"
run_once: true
+ vars:
+ cm_nodes: "{{ (groups['opengauss_cm'] is defined) | ternary(groups['opengauss_cm'], '') | sort }}"
+ dn_nodes: "{{ (groups['opengauss_dn'] is defined) | ternary(groups['opengauss_dn'], '') | sort }}"
+ ep_nodes: "{{ (groups['opengauss_ep'] is defined) | ternary(groups['opengauss_ep'], '') | sort }}"
-- name: Check expansion status
- when: "cluster_detail is succeeded"
- block:
- - name: Create expansion list
- ansible.builtin.add_host:
- hostname: "{{ item }}"
- groups:
- - opengauss_expand
- loop: "{{ og_replicas }}"
- when: "item not in cluster_detail.stdout"
- run_once: true
-
- - name: Start pre tasks
+ - name: Repeat tasks
ansible.builtin.include_tasks:
- file: pre_tasks.yml
- when:
- - "groups['opengauss_expand'] is defined"
- - "inventory_hostname in groups['opengauss_expand']"
+ file: deploy/cluster_check.yml
+
+- name: Mission aborted
+ when:
+ - "gs_detail is succeeded"
+ - "gs_detail.stdout | regex_search(keywords, multiline=True, ignorecase=True)"
+ vars:
+ keywords: >-
+ "(repair|down)"
+ run_once: true
+ block:
+ - name: Abort tasks when cluster is unstable
+ ansible.builtin.fail:
+ msg: |
+ 集群状态有异常,请检查并手动修复后,再运行 playbook。
+ Cluster status is not NORMAL, pls fix it
+ and run the playbook again.
+ ---------------------------------------------
+ {{ gs_detail.stdout_lines }}
- - name: Start expansion
+ always:
+ - name: Import post tasks
ansible.builtin.import_tasks:
- file: expansion.yml
- vars:
- og_expansion: true
- delegate_to: "{{ og_master }}"
- when: "groups['opengauss_expand'] is defined"
- run_once: true
+ file: post_tasks.yml
+
+ - name: End play
+ ansible.builtin.meta:
+ end_play
diff --git a/roles/opengauss/tasks/deploy/cluster_expand.yml b/roles/opengauss/tasks/deploy/cluster_expand.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a41f0ae916302ee5f0047bcd11acef26aa3048ac
--- /dev/null
+++ b/roles/opengauss/tasks/deploy/cluster_expand.yml
@@ -0,0 +1,35 @@
+- name: Import pre tasks
+ ansible.builtin.include_tasks:
+ file: pre_tasks.yml
+ when: "inventory_hostname in ep_nodes"
+
+- name: Import deploy tasks
+ ansible.builtin.import_tasks:
+ file: deploy/main.yml
+ delegate_to: "{{ og_master }}"
+ run_once: true
+
+# # 3 节点或以上,且未部署 CM 的情况。
+# - name: Tasks for CM cluster
+# when:
+# - "(cm_nodes | count) < 2"
+# - "og_cm_enabled"
+# run_once: true
+# block:
+# - name: Import cluster manager tasks
+# ansible.builtin.import_tasks:
+# file: cluster_manager.yml
+# delegate_to: "{{ og_master }}"
+# become_user: "{{ og_user }}"
+
+# - name: Refresh cluster status
+# ansible.builtin.command:
+# gs_om -t status --detail
+# changed_when: false
+# register: gs_detail1
+# become_user: "{{ og_user }}"
+# delegate_to: "{{ og_master }}"
+
+# - name: Import runtime groups tasks
+# ansible.builtin.import_tasks:
+# file: deploy/runtime_groups.yml
diff --git a/roles/opengauss/tasks/deploy/cluster_manager.yml b/roles/opengauss/tasks/deploy/cluster_manager.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b70664035ee7b880c3ac54987ad53ba6c49f7738
--- /dev/null
+++ b/roles/opengauss/tasks/deploy/cluster_manager.yml
@@ -0,0 +1,198 @@
+- name: Deploy CM into existing data cluster
+ block:
+ - name: Import upload tasks
+ ansible.builtin.import_tasks:
+ file: upload.yml
+ become_user: root
+ # run_once: true
+
+ - name: Get cm package name
+ ansible.builtin.set_fact:
+ cm_pkg: "{{ file }}"
+ loop: "{{ og_upload.files | default([]) }}"
+ loop_control:
+ loop_var: file
+ when:
+ - "'cm.tar.gz' in file"
+ # run_once: true
+
+ - name: "Change file permission of {{ cm_pkg }}"
+ ansible.builtin.file:
+ path: "{{ og_upload_path }}/{{ cm_pkg }}"
+ owner: "{{ og_user }}"
+ group: "{{ og_group }}"
+ mode: "0640"
+ become_user: root
+ # run_once: true
+
+ - name: Create some paths
+ ansible.builtin.file:
+ path: "{{ item.0 }}"
+ state: directory
+ owner: "{{ og_user }}"
+ group: "{{ og_group }}"
+ mode: "0750"
+ delegate_to: "{{ item.1 }}"
+ become_user: root
+ with_nested:
+ - ['{{ og_log_path }}/omm/cm/cm_server', '{{ og_log_path }}/omm/cm/cm_agent']
+ - "{{ og_all_nodes }}"
+ vars:
+ og_log_path: "{{ combined_vars.opengauss_paths.gaussdbLogPath }}"
+
+ - name: "Remove /opt/openGauss/install/om/{{ cm_pkg }}"
+ ansible.builtin.file:
+ path: "/opt/openGauss/install/om/{{ cm_pkg }}"
+ state: absent
+ become_user: root
+ loop: "{{ og_all_nodes }}"
+ delegate_to: "{{ item }}"
+
+ # 这里需要建一个假的定时任务,包含 'om_monitor'。后续 cm_install 时会检查,否则失败。
+ - name: Fake an om_monitor cron job before install
+ ansible.builtin.cron:
+ name: openGauss om monitor
+ special_time: yearly
+ job: "{{ og_home }}/install/app/bin/om_monitor"
+ loop: "{{ dn_nodes }}"
+ loop_control:
+ loop_var: node
+ label: "{{ hostvars[node]['node_ip'] }}"
+ delegate_to: "{{ hostvars[node]['node_ip'] }}"
+
+ - name: "Create cluster_config.xml in local path '{{ inventory_dir }}'"
+ ansible.builtin.template:
+ src: "{{ item }}"
+ dest: "{{ inventory_dir }}/cluster_config.xml"
+ owner: "{{ og_user }}"
+ group: "{{ og_group }}"
+ mode: "0644"
+ lstrip_blocks: true
+ with_first_found:
+ - "{{ inventory_dir }}/templates/cluster_config.xml.j2"
+ - "cluster_config.xml.j2"
+ delegate_to: localhost
+ become: false
+ # run_once: true
+
+ - name: "Upload cluster_config.xml to {{ og_upload_path }}"
+ ansible.builtin.copy:
+ src: "{{ inventory_dir }}/cluster_config.xml"
+ dest: "{{ og_upload_path }}/"
+ owner: "{{ og_user }}"
+ group: "{{ og_group }}"
+ mode: "0644"
+ backup: true
+
+ - name: Step 1 | Switchover once to avoid 'Term of primary is invalid or not maximal' error
+ ansible.builtin.command:
+ gs_ctl switchover -D {{ og_data_path }}/dn
+ changed_when: false
+ loop: "{{ dn_nodes }}"
+ loop_control:
+ loop_var: node
+ delegate_to: "{{ hostvars[node]['node_ip'] }}"
+ when: "'Standby' in node"
+ register: switchover_status
+ until: "switchover_status is succeeded"
+ retries: 9
+ delay: 5
+
+ # - name: Select a standby node and the primary node
+ # ansible.builtin.set_fact:
+ # standby_nodes: >-
+ # {% for node in dn_nodes if 'Standby' in node %}
+ # {{ hostvars[node]['node_ip'] }}
+ # {% endfor %}
+ # primary_nodes: >-
+ # {% for node in dn_nodes if 'Primary' in node %}
+ # {{ hostvars[node]['node_ip'] }}
+ # {% endfor %}
+
+ - name: "Step 2 | Switchover back to {{ og_master }}"
+ ansible.builtin.command:
+ gs_ctl switchover -D {{ og_data_path }}/dn
+ changed_when: false
+ loop: "{{ dn_nodes }}"
+ loop_control:
+ loop_var: node
+ delegate_to: "{{ hostvars[node]['node_ip'] }}"
+ when: "'Primary' in node"
+ register: switchover_status
+ until: "switchover_status is succeeded"
+ retries: 9
+ delay: 5
+
+ # - name: Stop all nodes
+ # ansible.builtin.command:
+ # gs_om -t stop
+ # changed_when: false
+
+ - name: Install CM
+ ansible.builtin.expect:
+ command: "./cm_install -X {{ og_upload_path }}/cluster_config.xml --cmpkg {{ og_upload_path }}/{{ cm_pkg }}"
+ responses:
+ (?i)password: "{{ og_ca_pass }}"
+ chdir: "{{ og_home }}/install/app/tool/cm_tool"
+ changed_when: false
+ register: cm_install
+ until:
+ - "cm_install.stdout is defined"
+ - "'CM exists' in cm_install.stdout"
+ retries: 3
+ timeout: 300
+ ignore_errors: true
+ become_user: "{{ og_user }}"
+
+ rescue:
+ - name: Install pexpect
+ ansible.builtin.package:
+ name: "{{ python_name }}-pexpect"
+ become_user: root
+
+ - name: Repeat tasks
+ ansible.builtin.include_tasks:
+ file: cluster_manager.yml
+
+ always:
+ # - name: Debug
+ # ansible.builtin.debug:
+ # var: cm_install
+
+ # - name: Start the primary data node
+ # ansible.builtin.command:
+ # "gs_om -t start -h {{ hostvars[node]['node_name'] }}"
+ # loop: "{{ dn_nodes }}"
+ # loop_control:
+ # loop_var: node
+ # when: "'Primary' in node"
+ # changed_when: false
+
+ # - name: Wait for primary node started
+ # ansible.builtin.wait_for:
+ # host: "{{ hostvars[node]['node_ip'] }}"
+ # port: "{{ og_cluster_config.db_port }}"
+ # timeout: "600"
+ # loop: "{{ dn_nodes }}"
+ # loop_control:
+ # loop_var: node
+ # when: "'Primary' in node"
+ # changed_when: false
+
+ # - name: Start the rest of data nodes
+ # ansible.builtin.command:
+ # "gs_om -t start -h {{ hostvars[node]['node_name'] }}"
+ # loop: "{{ dn_nodes }}"
+ # loop_control:
+ # loop_var: node
+ # when: "'Primary' not in node"
+ # changed_when: false
+
+ - name: Wait for the cluster started
+ ansible.builtin.command:
+ "gs_om -t status"
+ register: gs_status
+ until: "'Normal' in gs_status.stdout"
+ retries: 30
+ delay: 10
+ changed_when: false
diff --git a/roles/opengauss/tasks/deploy/expansion.yml b/roles/opengauss/tasks/deploy/expansion.yml
deleted file mode 100644
index af64d2b1c21983cfac460a2dbe46e259688ccadd..0000000000000000000000000000000000000000
--- a/roles/opengauss/tasks/deploy/expansion.yml
+++ /dev/null
@@ -1,118 +0,0 @@
-- name: Expansion list
- ansible.builtin.debug:
- msg: "{{ groups['opengauss_expand'] }}"
-
-# - name: Debug
-# ansible.builtin.debug:
-# msg: "{{ split_line }}"
-# loop: "{{ cluster_detail.stdout_lines | sort }}"
-# loop_control:
-# loop_var: line
-# when: "'cmserver' in line"
-# vars:
-# split_line: "{{ line | regex_replace(' {1,}', '|') | split('|') }}"
-
-- name: Create current cmserver list
- loop: "{{ cluster_detail.stdout_lines | sort }}"
- loop_control:
- loop_var: line
- when: "'cmserver' in line"
- ansible.builtin.add_host:
- hostname: "{{ node_info[3] }}_{{ node_info[1] }}"
- groups:
- - opengauss_cm
- node_ip: "{{ node_info[2] }}"
- vars:
- node_info: "{{ line | regex_replace(' {1,}', '|') | split('|') }}"
-
-- name: Current config manager servers
- ansible.builtin.debug:
- msg: "{{ groups['opengauss_cm'] }}"
- when: "groups['opengauss_cm'] is defined"
-
-- name: Set 'og_expand_cm_ips' facts
- ansible.builtin.set_fact:
- og_expand_cm_ips: >-
- {%- for node in (groups['opengauss_cm'] | sort) -%}
- {{ hostvars[node]['node_ip'] }}
- {{ (loop.nextitem is defined) | ternary(',', '') }}
- {%- endfor -%}
- {%- if groups['opengauss_expand'] is defined -%}
- {%- for node in (groups['opengauss_expand'] | sort) -%}
- ,{{ node }}
- {%- endfor -%}
- {%- endif -%}
- og_cm_names: >-
- {%- for node in (groups['opengauss_cm'] | sort) -%}
- og{{ hostvars[node]['node_ip'] | ipaddr('int') }}
- {{ (loop.nextitem is defined) | ternary(',', '') }}
- {%- endfor -%}
- {%- if groups['opengauss_expand'] is defined -%}
- {%- for node in (groups['opengauss_expand'] | sort) -%}
- ,og{{ node | ipaddr('int') }}
- {%- endfor -%}
- {%- endif -%}
- when: "groups['opengauss_cm'] is defined"
-
-# - name: Debug
-# ansible.builtin.debug:
-# msg: "{{ split_line }}"
-# loop: "{{ cluster_detail.stdout_lines | sort }}"
-# loop_control:
-# loop_var: line
-# when: "(og_data_path + '/dn') in line"
-# vars:
-# split_line: "{{ line | regex_replace(' {1,}', '|') | split('|') }}"
-
-- name: Create current data node list
- loop: "{{ cluster_detail.stdout_lines | sort }}"
- loop_control:
- loop_var: line
- when: "(og_data_path + '/dn') in line"
- ansible.builtin.add_host:
- hostname: "{{ node_info[3] }}_{{ node_info[1] }}"
- groups:
- - opengauss_dn
- node_ip: "{{ node_info[2] }}"
- node_name: "{{ node_info[1] }}"
- vars:
- node_info: "{{ line | regex_replace(' {1,}', '|') | split('|') }}"
-
-- name: Current data nodes
- ansible.builtin.debug:
- msg: "{{ groups['opengauss_dn'] }}"
- when: "groups['opengauss_dn'] is defined"
-
-- name: Set 'og_data_nodes' facts
- ansible.builtin.set_fact:
- og_data_nodes: >-
- {{ og_data_path }}/dn
- {%- for node in (groups['opengauss_dn'] | sort) if (hostvars[node]['node_ip'] != og_master) -%}
- ,{{ hostvars[node]['node_name'] }},{{ og_data_path }}/dn
- {%- endfor -%}
- {%- for node in (groups['opengauss_expand'] | sort) -%}
- ,og{{ node | ipaddr('int') }},{{ og_data_path }}/dn
- {%- endfor -%}
- og_expansion: "{{ groups['opengauss_expand'] is defined }}"
- when: "groups['opengauss_dn'] is defined"
-
-- name: Cluster will be expand
- when: og_expansion
- block:
- - name: Update /etc/hosts
- ansible.builtin.blockinfile:
- path: /etc/hosts
- marker: "# {mark} OPENGAUSS NODES"
- block: |
- {% for node in og_all_nodes %}
- {{ node }} og{{ node | ipaddr('int') }} og-{{ node | replace('.', '-') }}
- {% endfor %}
- delegate_to: "{{ node }}"
- loop: "{{ og_all_nodes }}"
- loop_control:
- loop_var: node
-
- - name: Start expand
- ansible.builtin.import_tasks:
- file: deploy/main.yml
- delegate_to: "{{ og_master }}"
diff --git a/roles/opengauss/tasks/deploy/install.yml b/roles/opengauss/tasks/deploy/install.yml
index b49ab6072f9c8273b13565b151e8ef7e695553bb..5bcce4eb57ac68e9d8f78902db10983015ef939b 100644
--- a/roles/opengauss/tasks/deploy/install.yml
+++ b/roles/opengauss/tasks/deploy/install.yml
@@ -1,17 +1,51 @@
-- name: "Create cluster_config.xml under {{ og_upload_path }}"
+- name: "Create cluster_config.xml in local path '{{ inventory_dir }}'"
ansible.builtin.template:
src: "{{ item }}"
- dest: "{{ og_upload_path }}/cluster_config.xml"
+ dest: "{{ inventory_dir }}/cluster_config.xml"
owner: "{{ og_user }}"
group: "{{ og_group }}"
mode: "0644"
- backup: true
lstrip_blocks: true
with_first_found:
- "{{ inventory_dir }}/templates/cluster_config.xml.j2"
- "cluster_config.xml.j2"
+ delegate_to: localhost
+ become: false
+
+- name: "Upload cluster_config.xml to {{ og_upload_path }}"
+ ansible.builtin.copy:
+ src: "{{ inventory_dir }}/cluster_config.xml"
+ dest: "{{ og_upload_path }}/"
+ owner: "{{ og_user }}"
+ group: "{{ og_group }}"
+ mode: "0644"
+ backup: true
+
+- name: Start expansion
+ become_user: root
+ when: "og_expansion"
+ block:
+ - name: Starting pre install
+ ansible.builtin.command: >-
+ {{ og_upload_path }}/script/gs_preinstall \
+ -U {{ og_user }} \
+ -G {{ og_group }} \
+ -X {{ og_upload_path }}/cluster_config.xml \
+ --non-interactive
+ changed_when: false
-- name: First time deploy
+ - name: Cluster expanding
+ ansible.builtin.shell: >-
+ . /home/{{ og_user }}/.bashrc && \
+ {{ og_upload_path }}/script/gs_expansion \
+ -U {{ og_user }} \
+ -G {{ og_group }} \
+ -X {{ og_upload_path }}/cluster_config.xml \
+ -h {{ groups['opengauss_ep'] | join(',') }} \
+ --time-out {{ (og_all_nodes | count) * 600 }}
+ changed_when: false
+
+- name: Starting deploy
when: "not og_expansion"
block:
- name: Starting pre install
@@ -28,20 +62,8 @@
gs_install \
-X {{ og_upload_path }}/cluster_config.xml \
--gsinit-parameter="--pwpasswd={{ og_db_pass }}" \
- --gsinit-parameter="--locale={{ og_locale }}"
+ --gsinit-parameter="--locale={{ og_locale }}" \
+ --time-out {{ (og_all_nodes | count) * 600 }}
changed_when: false
become_user: "{{ og_user }}"
become_flags: "-i"
-
-- name: Starting expand
- ansible.builtin.shell: |
- . /home/{{ og_user }}/.bashrc
-
- {{ og_upload_path }}/script/gs_expansion \
- -U {{ og_user }} \
- -G {{ og_group }} \
- -X {{ og_upload_path }}/cluster_config.xml \
- -h {{ groups['opengauss_expand'] | join(',') }}
- become_user: root
- changed_when: false
- when: "og_expansion"
diff --git a/roles/opengauss/tasks/deploy/known_hosts.yml b/roles/opengauss/tasks/deploy/known_hosts.yml
index 286b335d1cfe3dcf8445980f79302690ecbbd357..21e04b2888c2f1e4483465414289089a7bb141c5 100644
--- a/roles/opengauss/tasks/deploy/known_hosts.yml
+++ b/roles/opengauss/tasks/deploy/known_hosts.yml
@@ -1,16 +1,30 @@
-- name: "Update .ssh/known_hosts"
+- name: "Update /root/.ssh/known_hosts"
ansible.builtin.blockinfile:
- path: "{{ og_ssh.home }}/.ssh/known_hosts"
- owner: "{{ og_ssh.user }}"
- group: "{{ og_ssh.group }}"
+ path: "/root/.ssh/known_hosts"
+ owner: "root"
+ group: "root"
+ create: true
+ mode: "0644"
+ block: |
+ {% for key in (host_keys | sort) %}
+ {{ key }}
+ {% endfor %}
+ loop: "{{ og_all_nodes }}"
+ loop_control:
+ loop_var: node
+ delegate_to: "{{ node }}"
+
+- name: "Update ~/.ssh/known_hosts for user '{{ og_user }}'"
+ ansible.builtin.blockinfile:
+ path: "/home/{{ og_user }}/.ssh/known_hosts"
+ owner: "{{ og_user }}"
+ group: "{{ og_group }}"
create: true
mode: "0644"
block: |
{% for key in (host_keys | sort) %}
{{ key }}
{% endfor %}
- vars:
- host_keys: "{{ known_host_keys.results | map(attribute='stdout_lines') | flatten }}"
loop: "{{ og_all_nodes }}"
loop_control:
loop_var: node
diff --git a/roles/opengauss/tasks/deploy/main.yml b/roles/opengauss/tasks/deploy/main.yml
index b7ed008ba32daf1f85843e45dcc4ec072decd48f..8346313506e51db70e75551dacec6974d5377c58 100644
--- a/roles/opengauss/tasks/deploy/main.yml
+++ b/roles/opengauss/tasks/deploy/main.yml
@@ -1,3 +1,16 @@
+- name: Update /etc/hosts
+ ansible.builtin.blockinfile:
+ path: /etc/hosts
+ marker: "# {mark} OPENGAUSS NODES"
+ block: |
+ {% for node in og_all_nodes %}
+ {{ node }} og{{ node | ipaddr('int') }}
+ {% endfor %}
+ delegate_to: "{{ node }}"
+ loop: "{{ og_all_nodes }}"
+ loop_control:
+ loop_var: node
+
- name: Scan hosts key
ansible.builtin.command: >-
ssh-keyscan -p {{ host_port }} {{ node }},og{{ node | ipaddr('int') }}
@@ -12,15 +25,8 @@
- name: Config known hosts
ansible.builtin.include_tasks:
file: deploy/known_hosts.yml
- with_items:
- - user: root
- group: root
- home: /root
- - user: "{{ og_user }}"
- group: "{{ og_group }}"
- home: "/home/{{ og_user }}"
- loop_control:
- loop_var: og_ssh
+ vars:
+ host_keys: "{{ known_host_keys.results | map(attribute='stdout_lines') | flatten }}"
- name: Config authorized keys
ansible.builtin.include_tasks:
@@ -39,11 +45,11 @@
changed_when: false
rescue:
- - name: Upload packages
+ - name: Import upload tasks
ansible.builtin.import_tasks:
file: deploy/upload.yml
always:
- - name: In progressing
+ - name: Import installation tasks
ansible.builtin.import_tasks:
file: deploy/install.yml
diff --git a/roles/opengauss/tasks/deploy/runtime_groups.yml b/roles/opengauss/tasks/deploy/runtime_groups.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d7571569dea38c9f297596b1979873eabf128e26
--- /dev/null
+++ b/roles/opengauss/tasks/deploy/runtime_groups.yml
@@ -0,0 +1,124 @@
+# - name: Expansion list
+# ansible.builtin.debug:
+# msg: "{{ groups['opengauss_ep'] }}"
+
+# - ansible.builtin.debug:
+# var: gs_detail.stdout_lines
+
+# - name: Debug
+# ansible.builtin.debug:
+# msg: "{{ split_line }}"
+# loop: "{{ gs_detail.stdout_lines | sort }}"
+# loop_control:
+# loop_var: line
+# when: "'cmserver' in line"
+# vars:
+# split_line: "{{ line | regex_replace(' {1,}', '|') | split('|') }}"
+
+# 如果已部署集群
+- name: If deployed
+ block:
+ # 不在集群里的 IP 加入到扩展节点分组。
+ - name: Create group 'opengauss_ep'
+ ansible.builtin.add_host:
+ hostname: "{{ node }}"
+ groups:
+ - opengauss_ep
+ loop: "{{ og_replicas }}"
+ loop_control:
+ loop_var: node
+ when: "node not in gs_detail.stdout"
+
+ # 按编号顺序保存现有 CM 服务器列表。
+ - name: Create current cmserver list
+ ansible.builtin.add_host:
+ hostname: "{{ node_info[3] }}_{{ node_info[1] }}"
+ groups:
+ - opengauss_cm
+ node_ip: "{{ node_info[2] }}"
+ loop: "{{ gs_detail.stdout_lines | sort }}"
+ loop_control:
+ loop_var: line
+ vars:
+ node_info: "{{ line | regex_replace(' {1,}', '|') | split('|') }}"
+ when: "'cmserver' in line"
+
+ - name: Print out current cluster manager servers
+ ansible.builtin.debug:
+ msg: "{{ groups['opengauss_cm'] }}"
+ when: "groups['opengauss_cm'] is defined"
+
+ # 按编号顺序保存现有 DN 服务器列表。
+ # 这里需要判断输出了多少列,因为有 CM 的集群里,会隐藏数据库端口 Port 的那一列。
+ - name: Create current data nodes list
+ ansible.builtin.add_host:
+ hostname: >-
+ {%- if og_cluster_config.db_port in line -%}
+ {{ node_info[4] }}_{{ node_info[1] }}_{{ node_info[7] }}
+ {%- else -%}
+ {{ node_info[3] }}_{{ node_info[1] }}_{{ node_info[6] }}
+ {%- endif -%}
+ groups:
+ - opengauss_dn
+ node_ip: "{{ node_info[2] }}"
+ node_name: "{{ node_info[1] }}"
+ loop: "{{ gs_detail.stdout_lines | sort }}"
+ loop_control:
+ loop_var: line
+ label: "{{ line }}"
+ when: "(og_data_path + '/dn') in line"
+ vars:
+ node_info: "{{ line | regex_replace(' {1,}', '|') | split('|') }}"
+
+# # 如果未部署集群
+# - name: Create init data nodes list
+# ansible.builtin.add_host:
+# hostname: "{{ node }}"
+# groups:
+# - opengauss_dn
+# node_ip: "{{ node }}"
+# node_name: "og{{ node | ipaddr('int') }}"
+# loop: "{{ groups['opengauss'] }}"
+# loop_control:
+# loop_var: node
+# extended: true
+# when: "gs_detail.stdout_lines is falsy"
+
+# - name: Current data nodes
+# ansible.builtin.debug:
+# msg: "{{ groups['opengauss_dn'] }}"
+# when: "groups['opengauss_dn'] is defined"
+
+# # 如果未部署 CM 且为单节点
+# - name: Create groups for CM deploy | Single node mode
+# when:
+# - "groups['opengauss_cm'] is not defined"
+# - "(groups['opengauss_dn'] | count) == 1"
+# - "og_cm_enabled"
+# block:
+# - name: Create init cm nodes list
+# ansible.builtin.add_host:
+# hostname: "{{ node }}"
+# groups:
+# - opengauss_cm
+# node_ip: "{{ node }}"
+# node_name: "og{{ node | ipaddr('int') }}"
+# loop: "{{ groups['opengauss_ep'] | first }}"
+# loop_control:
+# loop_var: node
+
+# - name: Create init dn nodes list
+# ansible.builtin.add_host:
+# hostname: "{{ node }}"
+# groups:
+# - opengauss_cm
+# node_ip: "{{ node }}"
+# node_name: "og{{ node | ipaddr('int') }}"
+# loop: "{{ groups['opengauss_dn'] | first }}"
+# loop_control:
+# loop_var: node
+
+# - name: Current cm nodes
+# ansible.builtin.debug:
+# msg: "{{ groups['opengauss_cm'] }}"
+# when: "groups['opengauss_cm'] is defined"
diff --git a/roles/opengauss/tasks/deploy/upload.yml b/roles/opengauss/tasks/deploy/upload.yml
index cc2145bff05a0b4df4a1d525230d9841360dbd5f..08c20bc1fca757bf9c53a91c2d9dc39324518b7e 100644
--- a/roles/opengauss/tasks/deploy/upload.yml
+++ b/roles/opengauss/tasks/deploy/upload.yml
@@ -5,13 +5,18 @@
path: "{{ og_upload_path }}"
state: directory
mode: "0755"
+ owner: "{{ og_user }}"
+ group: "{{ og_group }}"
- name: "Uploading {{ og_pkg_name }}"
ansible.builtin.unarchive:
src: "{{ playbook_dir }}/downloaded_files/{{ og_pkg_name }}"
dest: "{{ og_upload_path }}/"
list_files: true
- creates: "{{ og_upload_path }}/version.cfg"
+ extra_opts:
+ - "--owner={{ og_user }}"
+ - "--group={{ og_group }}"
+ # creates: "{{ og_upload_path }}/version.cfg"
register: og_upload
- name: "Extracting om tar file"
diff --git a/roles/opengauss/tasks/main.yml b/roles/opengauss/tasks/main.yml
index e52c96df099f58f30c43d33fef839ff41551df47..2861b36302ca3269cf3fc45321dac1f83cc2f1f5 100644
--- a/roles/opengauss/tasks/main.yml
+++ b/roles/opengauss/tasks/main.yml
@@ -2,50 +2,80 @@
# tasks file for openGauss
- name: Tasks always run
- tags: always
block:
- - name: Combine vars
+ - name: Import vars combine tasks
ansible.builtin.import_role:
name: "pre_tasks"
tasks_from: "vars_combine.yml"
- - name: Set runtime facts
- ansible.builtin.import_tasks: runtime_facts.yml
+ - name: Import runtime facts tasks
+ ansible.builtin.import_tasks:
+ file: runtime_facts.yml
- - name: Check cluster status
+ - name: Import cluster check tasks
ansible.builtin.import_tasks:
file: deploy/cluster_check.yml
- # - name: Cluster will be expand
- # when: og_expansion
- # block:
- # - name: Start pre tasks
- # ansible.builtin.import_tasks:
- # file: pre_tasks.yml
- # when: "inventory_hostname in groups['opengauss_expand']"
+ - name: Import cluster expand tasks
+ ansible.builtin.import_tasks:
+ file: deploy/cluster_expand.yml
+ vars:
+ cm_nodes: "{{ (groups['opengauss_cm'] is defined) | ternary(groups['opengauss_cm'], '') | sort }}"
+ dn_nodes: "{{ (groups['opengauss_dn'] is defined) | ternary(groups['opengauss_dn'], '') | sort }}"
+ ep_nodes: "{{ (groups['opengauss_ep'] is defined) | ternary(groups['opengauss_ep'], '') | sort }}"
+ # 当现有架构不足 3 节点时,先扩容数据节点(CM),再部署管理节点(CM)
+ og_expansion: true
+ og_cm_enabled: >-
+ {{
+ (
+ (groups['opengauss_cm'] is not defined)
+ and
+ (dn_nodes | count ) < 3
+ )
+ |
+ ternary(
+ false,
+ true
+ )
+ }}
+ when: "groups['opengauss_ep'] is defined"
- # - name: Update /etc/hosts
- # ansible.builtin.blockinfile:
- # path: /etc/hosts
- # marker: "# {mark} OPENGAUSS NODES"
- # block: |
- # {% for node in og_all_nodes %}
- # {{ node }} og{{ node | ipaddr('int') }} og-{{ node | replace('.', '-') }}
- # {% endfor %}
- # delegate_to: "{{ node }}"
- # loop: "{{ og_all_nodes }}"
- # loop_control:
- # loop_var: node
- # run_once: true
+ - name: Import cluster manager deploy
+ become_user: "{{ og_user }}"
+ delegate_to: "{{ og_master }}"
+ run_once: true
+ when:
+ - "groups['opengauss_cm'] is not defined"
+ - "og_cm_enabled"
+ block:
+ - name: Import cluster checking tasks
+ ansible.builtin.import_tasks:
+ file: deploy/cluster_check.yml
- # - name: Start deploy
- # ansible.builtin.import_tasks:
- # file: deploy/main.yml
- # delegate_to: "{{ og_master }}"
- # run_once: true
+ - name: Import cluster manager deploy tasks
+ ansible.builtin.import_tasks:
+ file: deploy/cluster_manager.yml
+ vars:
+ cm_nodes: "{{ (groups['opengauss_dn'] is defined) | ternary(groups['opengauss_dn'], '') | sort }}"
+ dn_nodes: "{{ (groups['opengauss_dn'] is defined) | ternary(groups['opengauss_dn'], '') | sort }}"
+ ep_nodes: ""
+ og_expansion: false
+ og_cm_enabled: >-
+ {{
+ (
+ (groups['opengauss_cm'] is not defined)
+ and
+ (dn_nodes | count ) < 3
+ )
+ |
+ ternary(
+ false,
+ true
+ )
+ }}
always:
- - name: Run post tasks
+ - name: Import post tasks
ansible.builtin.import_tasks:
file: post_tasks.yml
tags: always
diff --git a/roles/opengauss/tasks/os/CentOS.yml b/roles/opengauss/tasks/os/CentOS.yml
index b13380540dfa7ab261446794ea40b03501c17eea..e78a1f05ae3cd28f998ccfdb57312ae47287d0a6 100644
--- a/roles/opengauss/tasks/os/CentOS.yml
+++ b/roles/opengauss/tasks/os/CentOS.yml
@@ -2,6 +2,9 @@
ansible.builtin.package:
name: epel-release
use: "{{ custom_pkg_mgr | default(ansible_pkg_mgr) }}"
+ register: pkg_inst
+ until: pkg_inst is succeeded
+ retries: 3
- name: Install dependencies
ansible.builtin.package:
@@ -9,3 +12,6 @@
- python36
- redhat-lsb-core
use: "{{ custom_pkg_mgr | default(ansible_pkg_mgr) }}"
+ register: pkg_inst
+ until: pkg_inst is succeeded
+ retries: 3
diff --git a/roles/opengauss/tasks/os/common_set.yml b/roles/opengauss/tasks/os/common_set.yml
index db7c9707b23af4e781d806fa4f6639542a507459..b0403302c8c9eb0b1962879a11cd80bcb945b39f 100644
--- a/roles/opengauss/tasks/os/common_set.yml
+++ b/roles/opengauss/tasks/os/common_set.yml
@@ -18,6 +18,7 @@
option: RemoveIPC
value: "no"
mode: "0644"
+ notify: Restart systemd-logind.service
- name: Config /usr/lib/systemd/system/systemd-logind.service
ini_file:
@@ -57,8 +58,12 @@
- bison
- nano
- htop
- update_cache: true
+ - "{{ python_name }}-pexpect"
+ # update_cache: true
use: "{{ custom_pkg_mgr | default(ansible_pkg_mgr) }}"
+ register: pkg_inst
+ until: pkg_inst is succeeded
+ retries: 3
- name: Enable ntpd service
ansible.builtin.service:
@@ -66,20 +71,6 @@
state: started
enabled: true
-- name: Config /etc/hosts
- ansible.builtin.blockinfile:
- path: /etc/hosts
- marker: "# {mark} OPENGAUSS NODES"
- block: |
- {% for node in og_all_nodes %}
- {{ node }} og{{ node | ipaddr('int') }} og-{{ node | replace('.', '-') }}
- {% endfor %}
- delegate_to: "{{ node }}"
- loop: "{{ og_all_nodes }}"
- loop_control:
- loop_var: node
- run_once: true
-
- name: Get backIp1's iface name
ansible.builtin.shell:
cmd: |
@@ -123,3 +114,13 @@
ansible.builtin.command:
swapoff -a
changed_when: false
+
+- name: Config /etc/sysctl.d/50-opengauss.conf
+ ansible.posix.sysctl:
+ sysctl_file: /etc/sysctl.d/50-opengauss.conf
+ name: "{{ sysctl.key }}"
+ value: "{{ sysctl.value }}"
+ with_dict: "{{ combined_vars.opengauss_sysctl }}"
+ loop_control:
+ label: "{{ sysctl.key }} = {{ sysctl.value }}"
+ loop_var: sysctl
diff --git a/roles/opengauss/tasks/os/openEuler.yml b/roles/opengauss/tasks/os/openEuler.yml
index f0ecedb751b11f39d08b848580652ee29a4b5660..4637580ff25351b926bb024095d38cf1fad3c43c 100644
--- a/roles/opengauss/tasks/os/openEuler.yml
+++ b/roles/opengauss/tasks/os/openEuler.yml
@@ -4,6 +4,9 @@
- libnsl
- readline-devel
use: "{{ custom_pkg_mgr | default(ansible_pkg_mgr) }}"
+ register: pkg_inst
+ until: pkg_inst is succeeded
+ retries: 3
- name: Create soft link
ansible.builtin.file:
diff --git a/roles/opengauss/tasks/os/user.yml b/roles/opengauss/tasks/os/user.yml
index 21c6d7d503bf3a2eb4299e38a8b50442b0543886..12e5f6a972b250c11772c22ae0d259893970991c 100644
--- a/roles/opengauss/tasks/os/user.yml
+++ b/roles/opengauss/tasks/os/user.yml
@@ -21,10 +21,13 @@
group: "{{ og_group }}"
recurse: true
- - name: "Create .bashrc under /home/{{ og_user }}"
- ansible.builtin.file:
+ - name: "Config command alias for user '{{ og_user }}'"
+ ansible.builtin.lineinfile:
path: "/home/{{ og_user }}/.bashrc"
- state: touch
+ create: true
+ line: "{{ item }}"
owner: "{{ og_user }}"
group: "{{ og_group }}"
mode: "0644"
+ with_items:
+ - "alias gs_detail='gs_om -t status --detail'"
diff --git a/roles/opengauss/tasks/post_tasks.yml b/roles/opengauss/tasks/post_tasks.yml
index 026d3e71910e84bc7f4a8640f247890910b63511..5af0b3de63402e8168f3892547a90f3af471406f 100644
--- a/roles/opengauss/tasks/post_tasks.yml
+++ b/roles/opengauss/tasks/post_tasks.yml
@@ -1,12 +1,12 @@
-- name: Config /etc/sysctl.d/50-opengauss.conf
- ansible.posix.sysctl:
- sysctl_file: /etc/sysctl.d/50-opengauss.conf
- name: "{{ sysctl.key }}"
- value: "{{ sysctl.value }}"
- with_dict: "{{ combined_vars.opengauss_sysctl }}"
- loop_control:
- label: "{{ sysctl.key }} = {{ sysctl.value }}"
- loop_var: sysctl
+# - name: Config /etc/sysctl.d/50-opengauss.conf
+# ansible.posix.sysctl:
+# sysctl_file: /etc/sysctl.d/50-opengauss.conf
+# name: "{{ sysctl.key }}"
+# value: "{{ sysctl.value }}"
+# with_dict: "{{ combined_vars.opengauss_sysctl }}"
+# loop_control:
+# label: "{{ sysctl.key }} = {{ sysctl.value }}"
+# loop_var: sysctl
- name: Remove authorized key
ansible.posix.authorized_key:
diff --git a/roles/opengauss/tasks/pre_tasks.yml b/roles/opengauss/tasks/pre_tasks.yml
index 6bd44a423755dc0581b9543dc2b49578719aeb6a..1d0a3fc80a285dd22e140f9cc08fd9fa4197b90a 100644
--- a/roles/opengauss/tasks/pre_tasks.yml
+++ b/roles/opengauss/tasks/pre_tasks.yml
@@ -1,26 +1,30 @@
-- name: "Custom sets for {{ ansible_distribution }}"
- ansible.builtin.include_tasks: "{{ item }}"
+- name: "Import custom tasks for {{ ansible_distribution }}"
+ ansible.builtin.include_tasks:
+ file: "{{ item }}"
with_first_found:
- "os/{{ ansible_distribution | replace(' ', '_') }}.yml"
- "os/not_supported.yml"
-- name: Common sets for all distribution
- ansible.builtin.import_tasks: os/common_set.yml
+- name: Import Common tasks for all distribution
+ ansible.builtin.import_tasks:
+ file: os/common_set.yml
-- name: "Custom sets for {{ ansible_os_family }}"
- ansible.builtin.include_tasks: "{{ item }}"
+- name: "Import custom tasks for {{ ansible_os_family }}"
+ ansible.builtin.include_tasks:
+ file: "{{ item }}"
with_first_found:
- "os/{{ ansible_os_family }}.yml"
- "os/not_supported.yml"
-- name: Config user on hosts
+- name: Import user config tasks
ansible.builtin.include_tasks:
file: os/user.yml
- with_items: "{{ groups['opengauss_expand'] | default(og_all_nodes) }}"
+ with_items: "{{ groups['opengauss_ep'] | default(og_all_nodes) }}"
loop_control:
loop_var: node
+ run_once: true
-- name: Config ssh on hosts
+- name: Import ssh config tasks
ansible.builtin.include_tasks:
file: os/ssh.yml
with_items:
diff --git a/roles/opengauss/tasks/runtime_facts.yml b/roles/opengauss/tasks/runtime_facts.yml
index c92fd4229ce27b523ba238a80bb929a665f729f6..892de1338e970bd1af7bbdec96d84d45875aadf2 100644
--- a/roles/opengauss/tasks/runtime_facts.yml
+++ b/roles/opengauss/tasks/runtime_facts.yml
@@ -3,6 +3,7 @@
og_user: "{{ combined_vars.opengauss_env.user_name }}"
og_group: "{{ combined_vars.opengauss_env.user_group }}"
og_user_pass: "{{ combined_vars.opengauss_env.user_pass }}"
+ og_ca_pass: "{{ combined_vars.opengauss_env.ca_file_pass }}"
og_home: "{{ combined_vars.opengauss_home }}"
og_paths: "{{ combined_vars.opengauss_paths }}"
og_ver: "{{ combined_vars.opengauss_version }}"
@@ -12,23 +13,21 @@
og_cluster_config:
az_name: "{{ combined_vars.opengauss_env.azName | default('AZ1') }}"
az_priority: "{{ combined_vars.opengauss_env.azPriority | default('1') }}"
- port_base: "{{ combined_vars.opengauss_env.cmServerPortBase }}"
- port_data: "{{ combined_vars.opengauss_env.dataPortBase }}"
+ cm_port: "{{ combined_vars.opengauss_env.cmServerPortBase }}"
+ db_port: "{{ combined_vars.opengauss_env.dataPortBase }}"
sync_num: "{{ combined_vars.opengauss_env.syncNum }}"
- name: Set runtime facts - 2
ansible.builtin.set_fact:
- og_all_names: >-
- og{{ og_master | ipaddr('int') }}{% for node in og_replicas %},og{{ node | ipaddr('int') }}{% endfor %}
- og_all_ips: >-
- {{ og_master }}{% for node in og_replicas %},{{ node }}{% endfor %}
- og_all_dn_nodes: >-
- {{ og_data_path }}/dn{% for node in og_replicas %},og{{ node | ipaddr('int') }},{{ og_data_path }}/dn{% endfor %}
og_pkg_url: >-
{{ combined_vars.opengauss_download
- [ansible_architecture]
- [(ansible_distribution | replace(' ', '_') | lower)
- + '_'
- + ansible_distribution_major_version]
- | replace(opengauss_version, og_ver) }}
+ [
+ ansible_architecture
+ ]
+ [
+ (
+ ansible_distribution | replace(' ', '_') | lower
+ ) + '_' + ansible_distribution_major_version
+ ] | replace(opengauss_version, og_ver)
+ }}
og_pkg_name: "openGauss_{{ og_ver }}_{{ ansible_distribution }}_{{ ansible_distribution_version }}_{{ ansible_architecture }}.tar.gz"
diff --git a/roles/opengauss/templates/cluster_config.xml.j2 b/roles/opengauss/templates/cluster_config.xml.j2
index 57f21804873d475364cbe08706c4d4cbc5761f3d..a7e8607003af870534a9b732a67479a1f14a0dbe 100644
--- a/roles/opengauss/templates/cluster_config.xml.j2
+++ b/roles/opengauss/templates/cluster_config.xml.j2
@@ -2,20 +2,34 @@
-
-
+
+
-{{ lookup('template', 'cluster_master.xml.j2') }}
-{% if (og_replicas | count) > 0 %}
-{{ lookup('template', 'cluster_replicas.xml.j2') }}
-{% endif %}
+{{ lookup('ansible.builtin.template', 'cluster_master.xml.j2') }}
+
+{{ lookup('ansible.builtin.template', 'cluster_replicas.xml.j2') }}
+
diff --git a/roles/opengauss/templates/cluster_master.xml.j2 b/roles/opengauss/templates/cluster_master.xml.j2
index b69e7029195b13c93450ecb8ecdfcc0bb1300abc..c6651d0f47cb533b51cb60ab2ff2eedee6d0e4c8 100644
--- a/roles/opengauss/templates/cluster_master.xml.j2
+++ b/roles/opengauss/templates/cluster_master.xml.j2
@@ -9,18 +9,48 @@
-
-
+
+
-{% if og_cm_enabled %}
+ {%- if og_cm_enabled -%}
-
-
-
+
-
-{% endif %}
+
+
+
+ {%- endif -%}
\ No newline at end of file
diff --git a/roles/opengauss/templates/cluster_replicas.xml.j2 b/roles/opengauss/templates/cluster_replicas.xml.j2
index f6dae6ead3b57d2aaa4e3536b05f463c7b52cb62..cbffafa7615a04bf24e05e7b197416bc428938b1 100644
--- a/roles/opengauss/templates/cluster_replicas.xml.j2
+++ b/roles/opengauss/templates/cluster_replicas.xml.j2
@@ -1,19 +1,43 @@
+{% for node in dn_nodes if hostvars[node]['node_ip'] != og_master %}
+
+
+
+
+
+
+
+
+{% if og_cm_enabled %}
+
+
+
+{% endif %}
+
+{% if hostvars[node]['node_ip'] in groups['opengauss_cascade'] %}
+
+
+{% endif %}
+
+{% endfor %}
+
+{% for node in ep_nodes %}
-
-{% for node in (groups['opengauss_replica_nodes'] | sort) %}
-{% if (groups['opengauss'] | count) > 2 %}
+
+{% if og_cm_enabled %}
-
+
-
{% endif %}
-
-
-{% endfor %}
+{% if node in groups['opengauss_cascade'] %}
+
+
+{% endif %}
+
+{% endfor %}
\ No newline at end of file
diff --git a/roles/opengauss/templates/report.md.j2 b/roles/opengauss/templates/report.md.j2
index 81bbb654e4572fff40be2f4e5dff6a5f9ead1b29..2bf54f67c5924822abbda97511bfd850c5d6d915 100644
--- a/roles/opengauss/templates/report.md.j2
+++ b/roles/opengauss/templates/report.md.j2
@@ -16,4 +16,4 @@
| Linux 用户名称 | {{ og_user }} |
| Linux 用户密码 | {{ lookup('password', inventory_dir + '/credentials/opengauss_omm_pass', chars=['ascii_letters', 'digits']) }} |
| Linux 用户组 | {{ og_group }} |
-| 数据库 root 密码 |{{ combined_vars.opengauss_db_set.root_pass }} |
\ No newline at end of file
+| 数据库 root 密码 | {{ combined_vars.opengauss_db_set.root_pass }} |
\ No newline at end of file
diff --git a/roles/pre_tasks/tasks/main.yml b/roles/pre_tasks/tasks/main.yml
index 9ca5d2af2f85ba3757e30aff5a0245ae3fd9b151..8566c4dad34845feda6034ddb5244d63fe4af188 100644
--- a/roles/pre_tasks/tasks/main.yml
+++ b/roles/pre_tasks/tasks/main.yml
@@ -21,13 +21,6 @@
global_bond_iface: "{{ iface_name.stdout | trim }}"
global_bond_ip: "{{ ansible_host | default(inventory_hostname) }}"
-# - name: "Set `inventory_dir` equal to `playbook_dir`"
-# ansible.builtin.set_fact:
-# inventory_dir: "{{ playbook_dir }}"
-# when:
-# - inventory_dir is not defined
-# - playbook_dir is defined
-
- name: Set python vars
ansible.builtin.set_fact:
python_name: "{{ (ansible_python_interpreter | default(discovered_interpreter_python)) | basename }}"
diff --git a/roles/pre_tasks/tasks/os/openEuler.yml b/roles/pre_tasks/tasks/os/openEuler.yml
new file mode 100644
index 0000000000000000000000000000000000000000..43bbd8af297f036daf11bcb08fdf88dec9ae0882
--- /dev/null
+++ b/roles/pre_tasks/tasks/os/openEuler.yml
@@ -0,0 +1,6 @@
+- name: "Replace sources mirror with {{ global_pkg_mirror }}"
+ ansible.builtin.replace:
+ path: "/etc/yum.repos.d/openEuler.repo"
+ regexp: "http(s|)://repo.openeuler.org"
+ replace: "{{ global_pkg_mirror }}/openeuler"
+ when: "global_pkg_mirror is defined"