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"