diff --git a/.gitignore b/.gitignore index 7b9c30c8c0a08148cdeb52f501a2a408fd516841..36bd50c5974888212ddb4d87ceb5f3286dd79c22 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ downloaded_files inventories/opengauss/credentials inventories/opengauss/assembled_vars +inventories/opengauss/report* vagrant/.vagrant vagrant/packer_cache -vagrant/output* \ No newline at end of file +vagrant/output* +log \ No newline at end of file diff --git a/01-deploy.yml b/01-deploy.yml index 2f0de54ea5641b054584e461615b9e5429e0d280..dc2c37108dfaf32620e2d3b3183e663177ddff99 100644 --- a/01-deploy.yml +++ b/01-deploy.yml @@ -1,8 +1,8 @@ # code: language=ansible - name: Deploy openGauss - hosts: openGauss + hosts: opengauss become: true become_flags: "-i" roles: - - openGauss \ No newline at end of file + - opengauss \ No newline at end of file diff --git a/README.md b/README.md index 403ba1fc323a0b7d4fd05988f745235c92504740..505c674354ca324980328cb674f65810c5061508 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ # 已适配的 openGauss 版本 +* 5.1.0 * 5.0.0 # 优势特点 @@ -57,6 +58,7 @@ # 更新日志 * 2023-10-13: 支持集群扩容。 +* 2023-10-18: 支持 openEuler 20.03 LTS SP3。 # 开发指南 diff --git a/ansible.cfg b/ansible.cfg index 6b038f562135cac635b63e2e7c8fab450e3682bd..b38abadda75ec7db03fd12b6ebe6a351abe40d90 100644 --- a/ansible.cfg +++ b/ansible.cfg @@ -9,6 +9,9 @@ pipelining = True become = True host_key_checking = False deprecation_warnings = False -callback_whitelist = profile_tasks +callback_whitelist = profile_tasks,log_plays display_skipped_hosts = False #stdout_callback = yaml + +[callback_log_plays] +log_folder = ./log/ \ No newline at end of file diff --git a/docs/00-how-to.md b/docs/00-how-to.md index 65a76b14064568d23fd6b21efb5a03556fcaa3ff..b87f6e608a18192318009b52aa4fb5dc9485614a 100644 --- a/docs/00-how-to.md +++ b/docs/00-how-to.md @@ -1,5 +1,8 @@ -本文内容适合对熟悉 Ansible 的同学看。如果你对 Ansible 不了解,请看 [创建 Ansible 容器](01-ansible-in-docker.md),使用 docker 快速搭建一个可以运行本项目的 ansible 环境,降低对操作系统的依赖。 +本文内容适合对熟悉 Ansible 的同学看。 +如果你对 Ansible 不了解,请看 [创建 Ansible 容器](01-ansible-in-docker.md),使用 docker 快速搭建一个可以运行本项目的 ansible 环境,降低对操作系统的依赖。 + +***整个说明文档里所提到的文件目录,均以 Ansible 容器环境内为例,不再另外说明。*** # hosts.ini 示例 @@ -15,7 +18,7 @@ master 组仅可以配置 1 台机器。follower 可以多台。cascade 可选 [opengauss_cascade] 192.168.56.13 -[openGauss:children] +[opengauss:children] opengauss_master opengauss_follower opengauss_cascade @@ -25,17 +28,34 @@ opengauss_cascade ``` - name: Deploy openGauss - hosts: openGauss + hosts: opengauss become: true become_flags: "-i" roles: - - openGauss + - opengauss ``` # 效果展示 -本地物理机,启动 6 台虚拟机,用时 9 分 30 秒完成 1 主 4 从 1 级联的架构部署。 +## 物理环境 + +* Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz × 2 +* 12GB×8, DDR3 1333 +* WD40EZAZ-00S 单块 SATA 磁盘 + +## 虚拟机环境 + + * VirtualBox 7.0 + * 4vCPU + 4GB RAM 虚拟机共 9 台 + * openEuler release 20.03 (LTS-SP3) + +## 最终部署效果 + +1 主 2 备 2 级联,耗时 15 分钟(安装包已下载的前提下)。 + +![deploy](imgs/23-10-26_1187_866.png) + -![用时](imgs/23-09-20_1243_661.png) +从上图的架构,扩容为 1 主 4 备 4 级联,耗时 21 分钟。 -![集群状态](imgs/23-09-20_923_628.png) \ No newline at end of file +![expansion](imgs/23-10-26_1190_1072.png) \ No newline at end of file diff --git a/docs/02-pre-set.md b/docs/02-pre-set.md index b2bb130327bb0ca53e9750e19d1ec1526a7e157e..43c4380b83941e2bd0e630f38944356efa6eda15 100644 --- a/docs/02-pre-set.md +++ b/docs/02-pre-set.md @@ -1,6 +1,6 @@ # 执行 playbook 之前的准备工作。 -## 修改 `ansible-docker\inventories\opengauss\hosts.ini` 文件 +## 修改 `/workdir/inventories/opengauss/hosts.ini` 文件 这个文件是对你要部署的机器,进行一个分组编排,以及 ssh 信息填写。以 1 主 1 从 1 级联的架构为例,它的内容如下: @@ -18,13 +18,13 @@ 192.168.56.13 ; 以上 3 个分组的合并组,勿动。 -[openGauss:children] +[opengauss:children] opengauss_master opengauss_follower opengauss_cascade ; 机器的 SSH 信息,请根据你的实际情况修改。 -[openGauss:vars] +[opengauss:vars] ; ssh 用户名,如果不是 root 用户,请确保它有 sudo 权限。 ansible_ssh_user=vagrant ; ssh 密码 @@ -35,9 +35,11 @@ ansible_ssh_port=22 ## 修改默认运行值。 -本项目的默认配置参数,存放在 `roles\openGauss\defaults\main.yml`,你可以参考这个文件的内容,根据实际需要做一些定制。*** 但不建议直接修改它,以考虑对不同的服务器仓库进行维护 *** +本项目的默认配置参数,存放在 `/workdir/roles/opengauss/defaults/main.yml`,你可以参考这个文件的内容,根据实际需要做一些定制。 -建议的自定义方法,是将 `roles\openGauss\defaults\main.yml` 拷贝到 `ansible-docker\inventories\opengauss\group_vars\openGauss.yml`,再进行编辑。 +***但不建议直接修改它,以考虑对不同的服务器仓库进行维护。*** + +建议的自定义方法,是将 `/workdir/roles/opengauss/defaults/main.yml` 拷贝到 `/workdir/inventories/opengauss/group_vars/opengauss.yml`,再进行编辑。 部分变量是可以替换或扩展的。例如 @@ -58,7 +60,7 @@ opengauss_sysctl: net.ipv4.tcp_synack_retries: 5 ``` -通过 `roles\pre-tasks\tasks\vars_combine.yml` 的处理后,我们可以得到一组合并后的变量 +通过 `roles/pre-tasks/tasks/vars_combine.yml` 的处理后,我们可以得到一组合并后的变量 ``` combined_vars: @@ -72,6 +74,6 @@ combined_vars: # 使用自定义的 cluster_config.xml -如果你需要手动定制集群,这里也是支持的,只需要把写好的 `cluster_config.xml` 改名为 `cluster_config.xml.j2`,存放到 `ansible-docker/inventories/opengauss/templates/cluster_config.xml.j2`,部署时会优先使用你的自定义配置。 +如果你需要手动定制集群,这里也是支持的,只需要把写好的 `cluster_config.xml` 改名为 `cluster_config.xml.j2`,存放到 `/workdir/inventories/opengauss/templates/cluster_config.xml.j2`,部署时会优先使用你的自定义配置。 接下来就可以[开始部署](03-deploy.md) \ No newline at end of file diff --git a/docs/03-deploy.md b/docs/03-deploy.md index 17f8b6cc7617596686a9976ea7d2c2a44f7cc4b6..764b302f846bcc5cf1012abdf43edf680957705e 100644 --- a/docs/03-deploy.md +++ b/docs/03-deploy.md @@ -27,10 +27,10 @@ 这里的 `pansible` 是我预置的命令别名,对应的是 `ansible-playbook`。 -1. 部署过程中自动生成的公私钥,以及账号密码,存放在 `ansible-docker/inventories/opengauss/credentials` +1. 部署过程中自动生成的公私钥,以及账号密码,存放在 `/workdir/inventories/opengauss/credentials` ``` - ls -l ansible-docker/inventories/opengauss/credentials/ + ls -l /workdir/inventories/opengauss/credentials/ total 24 -rw------- 1 root root 387 9月24日 14:24 opengauss_id_om -rw-r--r-- 1 root root 82 9月24日 14:24 opengauss_id_om.pub @@ -40,6 +40,10 @@ -rw------- 1 root root 17 9月24日 13:36 opengauss_root_pass ``` +1. 最后生成部署报告文件,存放在 `/workdir/inventories/opengauss/report.md` + + ![Report](imgs/23-10-26_972_1236.png) + # 顺利部署后,你可看到一下输出内容 ## 单节点 @@ -56,15 +60,15 @@ [opengauss_cascade] -[openGauss:children] +[opengauss:children] opengauss_master opengauss_follower opengauss_cascade ``` -## 1 主 1 从 +## 1 主 1 备 -![1主1从](imgs/1695614019287.png) +![1主1备](imgs/1695614019287.png) 对应的 hosts.ini 分组编排内容 @@ -77,15 +81,15 @@ opengauss_cascade [opengauss_cascade] -[openGauss:children] +[opengauss:children] opengauss_master opengauss_follower opengauss_cascade ``` -## 1 主 1 从 1 级联 +## 1 主 1 备 1 级联 -![1主1从1级联](imgs/1695614019263.png) +![1主1备1级联](imgs/1695614019263.png) 对应的 hosts.ini 分组编排内容 @@ -99,15 +103,15 @@ opengauss_cascade [opengauss_cascade] 192.168.56.16 -[openGauss:children] +[opengauss:children] opengauss_master opengauss_follower opengauss_cascade ``` -## 1 主 2 从 +## 1 主 2 备 -![1主2从](imgs/1695614019240.png) +![1主2备](imgs/1695614019240.png) 对应的 hosts.ini 分组编排内容 @@ -121,7 +125,7 @@ opengauss_cascade [opengauss_cascade] -[openGauss:children] +[opengauss:children] opengauss_master opengauss_follower opengauss_cascade diff --git a/docs/04-expansion.md b/docs/04-expansion.md index 36605b23989ea500943d876d7440cf3139513f0d..40ff58c93c0952c28f7acc68edf82148ca77784e 100644 --- a/docs/04-expansion.md +++ b/docs/04-expansion.md @@ -1,12 +1,12 @@ # 集群扩容 -*** !!!注意!!! *** +***!!!注意!!!*** -*** 扩容有风险,操作前请仔细阅读 https://docs.opengauss.org/zh/docs/5.0.0/docs/ToolandCommandReference/gs_expansion.html *** +***实验功能,切勿在生产环境中使用。*** -*** 仅建议在部署初期,数据量小的情况下,使用本项目进行扩容。 *** +***扩容有风险,操作前请仔细阅读 https://docs.opengauss.org/zh/docs/5.0.0/docs/ToolandCommandReference/gs_expansion.html*** -## 修改 `ansible-docker\inventories\opengauss\hosts.ini` 文件 +## 修改 `/workdir/inventories/opengauss/hosts.ini` 文件 备机数量不可超过 8 台。 diff --git a/docs/imgs/23-09-20_1243_661.png b/docs/imgs/23-09-20_1243_661.png deleted file mode 100644 index 43095cdca0c4d90ce29f3c5977edf0f99014c790..0000000000000000000000000000000000000000 Binary files a/docs/imgs/23-09-20_1243_661.png and /dev/null differ diff --git a/docs/imgs/23-09-20_923_628.png b/docs/imgs/23-09-20_923_628.png deleted file mode 100644 index f7c7306fd3c306f7fe5c22ad2400a325f757ea39..0000000000000000000000000000000000000000 Binary files a/docs/imgs/23-09-20_923_628.png and /dev/null differ diff --git a/docs/imgs/23-10-26_1187_866.png b/docs/imgs/23-10-26_1187_866.png new file mode 100644 index 0000000000000000000000000000000000000000..218b8cce2b02010740807d32ca9a2bdb28a9c075 Binary files /dev/null and b/docs/imgs/23-10-26_1187_866.png differ diff --git a/docs/imgs/23-10-26_1190_1072.png b/docs/imgs/23-10-26_1190_1072.png new file mode 100644 index 0000000000000000000000000000000000000000..0377b6835ccbf2816c9e008a9f9f3fd83f968dcb Binary files /dev/null and b/docs/imgs/23-10-26_1190_1072.png differ diff --git a/docs/imgs/23-10-26_972_1236.png b/docs/imgs/23-10-26_972_1236.png new file mode 100644 index 0000000000000000000000000000000000000000..8f2d0771d2296caf69d51fd85e8445d6a5b68cdc Binary files /dev/null and b/docs/imgs/23-10-26_972_1236.png differ diff --git a/inventories/opengauss/group_vars/all/defaults.yml b/inventories/opengauss/group_vars/all/defaults.yml deleted file mode 100644 index 0c13c88c4850ef39713cb2e4546dbe7534195546..0000000000000000000000000000000000000000 --- a/inventories/opengauss/group_vars/all/defaults.yml +++ /dev/null @@ -1 +0,0 @@ -# ansible_python_interpreter: "python3" \ No newline at end of file diff --git a/inventories/opengauss/group_vars/opengauss.yml b/inventories/opengauss/group_vars/opengauss.yml new file mode 100644 index 0000000000000000000000000000000000000000..d0f31c0d14758833c2a63cd0561aa6ddfa722671 --- /dev/null +++ b/inventories/opengauss/group_vars/opengauss.yml @@ -0,0 +1,3 @@ +# ansible_python_interpreter: "python3" + +opengauss_version: 5.0.0 diff --git a/inventories/opengauss/hosts.ini b/inventories/opengauss/hosts.ini index df3cb66121e45a432a2ff9b7c994e9b01ba8ffbc..12aa6e78e674b3638236ccbcbd628a2c867f1f0b 100644 --- a/inventories/opengauss/hosts.ini +++ b/inventories/opengauss/hosts.ini @@ -1,23 +1,40 @@ ; 主机,仅设置 1 个目标机。 [opengauss_master] -192.168.56.11 +192.168.56.17 ; 备机,可设置若干个或留空。不可大于 8。 [opengauss_follower] +192.168.56.11 +192.168.56.15 192.168.56.12 +192.168.56.13 ; 级联机,可设置若干个或留空。 [opengauss_cascade] -192.168.56.13 +192.168.56.19 +192.168.56.18 +192.168.56.16 +192.168.56.14 ; 以上 3 个分组的合并组,勿动。 -[openGauss:children] +[opengauss:children] +opengauss_master +opengauss_follower +opengauss_cascade + +; 同步复制节点分组 +[opengauss_sync_nodes:children] opengauss_master opengauss_follower + +; +; 备节点分组 +[opengauss_replica_nodes:children] opengauss_cascade +opengauss_follower ; 机器的 SSH 信息,请根据你的实际情况修改。 -[openGauss:vars] +[opengauss:vars] ; ssh 用户名,如果不是 root 用户,请确保它有 sudo 权限。 ansible_ssh_user=vagrant ; ssh 密码 diff --git a/roles/openGauss/meta/main.yml b/roles/openGauss/meta/main.yml deleted file mode 100644 index 4c3689d8406ab31181bc16cdf7b07c56665ab984..0000000000000000000000000000000000000000 --- a/roles/openGauss/meta/main.yml +++ /dev/null @@ -1,4 +0,0 @@ -dependencies: - - name: pre-tasks - tags: - - always \ No newline at end of file diff --git a/roles/openGauss/tasks/main.yml b/roles/openGauss/tasks/main.yml deleted file mode 100644 index df9b701debea28726a58a6e192a5b35c9faf6cd3..0000000000000000000000000000000000000000 --- a/roles/openGauss/tasks/main.yml +++ /dev/null @@ -1,66 +0,0 @@ ---- -# tasks file for openGauss - -- name: Tasks always run - tags: always - block: - - name: Combine vars - ansible.builtin.import_role: - name: "pre-tasks" - tasks_from: "vars_combine.yml" - - - name: Set runtime facts - ansible.builtin.import_tasks: runtime_facts.yml - -- name: Deploy cluster - block: - - name: Check cluster status - ansible.builtin.command: "gs_om -t status" - changed_when: false - become_user: "{{ og_user }}" - delegate_to: "{{ og_master }}" - run_once: true - - rescue: - - name: Start pre tasks - ansible.builtin.import_tasks: pre_tasks.yml - - - name: Start deploy - run_once: true - delegate_to: "{{ og_master }}" - ansible.builtin.import_tasks: deploy/main.yml - -- name: Expand cluster - block: - - name: Check node status - ansible.builtin.command: "gs_om -t status --detail -h {{ og_hostname }}" - changed_when: false - become_user: "{{ og_user }}" - delegate_to: "{{ og_master }}" - register: check_node - when: "inventory_hostname != og_master" - - rescue: - - name: Hosts below will be added into cluster - ansible.builtin.set_fact: - og_expansion: true - when: - - "check_node is defined" - - "check_node is failed" - - - name: Start pre tasks - ansible.builtin.import_tasks: pre_tasks.yml - - - name: Start deploy - run_once: true - delegate_to: "{{ og_master }}" - ansible.builtin.import_tasks: deploy/main.yml - -- name: Run post tasks - ansible.builtin.import_tasks: post_tasks.yml - -- name: Generate reports - ansible.builtin.import_tasks: report.yml - tags: - - never - - report diff --git a/roles/openGauss/tasks/os/user.yml b/roles/openGauss/tasks/os/user.yml deleted file mode 100644 index cdcd6f44c4b97a11ae6ed49762736a1c380a173a..0000000000000000000000000000000000000000 --- a/roles/openGauss/tasks/os/user.yml +++ /dev/null @@ -1,26 +0,0 @@ -- name: "Create group '{{ og_group }}'" - group: - name: "{{ og_group }}" - -- name: "Create user '{{ og_user }}'" - user: - name: "{{ og_user }}" - group: "{{ og_group }}" - shell: "/bin/bash" - password: "{{ og_user_pass }}" - update_password: on_create - -- name: "Fix home permission in some cases" - file: - path: "/home/{{ og_user }}" - state: directory - owner: "{{ og_user }}" - group: "{{ og_group }}" - recurse: true - -- name: "Touch /home/{{ og_user }}/.bashrc" - file: - path: "/home/{{ og_user }}/.bashrc" - state: touch - owner: "{{ og_user }}" - group: "{{ og_group }}" \ No newline at end of file diff --git a/roles/openGauss/templates/cluster_config.xml.j2 b/roles/openGauss/templates/cluster_config.xml.j2 deleted file mode 100644 index ed6f4d75bcfbef2bebf38b5c5b0fe2a19b6d00e4..0000000000000000000000000000000000000000 --- a/roles/openGauss/templates/cluster_config.xml.j2 +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - -{% for node in og_all_nodes %} - - - - - - -{% if node in groups['opengauss_master'] %} - {% if (groups['openGauss'] | count) > 2 %} - - - - - - - - - - {% endif %} - - - - - - -{% endif %} - -{% - if node not in groups['opengauss_master'] - and (groups['openGauss'] | count) > 2 -%} - - - - - - {% if node in groups['opengauss_cascade'] %} - - {% endif %} -{% endif %} - -{% endfor %} - - - diff --git a/roles/openGauss/README.md b/roles/opengauss/README.md similarity index 91% rename from roles/openGauss/README.md rename to roles/opengauss/README.md index a3b44f93b3ec8efc1f1a23fc9291c8fc2e325eac..660ff95b0bc156d198cd99d2d3e49d95fd5b8645 100644 --- a/roles/openGauss/README.md +++ b/roles/opengauss/README.md @@ -8,7 +8,7 @@ 1. 1 主 4 从 1 级联的架构,十分钟内部署完成(不含安装包的下载时间)。 1. 自动匹配 CPU 架构以及操作系统。 -1. 支持自定义 cluster_config.xml.j2 模板,优先使用 `{{ inventory_dir }}/templates/openGauss/cluster_config.xml.j2`。 +1. 支持自定义 cluster_config.xml.j2 模板,优先使用 `{{ inventory_dir }}/templates/opengauss/cluster_config.xml.j2`。 1. 默认自动生成数据库管理员密码,也可自定义变量进行替换。全程自动化,无交互步骤。 1. 部署完成后,从 `/root/.ssh/authorized_keys` 里移除相关公钥,而非删除 `/root/.ssh` 目录。 1. 本地生成的公密钥、账号密码,均存放在 `{{ inventory_dir }}/credentials` 目录内。 @@ -22,7 +22,7 @@ user_group: dbgrp ``` - 自定义变量文件 `{{ inventory_dir }}/group_vars/openGauss.yml` + 自定义变量文件 `{{ inventory_dir }}/group_vars/opengauss.yml` ``` opengauss_env: @@ -57,7 +57,7 @@ master 组仅可以配置 1 台机器。follower 可以多台。cascade 可选 [opengauss_cascade] 192.168.56.13 -[openGauss:children] +[opengauss:children] opengauss_master opengauss_follower opengauss_cascade @@ -67,7 +67,7 @@ opengauss_cascade ``` - name: Deploy openGauss database - hosts: openGauss + hosts: opengauss become: true roles: - openGauss diff --git a/roles/openGauss/defaults/main.yml b/roles/opengauss/defaults/main.yml similarity index 63% rename from roles/openGauss/defaults/main.yml rename to roles/opengauss/defaults/main.yml index 127f79ef47675e5da210b5d2339d2c86eda06081..b71fc4f2f9e043bd84e075225f2879cf7b0b91cb 100644 --- a/roles/openGauss/defaults/main.yml +++ b/roles/opengauss/defaults/main.yml @@ -7,10 +7,14 @@ opengauss_version: 5.0.0 # 安装目录 opengauss_home: /opt/openGauss -# 其它目录,对应 cluster_config.xml 的内容。具体请看 https://docs.opengauss.org/zh/docs/{{ opengauss_version }}/docs/InstallationGuide/%E5%88%9B%E5%BB%BAXML%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6.html +# 是否禁用 bash history。生产环境请设为 true,测试环境为 false。 +og_disable_history: false + +# 其它目录,对应 cluster_config.xml 的内容。 +# 具体请看 https://docs.opengauss.org/zh/docs/{{ opengauss_version }}/docs/InstallationGuide/%E5%88%9B%E5%BB%BAXML%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6.html opengauss_paths: gaussdbAppPath: "{{ opengauss_home }}/install/app" - gaussdbLogPath: "/var/log/openGauss" + gaussdbLogPath: "/var/log/" tmpMppdbPath: "{{ opengauss_home }}/tmp" corePath: "{{ opengauss_home }}/corefile" gaussdbToolPath: "{{ opengauss_home }}/install/om" @@ -20,18 +24,36 @@ opengauss_paths: opengauss_env: user_name: omm user_group: dbgrp - user_pass: "{{ lookup('password', inventory_dir + '/credentials/opengauss_omm_pass', chars=['ascii_letters', 'digits']) | password_hash }}" + user_pass: >- + {{ + lookup( + 'password', + inventory_dir + '/credentials/opengauss_omm_pass', + chars=['ascii_letters', 'digits', 'punctuation'], + length=8 + ) | password_hash + }} iface_mtu: 8192 clusterName: openGauss dataPortBase: 15400 cmServerPortBase: 15300 - cmServerPortStandby: 15500 azName: AZ1 + swap_off: true # 关闭 swap + syncNum: 0 # dataNode1_syncNum + # locale: SQL_ASCII # 数据库安装配置 opengauss_db_set: locale: en_US.utf8 - root_pass: "{{ lookup('password', inventory_dir + '/credentials/opengauss_root_pass', chars=['ascii_letters', 'digits'], length=16) }}" + root_pass: >- + {{ + lookup( + 'password', + inventory_dir + '/credentials/opengauss_root_pass', + chars=['ascii_letters', 'digits', 'hexdigits'], + length=16 + ) + }} # Sysctl 的配置,可自行扩展。 # 参考官方文档->初始化安装环境->配置操作系统参数 @@ -60,5 +82,11 @@ opengauss_download: openeuler_20: "{{ ogengauss_dl_server }}/{{ opengauss_version }}/x86_openEuler/openGauss-{{ opengauss_version }}-openEuler-64bit-all.tar.gz" centos_7: "{{ ogengauss_dl_server }}/{{ opengauss_version }}/x86/openGauss-{{ opengauss_version }}-CentOS-64bit-all.tar.gz" -# 初始化 og_expansion 值 +# 默认初始值 +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_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 similarity index 100% rename from roles/openGauss/handlers/main.yml rename to roles/opengauss/handlers/main.yml diff --git a/roles/opengauss/meta/main.yml b/roles/opengauss/meta/main.yml new file mode 100644 index 0000000000000000000000000000000000000000..a5678ae841f86e0b856ab6403bdcd37f33913512 --- /dev/null +++ b/roles/opengauss/meta/main.yml @@ -0,0 +1,13 @@ +galaxy_info: + author: haibin.l@linkingcloud.com + description: openGauss auto deploy + company: https://linkingcloud.cn/ + + license: MulanPSL-2.0 + + min_ansible_version: "2.1" + +dependencies: + - name: pre_tasks + tags: + - always diff --git a/roles/openGauss/tasks/deploy/add_auth.yml b/roles/opengauss/tasks/deploy/add_auth.yml similarity index 100% rename from roles/openGauss/tasks/deploy/add_auth.yml rename to roles/opengauss/tasks/deploy/add_auth.yml diff --git a/roles/opengauss/tasks/deploy/cluster_check.yml b/roles/opengauss/tasks/deploy/cluster_check.yml new file mode 100644 index 0000000000000000000000000000000000000000..3bdad597d8f45c417a864ce242393f44e3545853 --- /dev/null +++ b/roles/opengauss/tasks/deploy/cluster_check.yml @@ -0,0 +1,50 @@ +- name: Check cluster status + block: + - name: "Query cluster detail" + ansible.builtin.command: >- + gs_om -t status --detail + changed_when: false + register: cluster_detail + become_user: "{{ og_user }}" + delegate_to: "{{ og_master }}" + run_once: true + + rescue: + - name: Start pre tasks + ansible.builtin.import_tasks: + file: pre_tasks.yml + become_user: root + + - name: Start deploy + ansible.builtin.import_tasks: + file: deploy/main.yml + delegate_to: "{{ og_master }}" + run_once: true + +- 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 + ansible.builtin.include_tasks: + file: pre_tasks.yml + when: + - "groups['opengauss_expand'] is defined" + - "inventory_hostname in groups['opengauss_expand']" + + - name: Start expansion + ansible.builtin.import_tasks: + file: expansion.yml + vars: + og_expansion: true + delegate_to: "{{ og_master }}" + when: "groups['opengauss_expand'] is defined" + run_once: true diff --git a/roles/opengauss/tasks/deploy/expansion.yml b/roles/opengauss/tasks/deploy/expansion.yml new file mode 100644 index 0000000000000000000000000000000000000000..af64d2b1c21983cfac460a2dbe46e259688ccadd --- /dev/null +++ b/roles/opengauss/tasks/deploy/expansion.yml @@ -0,0 +1,118 @@ +- 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 similarity index 33% rename from roles/openGauss/tasks/deploy/install.yml rename to roles/opengauss/tasks/deploy/install.yml index 6f76ace3f3a4efbf5a5e0ee58268eae3e60f0ce6..b49ab6072f9c8273b13565b151e8ef7e695553bb 100644 --- a/roles/openGauss/tasks/deploy/install.yml +++ b/roles/opengauss/tasks/deploy/install.yml @@ -4,56 +4,44 @@ dest: "{{ og_upload_path }}/cluster_config.xml" owner: "{{ og_user }}" group: "{{ og_group }}" - mode: "0600" + mode: "0644" backup: true lstrip_blocks: true with_first_found: - "{{ inventory_dir }}/templates/cluster_config.xml.j2" - "cluster_config.xml.j2" -- debug: - msg: "{{ og_expansion }}" - - name: First time deploy when: "not og_expansion" block: - name: Starting pre install - ansible.builtin.command: "python3 gs_preinstall -U {{ og_user }} -G {{ og_group }} -X {{ og_upload_path }}/cluster_config.xml --non-interactive" + 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 - args: - chdir: "{{ og_upload_path }}/script" - name: Deploy openGauss - ansible.builtin.shell: | - . /home/{{ og_user }}/.bashrc && \ - python3 gs_install \ + ansible.builtin.command: >- + gs_install \ -X {{ og_upload_path }}/cluster_config.xml \ - --gsinit-parameter="--pwpasswd={{ combined_vars.opengauss_db_set.root_pass }}" + --gsinit-parameter="--pwpasswd={{ og_db_pass }}" \ + --gsinit-parameter="--locale={{ og_locale }}" changed_when: false - args: - chdir: "{{ og_home }}/install/om/script" become_user: "{{ og_user }}" + become_flags: "-i" -- name: Expand cluster - when: "og_expansion" - block: - - name: Get cluster status detail - ansible.builtin.command: "gs_om -t status --detail" - changed_when: false - become_user: "{{ og_user }}" - register: cluster_status +- name: Starting expand + ansible.builtin.shell: | + . /home/{{ og_user }}/.bashrc - - name: Starting expand - ansible.builtin.shell: >- - . /home/{{ og_user }}/.bashrc && - python3 gs_expansion -U {{ og_user }} -G {{ og_group }} -X {{ og_upload_path }}/cluster_config.xml -h {{ expansion_list }} - args: - chdir: "{{ og_upload_path }}/script" - vars: - expansion_list: >- - {%- for node in og_all_nodes - if node not in cluster_status.stdout - -%} - {{ node }}{{ (loop.nextitem is defined) | ternary(',', '') }} - {%- endfor -%} - changed_when: false + {{ 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 similarity index 93% rename from roles/openGauss/tasks/deploy/known_hosts.yml rename to roles/opengauss/tasks/deploy/known_hosts.yml index 5d4d0167a3e1d7a2acbc18fffe293608e04108f5..286b335d1cfe3dcf8445980f79302690ecbbd357 100644 --- a/roles/openGauss/tasks/deploy/known_hosts.yml +++ b/roles/opengauss/tasks/deploy/known_hosts.yml @@ -1,4 +1,4 @@ -- name: "Update known_hosts" +- name: "Update .ssh/known_hosts" ansible.builtin.blockinfile: path: "{{ og_ssh.home }}/.ssh/known_hosts" owner: "{{ og_ssh.user }}" diff --git a/roles/openGauss/tasks/deploy/main.yml b/roles/opengauss/tasks/deploy/main.yml similarity index 43% rename from roles/openGauss/tasks/deploy/main.yml rename to roles/opengauss/tasks/deploy/main.yml index 620b7210984d94aeca5b095cf7991705c91e0700..b7ed008ba32daf1f85843e45dcc4ec072decd48f 100644 --- a/roles/openGauss/tasks/deploy/main.yml +++ b/roles/opengauss/tasks/deploy/main.yml @@ -1,5 +1,6 @@ - name: Scan hosts key - ansible.builtin.command: "ssh-keyscan -p {{ host_port }} {{ node }},og{{ node | ipaddr('int') }}" + ansible.builtin.command: >- + ssh-keyscan -p {{ host_port }} {{ node }},og{{ node | ipaddr('int') }} changed_when: false loop: "{{ og_all_nodes }}" loop_control: @@ -9,7 +10,8 @@ register: known_host_keys - name: Config known hosts - ansible.builtin.include_tasks: deploy/known_hosts.yml + ansible.builtin.include_tasks: + file: deploy/known_hosts.yml with_items: - user: root group: root @@ -21,19 +23,27 @@ loop_var: og_ssh - name: Config authorized keys - ansible.builtin.include_tasks: deploy/add_auth.yml + ansible.builtin.include_tasks: + file: deploy/add_auth.yml loop: "{{ og_all_nodes }}" loop_control: loop_var: node -- name: Check gs_om command - ansible.builtin.shell: "which gs_om || echo 'not installed'" - changed_when: false - register: gs_com_st +- name: Starting deploy or expand + delegate_to: "{{ og_master }}" + block: + - name: Check gs_om command + ansible.builtin.command: + cmd: which gs_om + become_user: "{{ og_user }}" + changed_when: false -- name: Upload packages - ansible.builtin.import_tasks: deploy/upload.yml - when: "'not installed' in gs_com_st.stdout_lines" + rescue: + - name: Upload packages + ansible.builtin.import_tasks: + file: deploy/upload.yml -- name: Start install - ansible.builtin.import_tasks: deploy/install.yml + always: + - name: In progressing + ansible.builtin.import_tasks: + file: deploy/install.yml diff --git a/roles/openGauss/tasks/deploy/upload.yml b/roles/opengauss/tasks/deploy/upload.yml similarity index 66% rename from roles/openGauss/tasks/deploy/upload.yml rename to roles/opengauss/tasks/deploy/upload.yml index 59c97d420c7e5b5ddc786c6a7d58a437deaea8d3..cc2145bff05a0b4df4a1d525230d9841360dbd5f 100644 --- a/roles/openGauss/tasks/deploy/upload.yml +++ b/roles/opengauss/tasks/deploy/upload.yml @@ -6,16 +6,25 @@ state: directory mode: "0755" - - name: "Extracting {{ og_pkg_url | basename }}" + - name: "Uploading {{ og_pkg_name }}" ansible.builtin.unarchive: - src: "{{ playbook_dir }}/downloaded_files/{{ og_pkg_url | basename }}" + src: "{{ playbook_dir }}/downloaded_files/{{ og_pkg_name }}" dest: "{{ og_upload_path }}/" + list_files: true + creates: "{{ og_upload_path }}/version.cfg" + register: og_upload - - name: "Extracting {{ og_pkg_url | basename | replace('all', 'om') }}" + - name: "Extracting om tar file" ansible.builtin.unarchive: remote_src: true - src: "{{ og_upload_path }}/{{ og_pkg_url | basename | replace('all', 'om') }}" + src: "{{ og_upload_path }}/{{ file }}" dest: "{{ og_upload_path }}/" + creates: "{{ og_upload_path }}/script/gs_om" + loop: "{{ og_upload.files | default([]) }}" + loop_control: + loop_var: file + when: + - "'om.tar.gz' in file" rescue: - name: "Get {{ og_pkg_url }}" @@ -32,7 +41,7 @@ - name: Downloading ansible.builtin.get_url: url: "{{ og_pkg_url }}" - dest: "{{ playbook_dir }}/downloaded_files/{{ og_pkg_url | basename }}" + dest: "{{ playbook_dir }}/downloaded_files/{{ og_pkg_name }}" mode: "0644" - name: Repeat tasks diff --git a/roles/opengauss/tasks/main.yml b/roles/opengauss/tasks/main.yml new file mode 100644 index 0000000000000000000000000000000000000000..e52c96df099f58f30c43d33fef839ff41551df47 --- /dev/null +++ b/roles/opengauss/tasks/main.yml @@ -0,0 +1,51 @@ +--- +# tasks file for openGauss + +- name: Tasks always run + tags: always + block: + - name: Combine vars + ansible.builtin.import_role: + name: "pre_tasks" + tasks_from: "vars_combine.yml" + + - name: Set runtime facts + ansible.builtin.import_tasks: runtime_facts.yml + + - name: Check cluster status + 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: 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: Start deploy + # ansible.builtin.import_tasks: + # file: deploy/main.yml + # delegate_to: "{{ og_master }}" + # run_once: true + + always: + - name: Run 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 similarity index 100% rename from roles/openGauss/tasks/os/CentOS.yml rename to roles/opengauss/tasks/os/CentOS.yml diff --git a/roles/openGauss/tasks/os/Debian.yml b/roles/opengauss/tasks/os/Debian.yml similarity index 100% rename from roles/openGauss/tasks/os/Debian.yml rename to roles/opengauss/tasks/os/Debian.yml diff --git a/roles/openGauss/tasks/os/RedHat.yml b/roles/opengauss/tasks/os/RedHat.yml similarity index 100% rename from roles/openGauss/tasks/os/RedHat.yml rename to roles/opengauss/tasks/os/RedHat.yml diff --git a/roles/openGauss/tasks/os/common_set.yml b/roles/opengauss/tasks/os/common_set.yml similarity index 74% rename from roles/openGauss/tasks/os/common_set.yml rename to roles/opengauss/tasks/os/common_set.yml index 058df6c740996fc8715afbdbb5bb02226dafc66e..db7c9707b23af4e781d806fa4f6639542a507459 100644 --- a/roles/openGauss/tasks/os/common_set.yml +++ b/roles/opengauss/tasks/os/common_set.yml @@ -37,6 +37,7 @@ line: "HISTSIZE=0" regex: "^HISTSIZE=" backup: true + when: "og_disable_history" - name: Install dependencies ansible.builtin.package: @@ -87,10 +88,38 @@ changed_when: false register: backiface -- name: "The backIp1's is {{ backiface.stdout | trim }}" +- name: "Set og_back_iface name" ansible.builtin.set_fact: og_back_iface: "{{ backiface.stdout | trim }}" - name: "Set MTU on the fly: {{ combined_vars.opengauss_env.iface_mtu }}" ansible.builtin.command: "ifconfig {{ og_back_iface }} mtu {{ combined_vars.opengauss_env.iface_mtu }}" changed_when: false + +- name: Disable swap + when: + - "combined_vars.opengauss_env.swap_off" + - "ansible_swaptotal_mb > 0" + block: + - name: Find swap line in /etc/fstab + ansible.builtin.shell: + cmd: | + set -o pipefail && + grep 'swap' /etc/fstab | grep -v '^#' + changed_when: false + register: swap_st + + - name: Disable swap in /etc/fstab + ansible.builtin.replace: + path: /etc/fstab + regexp: "^{{ line }}" + replace: "#{{ line }}" + loop: "{{ swap_st.stdout_lines }}" + loop_control: + loop_var: line + when: "swap_st.stdout_lines is truthy" + + - name: Disable swap by command + ansible.builtin.command: + swapoff -a + changed_when: false diff --git a/roles/openGauss/tasks/os/not_supported.yml b/roles/opengauss/tasks/os/not_supported.yml similarity index 100% rename from roles/openGauss/tasks/os/not_supported.yml rename to roles/opengauss/tasks/os/not_supported.yml diff --git a/roles/openGauss/tasks/os/openEuler.yml b/roles/opengauss/tasks/os/openEuler.yml similarity index 100% rename from roles/openGauss/tasks/os/openEuler.yml rename to roles/opengauss/tasks/os/openEuler.yml diff --git a/roles/openGauss/tasks/os/ssh.yml b/roles/opengauss/tasks/os/ssh.yml similarity index 68% rename from roles/openGauss/tasks/os/ssh.yml rename to roles/opengauss/tasks/os/ssh.yml index c95055121cb220366091229262b30fbf4d78934d..b2e56b33d3f649f470df600d4209727ea40d5c74 100644 --- a/roles/openGauss/tasks/os/ssh.yml +++ b/roles/opengauss/tasks/os/ssh.yml @@ -1,18 +1,18 @@ - name: Config ssh on host block: - - name: "Create {{ og_ssh.home }}/.ssh" - file: + - name: "Create '.ssh' under {{ og_ssh.home }}" + ansible.builtin.file: path: "{{ og_ssh.home }}/.ssh" state: directory - mode: 0700 + mode: "0700" owner: "{{ og_ssh.user }}" group: "{{ og_ssh.group }}" - name: Upload ssh keys - copy: + ansible.builtin.copy: src: "{{ og_key }}" dest: "{{ og_ssh.home }}/.ssh/{{ og_key | basename | replace('opengauss_', '') }}" - mode: 0400 + mode: "0400" owner: "{{ og_ssh.user }}" group: "{{ og_ssh.group }}" backup: true @@ -24,28 +24,28 @@ register: keys_list - name: Failed when no keys founded - fail: + ansible.builtin.fail: msg: "SSH keys not existed" when: "keys_list.skipped" - # - name: Add authorized key - # authorized_key: - # user: "{{ og_ssh.user }}" - # state: present - # key: "{{ lookup('file', pub_key) }}" - # with_fileglob: - # - "{{ inventory_dir }}/credentials/opengauss_id*.pub" - # loop_control: - # loop_var: pub_key - # label: "{{ og_ssh.home }}/.ssh/{{ pub_key | basename | replace('opengauss_', '') }}" + - name: Permit root login + ansible.builtin.lineinfile: + path: /etc/ssh/sshd_config + regexp: "^PermitRootLogin" + line: "PermitRootLogin yes" + backup: true rescue: - name: Generate ssh keys + delegate_to: localhost + become: false + run_once: true block: - - name: "Create {{ inventory_dir }}/credentials" - file: + - name: "Create local path 'credentials' under {{ inventory_dir }}" + ansible.builtin.file: path: "{{ inventory_dir }}/credentials" state: directory + mode: "0755" - name: Generate opengauss_id_om openssh_keypair: @@ -57,8 +57,8 @@ openssh_keypair: path: "{{ inventory_dir }}/credentials/opengauss_id_rsa" regenerate: never - delegate_to: localhost - become: false - run_once: true - - include_tasks: os/ssh.yml \ No newline at end of file + + - name: Repeat tasks + ansible.builtin.include_tasks: + file: os/ssh.yml diff --git a/roles/opengauss/tasks/os/user.yml b/roles/opengauss/tasks/os/user.yml new file mode 100644 index 0000000000000000000000000000000000000000..21c6d7d503bf3a2eb4299e38a8b50442b0543886 --- /dev/null +++ b/roles/opengauss/tasks/os/user.yml @@ -0,0 +1,30 @@ +- name: Create user on each node + delegate_to: "{{ node }}" + block: + - name: "Create group '{{ og_group }}'" + ansible.builtin.group: + name: "{{ og_group }}" + + - name: "Create user '{{ og_user }}'" + ansible.builtin.user: + name: "{{ og_user }}" + group: "{{ og_group }}" + shell: "/bin/bash" + password: "{{ og_user_pass }}" + update_password: on_create + + - name: "Fix home permission in some cases" + ansible.builtin.file: + path: "/home/{{ og_user }}" + state: directory + owner: "{{ og_user }}" + group: "{{ og_group }}" + recurse: true + + - name: "Create .bashrc under /home/{{ og_user }}" + ansible.builtin.file: + path: "/home/{{ og_user }}/.bashrc" + state: touch + owner: "{{ og_user }}" + group: "{{ og_group }}" + mode: "0644" diff --git a/roles/openGauss/tasks/post_tasks.yml b/roles/opengauss/tasks/post_tasks.yml similarity index 79% rename from roles/openGauss/tasks/post_tasks.yml rename to roles/opengauss/tasks/post_tasks.yml index 1d165c9b24f6dae82b59e6825aedcbcf0b3f956c..026d3e71910e84bc7f4a8640f247890910b63511 100644 --- a/roles/openGauss/tasks/post_tasks.yml +++ b/roles/opengauss/tasks/post_tasks.yml @@ -29,3 +29,11 @@ ansible.builtin.debug: msg: | {{ cluster_status.stdout_lines }} + + - name: "Create report.md in {{ inventory_dir }}" + ansible.builtin.template: + src: report.md.j2 + dest: "{{ inventory_dir }}/report.md" + mode: "0644" + delegate_to: localhost + become: false diff --git a/roles/openGauss/tasks/pre_tasks.yml b/roles/opengauss/tasks/pre_tasks.yml similarity index 77% rename from roles/openGauss/tasks/pre_tasks.yml rename to roles/opengauss/tasks/pre_tasks.yml index fa2c03487cd650bbda17ca261466b208ca2e36ec..6bd44a423755dc0581b9543dc2b49578719aeb6a 100644 --- a/roles/openGauss/tasks/pre_tasks.yml +++ b/roles/opengauss/tasks/pre_tasks.yml @@ -14,10 +14,15 @@ - "os/not_supported.yml" - name: Config user on hosts - ansible.builtin.import_tasks: os/user.yml + ansible.builtin.include_tasks: + file: os/user.yml + with_items: "{{ groups['opengauss_expand'] | default(og_all_nodes) }}" + loop_control: + loop_var: node - name: Config ssh on hosts - ansible.builtin.include_tasks: os/ssh.yml + ansible.builtin.include_tasks: + file: os/ssh.yml with_items: - user: root group: root diff --git a/roles/openGauss/tasks/report.yml b/roles/opengauss/tasks/report.yml similarity index 100% rename from roles/openGauss/tasks/report.yml rename to roles/opengauss/tasks/report.yml diff --git a/roles/openGauss/tasks/runtime_facts.yml b/roles/opengauss/tasks/runtime_facts.yml similarity index 37% rename from roles/openGauss/tasks/runtime_facts.yml rename to roles/opengauss/tasks/runtime_facts.yml index e08cf82f2abe1e9facf29a36551ef3cd49f30f45..c92fd4229ce27b523ba238a80bb929a665f729f6 100644 --- a/roles/openGauss/tasks/runtime_facts.yml +++ b/roles/opengauss/tasks/runtime_facts.yml @@ -5,23 +5,30 @@ og_user_pass: "{{ combined_vars.opengauss_env.user_pass }}" og_home: "{{ combined_vars.opengauss_home }}" og_paths: "{{ combined_vars.opengauss_paths }}" - og_pkg_url: >- - {{ combined_vars.opengauss_download - [ansible_architecture] - [(ansible_distribution | replace(' ', '_') | lower) - + '_' - + ansible_distribution_major_version] }} og_ver: "{{ combined_vars.opengauss_version }}" - og_hostname: "og{{ inventory_hostname | ipaddr('int') }}" og_data_path: "{{ combined_vars.opengauss_paths.dataPath }}" - og_all_nodes: "{{ groups['openGauss'] | sort }}" - og_master: "{{ groups['opengauss_master'] | first }}" + og_db_pass: "{{ combined_vars.opengauss_db_set.root_pass }}" + og_locale: "{{ combined_vars.opengauss_env.locale | default(ansible_env.LANG) }}" + 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 }}" + sync_num: "{{ combined_vars.opengauss_env.syncNum }}" - name: Set runtime facts - 2 ansible.builtin.set_fact: - og_upload_path: "/opt/software/{{ og_pkg_url | dirname | basename }}_{{ og_pkg_url | basename | replace('.tar.gz', '') }}" - og_host_list: >- - {%- for node in og_all_nodes -%} - og{{ node | ipaddr('int') }}{{ (loop.nextitem is defined) | ternary(',', '') }} - {%- endfor -%} - og_ip_list: "{{ og_all_nodes | join(',') }}" + 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) }} + 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 new file mode 100644 index 0000000000000000000000000000000000000000..57f21804873d475364cbe08706c4d4cbc5761f3d --- /dev/null +++ b/roles/opengauss/templates/cluster_config.xml.j2 @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + +{{ lookup('template', 'cluster_master.xml.j2') }} +{% if (og_replicas | count) > 0 %} +{{ lookup('template', 'cluster_replicas.xml.j2') }} +{% endif %} + + diff --git a/roles/opengauss/templates/cluster_master.xml.j2 b/roles/opengauss/templates/cluster_master.xml.j2 new file mode 100644 index 0000000000000000000000000000000000000000..b69e7029195b13c93450ecb8ecdfcc0bb1300abc --- /dev/null +++ b/roles/opengauss/templates/cluster_master.xml.j2 @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + +{% if og_cm_enabled %} + + + + + + + + + +{% 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 new file mode 100644 index 0000000000000000000000000000000000000000..f6dae6ead3b57d2aaa4e3536b05f463c7b52cb62 --- /dev/null +++ b/roles/opengauss/templates/cluster_replicas.xml.j2 @@ -0,0 +1,19 @@ + + +{% for node in (groups['opengauss_replica_nodes'] | sort) %} + + + + + + +{% if (groups['opengauss'] | count) > 2 %} + + + + +{% endif %} + + +{% endfor %} + diff --git a/roles/opengauss/templates/report.md.j2 b/roles/opengauss/templates/report.md.j2 new file mode 100644 index 0000000000000000000000000000000000000000..81bbb654e4572fff40be2f4e5dff6a5f9ead1b29 --- /dev/null +++ b/roles/opengauss/templates/report.md.j2 @@ -0,0 +1,19 @@ +# 集群信息 + +``` +{% for line in cluster_status.stdout_lines %} +{{ line }} +{% endfor %} +``` + +# 部署信息 + +| | | +|---|---| +| 版本 | {{ og_ver }} | +| 工作目录 | {{ og_home }} | +| 数据目录 | {{ og_data_path }} | +| 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 diff --git a/roles/openGauss/tests/inventory b/roles/opengauss/tests/inventory similarity index 100% rename from roles/openGauss/tests/inventory rename to roles/opengauss/tests/inventory diff --git a/roles/openGauss/tests/test.yml b/roles/opengauss/tests/test.yml similarity index 100% rename from roles/openGauss/tests/test.yml rename to roles/opengauss/tests/test.yml diff --git a/roles/openGauss/vars/main.yml b/roles/opengauss/vars/main.yml similarity index 100% rename from roles/openGauss/vars/main.yml rename to roles/opengauss/vars/main.yml diff --git a/roles/pre-tasks/meta/main.yml b/roles/pre-tasks/meta/main.yml deleted file mode 100644 index c572acc9f8b466bea50f2799b0ca1956418b862c..0000000000000000000000000000000000000000 --- a/roles/pre-tasks/meta/main.yml +++ /dev/null @@ -1,52 +0,0 @@ -galaxy_info: - author: your name - description: your role description - company: your company (optional) - - # If the issue tracker for your role is not on github, uncomment the - # next line and provide a value - # issue_tracker_url: http://example.com/issue/tracker - - # Choose a valid license ID from https://spdx.org - some suggested licenses: - # - BSD-3-Clause (default) - # - MIT - # - GPL-2.0-or-later - # - GPL-3.0-only - # - Apache-2.0 - # - CC-BY-4.0 - license: license (GPL-2.0-or-later, MIT, etc) - - min_ansible_version: 2.1 - - # If this a Container Enabled role, provide the minimum Ansible Container version. - # min_ansible_container_version: - - # - # Provide a list of supported platforms, and for each platform a list of versions. - # If you don't wish to enumerate all versions for a particular platform, use 'all'. - # To view available platforms and versions (or releases), visit: - # https://galaxy.ansible.com/api/v1/platforms/ - # - # platforms: - # - name: Fedora - # versions: - # - all - # - 25 - # - name: SomePlatform - # versions: - # - all - # - 1.0 - # - 7 - # - 99.99 - - galaxy_tags: [] - # List tags for your role here, one per line. A tag is a keyword that describes - # and categorizes the role. Users find roles by searching for tags. Be sure to - # remove the '[]' above, if you add tags to this list. - # - # NOTE: A tag is limited to a single word comprised of alphanumeric characters. - # Maximum 20 tags per role. - -dependencies: [] - # List your role dependencies here, one per line. Be sure to remove the '[]' above, - # if you add dependencies to this list. diff --git a/roles/pre-tasks/README.md b/roles/pre_tasks/README.md similarity index 100% rename from roles/pre-tasks/README.md rename to roles/pre_tasks/README.md diff --git a/roles/pre-tasks/defaults/main.yml b/roles/pre_tasks/defaults/main.yml similarity index 100% rename from roles/pre-tasks/defaults/main.yml rename to roles/pre_tasks/defaults/main.yml diff --git a/roles/pre-tasks/handlers/main.yml b/roles/pre_tasks/handlers/main.yml similarity index 100% rename from roles/pre-tasks/handlers/main.yml rename to roles/pre_tasks/handlers/main.yml diff --git a/roles/pre_tasks/meta/main.yml b/roles/pre_tasks/meta/main.yml new file mode 100644 index 0000000000000000000000000000000000000000..6b4ee8049e0faca2757de50338acd98c1871e7a2 --- /dev/null +++ b/roles/pre_tasks/meta/main.yml @@ -0,0 +1,8 @@ +galaxy_info: + author: haibin.l@linkingcloud.com + description: Pre tasks for openGauss deploy + company: https://linkingcloud.cn/ + + license: MulanPSL-2.0 + + min_ansible_version: "2.1" diff --git a/roles/pre-tasks/tasks/main.yml b/roles/pre_tasks/tasks/main.yml similarity index 60% rename from roles/pre-tasks/tasks/main.yml rename to roles/pre_tasks/tasks/main.yml index 12ade9c3fe0815c6e372ebff84f07911cd2f588c..9ca5d2af2f85ba3757e30aff5a0245ae3fd9b151 100644 --- a/roles/pre-tasks/tasks/main.yml +++ b/roles/pre_tasks/tasks/main.yml @@ -2,36 +2,40 @@ # tasks file for pre-tasks - name: Set timezone - set_fact: + ansible.builtin.set_fact: global_timezone: "Asia/Shanghai" when: global_timezone is not defined -- block: +- name: Set network vars + when: "global_bond_iface is not defined" + block: - name: Get iface name when 'global_bond_iface' is not defined - shell: "ip a | grep {{ ansible_host | default(inventory_hostname) }} | awk '{print $NF}'" + ansible.builtin.shell: >- + set -o pipefail && + ip a | grep {{ ansible_host | default(inventory_hostname) }} | awk '{print $NF}' changed_when: false register: iface_name - name: Set 'global_bond_iface' var - set_fact: + ansible.builtin.set_fact: global_bond_iface: "{{ iface_name.stdout | trim }}" global_bond_ip: "{{ ansible_host | default(inventory_hostname) }}" - when: "global_bond_iface is not defined" -- name: "Set `inventory_dir` equal to `playbook_dir`" - set_fact: - inventory_dir: "{{ playbook_dir }}" - when: - - inventory_dir is not defined - - playbook_dir is defined +# - 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 - set_fact: + ansible.builtin.set_fact: python_name: "{{ (ansible_python_interpreter | default(discovered_interpreter_python)) | basename }}" pip_name: "{{ (ansible_python_interpreter | default(discovered_interpreter_python)) | basename | replace('python', 'pip') }}" # This task must be the last -- include_tasks: "{{ item }}" +- name: Config system by distribuion and os family + ansible.builtin.include_tasks: "{{ item }}" with_first_found: - files: - "os/{{ ansible_distribution }}.yml" diff --git a/roles/pre-tasks/tasks/os/Kylin Linux Advanced Server_V10.yml b/roles/pre_tasks/tasks/os/Kylin Linux Advanced Server_V10.yml similarity index 63% rename from roles/pre-tasks/tasks/os/Kylin Linux Advanced Server_V10.yml rename to roles/pre_tasks/tasks/os/Kylin Linux Advanced Server_V10.yml index 3034251b8b24ea70617cb916432c01c73c1a9615..e97734ead9fa28d906483a480e3f6eef47b188b0 100644 --- a/roles/pre-tasks/tasks/os/Kylin Linux Advanced Server_V10.yml +++ b/roles/pre_tasks/tasks/os/Kylin Linux Advanced Server_V10.yml @@ -1,3 +1,3 @@ - name: Set custom vars - set_fact: + ansible.builtin.set_fact: custom_pkg_mgr: dnf diff --git a/roles/pre-tasks/tasks/vars_combine.yml b/roles/pre_tasks/tasks/vars_combine.yml similarity index 75% rename from roles/pre-tasks/tasks/vars_combine.yml rename to roles/pre_tasks/tasks/vars_combine.yml index 4d90e6c5e23c7aa3c46f3d8b2176243231c6ec1b..e64f8a01be8131c665095e4b53d83c7e8d0c585c 100644 --- a/roles/pre-tasks/tasks/vars_combine.yml +++ b/roles/pre_tasks/tasks/vars_combine.yml @@ -10,10 +10,11 @@ # msg: "{{ temp_role_vars }}" - name: Assembling group vars files - assemble: - src: "{{ inventory_dir }}/group_vars" + ansible.builtin.assemble: + src: "{{ inventory_dir }}/group_vars/" dest: "{{ inventory_dir }}/assembled_vars/{{ group_names | hash('md5') }}.yml" - regexp: "({{ group_names | join('|') }})" + regexp: "({{ group_names | sort | join('|') }})" + mode: "0644" delegate_to: localhost become: false run_once: true @@ -27,7 +28,7 @@ # msg: "{{ temp_group_vars }}" - name: Combine vars from role and groups - set_fact: + ansible.builtin.set_fact: combined_vars: "{{ role_vars | combine(group_vars, recursive=true) }}" vars: role_vars: "{{ lookup('vars', 'temp_role_vars') }}" @@ -40,11 +41,14 @@ # - meta: end_play rescue: - - name: "Create {{ inventory_dir }}/assembled_vars" - file: + - name: "Create 'assembled_vars' path in {{ inventory_dir }}" + ansible.builtin.file: path: "{{ inventory_dir }}/assembled_vars" state: directory + mode: "0755" delegate_to: localhost become: false + run_once: true - - include_tasks: vars_combine.yml \ No newline at end of file + - name: Repeat tasks + ansible.builtin.include_tasks: vars_combine.yml diff --git a/roles/pre-tasks/tests/inventory b/roles/pre_tasks/tests/inventory similarity index 100% rename from roles/pre-tasks/tests/inventory rename to roles/pre_tasks/tests/inventory diff --git a/roles/pre-tasks/tests/test.yml b/roles/pre_tasks/tests/test.yml similarity index 100% rename from roles/pre-tasks/tests/test.yml rename to roles/pre_tasks/tests/test.yml diff --git a/roles/pre-tasks/vars/main.yml b/roles/pre_tasks/vars/main.yml similarity index 100% rename from roles/pre-tasks/vars/main.yml rename to roles/pre_tasks/vars/main.yml diff --git a/vagrant/openEuler2003_x86_64.pkr.hcl b/vagrant/openEuler2003_x86_64.pkr.hcl index e18a43ee91c8f95cbd94503f1c366cbbfba4a781..027cb3861e806cc71254af84e251030f33043aeb 100644 --- a/vagrant/openEuler2003_x86_64.pkr.hcl +++ b/vagrant/openEuler2003_x86_64.pkr.hcl @@ -8,15 +8,15 @@ packer { } source "virtualbox-iso" "openeuler" { - guest_os_type = "CentOS_64" + // guest_os_type = "CentOS_64" iso_url = "https://mirror.sjtu.edu.cn/openeuler/openEuler-22.03-LTS-SP2/ISO/x86_64/openEuler-22.03-LTS-SP2-netinst-x86_64-dvd.iso" iso_checksum = "sha256:e7186579da6d16430bb8577e2989761e726af8166a08f7e02cde55a614b42d66" ssh_username = "vagrant" ssh_password = "vagrant" shutdown_command = "echo 'vagrant' | sudo -S shutdown -P now" boot_command = [ - "", - ] + "", + ] } build { diff --git a/vagrant/openEuler2203_x86_64.pkr.hcl b/vagrant/openEuler2203_x86_64.pkr.hcl new file mode 100644 index 0000000000000000000000000000000000000000..40a529f12ad3e6020ef27dd69628306f39902122 --- /dev/null +++ b/vagrant/openEuler2203_x86_64.pkr.hcl @@ -0,0 +1,26 @@ +packer { + required_plugins { + virtualbox = { + version = "~> 1" + source = "github.com/hashicorp/virtualbox" + } + } +} + +source "virtualbox-iso" "openeuler" { + guest_os_type = "CentOS" + iso_url = "https://mirror.sjtu.edu.cn/openeuler/openEuler-22.03-LTS-SP2/ISO/x86_64/openEuler-22.03-LTS-SP2-netinst-x86_64-dvd.iso" + iso_checksum = "sha256:e7186579da6d16430bb8577e2989761e726af8166a08f7e02cde55a614b42d66" + ssh_username = "vagrant" + ssh_password = "vagrant" + shutdown_command = "echo 'vagrant' | sudo -S shutdown -P now" + boot_command = [ + "", + "", + ] +} + +build { + sources = ["sources.virtualbox-iso.openeuler"] +} +