diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..06f46373a333332a8d757346274b35d8eb3e00df --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +downloaded_files +ansible-docker/inventories/opengauss/credentials +ansible-docker/inventories/opengauss/assembled_vars \ No newline at end of file diff --git a/01-deploy.yml b/01-deploy.yml new file mode 100644 index 0000000000000000000000000000000000000000..73bdc435a70aa69e26577f1649340dd66b37a4ea --- /dev/null +++ b/01-deploy.yml @@ -0,0 +1,5 @@ +- name: Deploy openGauss + hosts: openGauss + become: true + roles: + - openGauss \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..d3e2d9c0d470281e5c4ae0a78e3b757a9956832b --- /dev/null +++ b/README.md @@ -0,0 +1,59 @@ +# Ansible role for openGauss + +自动部署 openGauss,根据分组定义,自适应部署单点、一主一从、一主多从以及级联节点等架构模式。 + +目前仅支持初次部署,不支持对集群架构做变更。 + +# 已适配的系统 + +* x86_64 + * CentOS 7.6 + +# 已适配的 openGauss 版本 + +* 5.0.0 + +# 优势特点 + +1. 1 主 4 从 1 级联的架构,十分钟内部署完成(不含安装包的下载时间)。 +1. 自动匹配 CPU 架构以及操作系统。 +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` 目录内。 +1. 支持自定义变量,自动与 `defaults/main.yml` 变量合并使用。例如 + + 默认变量 + + ``` + openGauss_env: + user_name: omm + user_group: dbgrp + ``` + + 自定义变量文件 `{{ inventory_dir }}/group_vars/openGauss.yml` + + ``` + openGauss_env: + user_name: ommo + ``` + + 合并后的可用变量 + + ``` + combined_vars: + openGauss_env: + user_name: ommo + user_group: dbgrp + ``` + +# 使用指南 + +* [快速开始](docs/00-how-to.md),适合熟悉 Ansible 的同学。 +* [创建 Ansible 容器](docs/01-ansible-in-docker.md),使用 docker 快速搭建一个可以运行本项目的 ansible 环境,降低对操作系统的依赖。 +* [详细配置](docs/02-pre-set.md) +* [开始部署](docs/03-deploy.md) + +# 开发指南 + +(待补充) \ No newline at end of file diff --git a/ansible-docker/.dockerignore b/ansible-docker/.dockerignore new file mode 100644 index 0000000000000000000000000000000000000000..1d247049b497da13e2a0a958c98dc7449681fc86 --- /dev/null +++ b/ansible-docker/.dockerignore @@ -0,0 +1,3 @@ +*.log +.vagrant +inventories \ No newline at end of file diff --git a/ansible-docker/.gitignore b/ansible-docker/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e3f2c9d4cf9aa82c9e1bea6b3f656532502cd6a7 --- /dev/null +++ b/ansible-docker/.gitignore @@ -0,0 +1,4 @@ +*.log +.vagrant +inventories/vagrant/credentials +inventories/vagrant/files \ No newline at end of file diff --git a/ansible-docker/Dockerfile b/ansible-docker/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..d4dccce37c6620bf3a79dba26bbbd813f685adb3 --- /dev/null +++ b/ansible-docker/Dockerfile @@ -0,0 +1,15 @@ +FROM alpine +LABEL Creator="haibin.l@linkingcloud.cn" +ARG TIMEZONE="Asia/Shanghai" + +RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.cloud.tencent.com/g' /etc/apk/repositories \ + && 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 + +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 diff --git a/ansible-docker/README.md b/ansible-docker/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c36adb8daf8d0433e49ff0451c2501d8a404d939 --- /dev/null +++ b/ansible-docker/README.md @@ -0,0 +1,21 @@ +# 测试环境搭建 + +1. (可选)Vagrantfile。默认启动 4 台 4U16G 的 Virtualbox 虚拟机,如果你的机器配置无法满足,请适当修改相关参数 `vb.memory` 和 `vb.cpus`。降低这 2 个参数可能会导致某些部署无法测试成功。 +1. Dockerfile。基于 Alpine Linux 容器镜像,制作一个运行 Ansible 的 Docker 镜像,解决某些离线环境里安装软件的问题。 +1. docker-compose.yml。Ansible 容器使用用例,请根据实际需要进行修改。 + +## 步骤 + +``` +# 启动虚拟机。(需要已安装 vagrant、virtualbox) +vagrant up + +# 制作 ansible 容器镜像 +docker-compose build + +# 启动 ansible 容器 +docker-compose up -d + +# 进入容器环境 +docker exec -it ansible byobu +``` diff --git a/ansible-docker/Vagrantfile b/ansible-docker/Vagrantfile new file mode 100644 index 0000000000000000000000000000000000000000..548020a7cb3a631e4df96ef31901ed64daa58292 --- /dev/null +++ b/ansible-docker/Vagrantfile @@ -0,0 +1,26 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +Vagrant.configure("2") do |config| + + config.ssh.insert_key = false + config.vm.provider :virtualbox do |vb| + vb.memory = 4096 + vb.cpus = 2 + vb.customize [ "modifyvm", :id, "--uartmode1", "disconnected" ] + vb.linked_clone = true + end + + #Disabling the default /vagrant share + config.vm.synced_folder ".", "/vagrant", disabled: true + + # How many vm do you want? + N = 3 + + (1..N).each do |i| + config.vm.define "opengauss#{i}" do |node| + node.vm.box = "centos/7" + node.vm.network :private_network, ip: "192.168.56.#{10+i}" + end + end +end diff --git a/ansible-docker/ansible.cfg b/ansible-docker/ansible.cfg new file mode 100644 index 0000000000000000000000000000000000000000..8a0805d52fb32abfebba861ec940f8d3ffc5e7d9 --- /dev/null +++ b/ansible-docker/ansible.cfg @@ -0,0 +1,14 @@ +[defaults] +nocows = True +inventory = ./inventories/opengauss/hosts.ini +roles_path = ~/.ansible/roles,/workdir/roles,./roles + +remote_tmp = $HOME/.ansible/tmp +local_tmp = $HOME/.ansible/tmp +pipelining = True +become = True +host_key_checking = False +deprecation_warnings = False +callback_whitelist = profile_tasks +display_skipped_hosts = False +#stdout_callback = yaml diff --git a/ansible-docker/docker-compose.yml b/ansible-docker/docker-compose.yml new file mode 100644 index 0000000000000000000000000000000000000000..74bf0517dea6f053dc1fb2536af43c69e13bb0f4 --- /dev/null +++ b/ansible-docker/docker-compose.yml @@ -0,0 +1,19 @@ +version: "3.3" + +services: + ansible: + image: haibin.lee/ansible + container_name: ansible + hostname: ansible-in-docker + restart: always + build: + context: . + working_dir: /workdir + volumes: + - "./inventories:/etc/ansible/inventories" + - "../:/workdir" + - "./ansible.cfg:/etc/ansible/ansible.cfg" + - "~/.vagrant.d/insecure_private_key:/root/.vagrant.d/insecure_private_key" + entrypoint: + - "crond" + - "-f" diff --git a/ansible-docker/inventories/opengauss/group_vars/all/defaults.yml b/ansible-docker/inventories/opengauss/group_vars/all/defaults.yml new file mode 100644 index 0000000000000000000000000000000000000000..0c13c88c4850ef39713cb2e4546dbe7534195546 --- /dev/null +++ b/ansible-docker/inventories/opengauss/group_vars/all/defaults.yml @@ -0,0 +1 @@ +# ansible_python_interpreter: "python3" \ No newline at end of file diff --git a/ansible-docker/inventories/opengauss/hosts.ini b/ansible-docker/inventories/opengauss/hosts.ini new file mode 100644 index 0000000000000000000000000000000000000000..5b39407827e3dc779ad1f98f7fc215c9d8e9c3d1 --- /dev/null +++ b/ansible-docker/inventories/opengauss/hosts.ini @@ -0,0 +1,28 @@ +; 主服务器组,仅设置 1 个目标机。 +[openGauss_master] +192.168.56.11 + +; 从服务器组,可设置若干个或留空。 +[openGauss_follower] +192.168.56.12 + +; 级联服务器组,可设置若干个或留空。 +[openGauss_cascade] +192.168.56.13 + +; 以上 3 个分组的合并组,勿动。 +[openGauss:children] +openGauss_master +openGauss_follower +openGauss_cascade + +; 机器的 SSH 信息,请根据你的实际情况修改。 +[openGauss:vars] +; ssh 用户名,如果不是 root 用户,请确保它有 sudo 权限。 +ansible_ssh_user=vagrant +; ssh 密码 +ansible_ssh_pass=vagrant +; ssh 端口 +ansible_ssh_port=22 +; ssh 私钥。如果你的环境没有密钥登录方式,请务必删除以下这行。 +ansible_ssh_private_key_file="~/.vagrant.d/insecure_private_key" diff --git a/docs/00-how-to.md b/docs/00-how-to.md new file mode 100644 index 0000000000000000000000000000000000000000..d63dd8e4ebca96e0b8e9782656678a38c0217cd2 --- /dev/null +++ b/docs/00-how-to.md @@ -0,0 +1,37 @@ +# hosts.ini 示例 + +master 组仅可以配置 1 台机器。follower 可以多台。cascade 可选可为空。 + +``` +[openGauss_master] +192.168.56.11 + +[openGauss_follower] +192.168.56.12 + +[openGauss_cascade] +192.168.56.13 + +[openGauss:children] +openGauss_master +openGauss_follower +openGauss_cascade +``` + +# playbook.yml 示例 + +``` +- name: Deploy openGauss database + hosts: openGauss + become: true + roles: + - openGauss +``` + +# 效果展示 + +本地物理机,启动 6 台虚拟机,用时 9 分 30 秒完成 1 主 4 从 1 级联的架构部署。 + +![用时](imgs/23-09-20_1243_661.png) + +![集群状态](imgs/23-09-20_923_628.png) \ No newline at end of file diff --git a/docs/01-ansible-in-docker.md b/docs/01-ansible-in-docker.md new file mode 100644 index 0000000000000000000000000000000000000000..2182994f1640e0a8bf550ae8b903374a84b52efe --- /dev/null +++ b/docs/01-ansible-in-docker.md @@ -0,0 +1,17 @@ +进入 `ansible-docker` 目录,按以下步骤创建容器。 + +# 制作 ansible 容器镜像 + +`docker-compose build` + +# 启动 ansible 容器 + +`docker-compose up -d` + +# 进入容器环境 + +`docker exec -it ansible byobu` + +# 声明 + +我个人比较喜爱使用 fish 作为默认的 shell,以及使用 byobu 作为单窗口多终端的工作环境。如果您不喜欢,可以自行修改 Dockerfile 的内容。 \ No newline at end of file diff --git a/docs/02-pre-set.md b/docs/02-pre-set.md new file mode 100644 index 0000000000000000000000000000000000000000..f27e230e5ca11212faa9936fa5057c43832aef0c --- /dev/null +++ b/docs/02-pre-set.md @@ -0,0 +1,73 @@ +# 执行 playbook 之前的准备工作。 + +## 修改 `ansible-docker\inventories\opengauss\hosts.ini` 文件 + +这个文件是对你要部署的机器,进行一个分组编排,以及 ssh 信息。以 1 主 1 从 1 级联的架构为例,它的内容如下: + +``` +; 主服务器组,仅设置 1 个目标机。 +[openGauss_master] +192.168.56.11 + +; 从服务器组,可设置若干个或留空。 +[openGauss_follower] +192.168.56.12 + +; 级联服务器组,可设置若干个或留空。 +[openGauss_cascade] +192.168.56.13 + +; 以上 3 个分组的合并组,勿动。 +[openGauss:children] +openGauss_master +openGauss_follower +openGauss_cascade + +; 机器的 SSH 信息,请根据你的实际情况修改。 +[openGauss:vars] +; ssh 用户名,如果不是 root 用户,请确保它有 sudo 权限。 +ansible_ssh_user=vagrant +; ssh 密码 +ansible_ssh_pass=vagrant +; ssh 端口 +ansible_ssh_port=22 +; ssh 私钥。如果你的环境没有密钥登录方式,请务必删除以下这行。 +ansible_ssh_private_key_file="~/.vagrant.d/insecure_private_key" +``` + +## 修改默认运行值。 + +本项目的默认配置参数,存放在 `roles\openGauss\defaults\main.yml`,你可以参考这个文件的内容,根据实际需要做一些定制。*** 但不建议直接修改它,以考虑对不同的服务器仓库进行维护 *** + +建议的自定义方法,是将 `roles\openGauss\defaults\main.yml` 拷贝到 `ansible-docker\inventories\opengauss\group_vars\openGauss.yml`,再进行编辑。 + +部分变量是可以替换或扩展的。例如 + +``` +# Sysctl 的配置,可自行扩展。 +openGauss_sysctl: + net.ipv4.tcp_retries1: 5 + net.ipv4.tcp_syn_retries: 5 +``` + +你可以改成 + +``` +# Sysctl 的配置,可自行扩展。 +openGauss_sysctl: + net.ipv4.tcp_retries1: 5 + net.ipv4.tcp_syn_retries: 3 + net.ipv4.tcp_synack_retries: 5 +``` + +通过 `roles\pre-tasks\tasks\vars_combine.yml` 的处理后,我们可以得到一组合并后的变量 + +``` +combined_vars: + openGauss_sysctl: + net.ipv4.tcp_retries1: 5 + net.ipv4.tcp_syn_retries: 3 + net.ipv4.tcp_synack_retries: 5 +``` + +整个部署任务,都会大量使用 combined_vars 里的变量。 diff --git a/docs/03-deploy.md b/docs/03-deploy.md new file mode 100644 index 0000000000000000000000000000000000000000..68e58037109ccc5e36432c066f73e6da2e32e6cc --- /dev/null +++ b/docs/03-deploy.md @@ -0,0 +1,104 @@ +# 开始部署 + +建议使用前文提到的 Ansible 容器执行部署,避免系统差异、ansible 版本差异等一系列问题造成的运行失败。本项目全部基于 Ansible in Docker 来测试开发。 + +1. 进入 ansible 环境 + + ``` + docker exec -it ansible byobu + ``` + + 关于 byobu 的使用,大家可自行搜索一些教程。 + +1. 执行部署 + + ``` + pansible 01-deploy.yml + ``` + + 这里的 `pansible` 是我预置的命令别名,对应的是 `ansible-playbook`。 + +# 顺利部署后,你可看到一下输出内容 + +## 单节点 + +![单节点](imgs/1695614019309.png) + +对应的 hosts.ini 分组编排内容 + +``` +[openGauss_master] +192.168.56.11 + +[openGauss_follower] + +[openGauss_cascade] + +[openGauss:children] +openGauss_master +openGauss_follower +openGauss_cascade +``` + +## 1 主 1 从 + +![1主1从](imgs/1695614019287.png) +对应的 hosts.ini 分组编排内容 + +``` +[openGauss_master] +192.168.56.12 + +[openGauss_follower] +192.168.56.13 + +[openGauss_cascade] + +[openGauss:children] +openGauss_master +openGauss_follower +openGauss_cascade +``` + +## 1 主 1 从 1 级联 + +![1主1从1级联](imgs/1695614019263.png) +对应的 hosts.ini 分组编排内容 + +``` +[openGauss_master] +192.168.56.14 + +[openGauss_follower] +192.168.56.15 + +[openGauss_cascade] +192.168.56.16 + +[openGauss:children] +openGauss_master +openGauss_follower +openGauss_cascade +``` + +## 1 主 2 从 + +![1主2从](imgs/1695614019240.png) +对应的 hosts.ini 分组编排内容 + +``` +[openGauss_master] +192.168.56.17 + +[openGauss_follower] +192.168.56.18 +192.168.56.19 + +[openGauss_cascade] +192.168.56.16 + +[openGauss:children] +openGauss_master +openGauss_follower +openGauss_cascade +``` \ No newline at end of file diff --git a/docs/imgs/1695614019240.png b/docs/imgs/1695614019240.png new file mode 100644 index 0000000000000000000000000000000000000000..ed5b8df3702371379ce944ca5f71a8b4c439caa6 Binary files /dev/null and b/docs/imgs/1695614019240.png differ diff --git a/docs/imgs/1695614019263.png b/docs/imgs/1695614019263.png new file mode 100644 index 0000000000000000000000000000000000000000..6789f1f488697c4838addf3c43a29ac415bffd6d Binary files /dev/null and b/docs/imgs/1695614019263.png differ diff --git a/docs/imgs/1695614019287.png b/docs/imgs/1695614019287.png new file mode 100644 index 0000000000000000000000000000000000000000..fafbb378618dfd467dcf8da7da36d679feb1def2 Binary files /dev/null and b/docs/imgs/1695614019287.png differ diff --git a/docs/imgs/1695614019309.png b/docs/imgs/1695614019309.png new file mode 100644 index 0000000000000000000000000000000000000000..fb3d35b343ebaa28d8d1cb5c5880fa52d4725c99 Binary files /dev/null and b/docs/imgs/1695614019309.png differ diff --git a/docs/imgs/23-09-20_1243_661.png b/docs/imgs/23-09-20_1243_661.png new file mode 100644 index 0000000000000000000000000000000000000000..43095cdca0c4d90ce29f3c5977edf0f99014c790 Binary files /dev/null and b/docs/imgs/23-09-20_1243_661.png differ diff --git a/docs/imgs/23-09-20_923_628.png b/docs/imgs/23-09-20_923_628.png new file mode 100644 index 0000000000000000000000000000000000000000..f7c7306fd3c306f7fe5c22ad2400a325f757ea39 Binary files /dev/null and b/docs/imgs/23-09-20_923_628.png differ diff --git a/roles/openGauss/README.md b/roles/openGauss/README.md new file mode 100644 index 0000000000000000000000000000000000000000..722c7285352a3b5a607e00dc004f91456f2de635 --- /dev/null +++ b/roles/openGauss/README.md @@ -0,0 +1,82 @@ +# Ansible role for openGauss + +自动部署 openGauss,根据分组定义,自适应部署单点、一主一从、一主多从以及级联节点等架构模式。 + +目前仅支持初次部署,不支持对集群架构做变更。 + +# 优势特点 + +1. 1 主 4 从 1 级联的架构,十分钟内部署完成(不含安装包的下载时间)。 +1. 自动匹配 CPU 架构以及操作系统。 +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` 目录内。 +1. 支持自定义变量,自动与 `defaults/main.yml` 变量合并使用。例如 + + 默认变量 + + ``` + openGauss_env: + user_name: omm + user_group: dbgrp + ``` + + 自定义变量文件 `{{ inventory_dir }}/group_vars/openGauss.yml` + + ``` + openGauss_env: + user_name: ommo + ``` + + 合并后的可用变量 + + ``` + combined_vars: + openGauss_env: + user_name: ommo + user_group: dbgrp + ``` + +# 已匹配系统 + +* x86_64 + * CentOS 7.6 + +# hosts.ini 示例 + +master 组仅可以配置 1 台机器。follower 可以多台。cascade 可选可为空。 + +``` +[openGauss_master] +192.168.56.11 + +[openGauss_follower] +192.168.56.12 + +[openGauss_cascade] +192.168.56.13 + +[openGauss:children] +openGauss_master +openGauss_follower +openGauss_cascade +``` + +# playbook.yml 示例 + +``` +- name: Deploy openGauss database + hosts: openGauss + become: true + roles: + - openGauss +``` + +# 效果展示 + +本地物理机,启动 6 台虚拟机,用时 9 分 30 秒完成 1 主 4 从 1 级联的架构部署。 + +![用时](files/23-09-20_1243_661.png) + +![集群状态](files/23-09-20_923_628.png) diff --git a/roles/openGauss/defaults/main.yml b/roles/openGauss/defaults/main.yml new file mode 100644 index 0000000000000000000000000000000000000000..02883224eae97df2c19b0a520f22ba7e72c9d7c2 --- /dev/null +++ b/roles/openGauss/defaults/main.yml @@ -0,0 +1,52 @@ +--- +# defaults file for openGauss + +# 安装版本 +openGauss_version: 5.0.0 + +# 安装目录 +openGauss_home: /opt/openGauss + +# 其它目录,对应 cluster_config.xml 的内容。具体请看 https://docs.opengauss.org/zh/docs/5.0.0/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" + tmpMppdbPath: "{{ openGauss_home }}/tmp" + corePath: "{{ openGauss_home }}/corefile" + gaussdbToolPath: "{{ openGauss_home }}/install/om" + dataPath: "{{ openGauss_home }}/data" + +# 环境设置。 +openGauss_env: + user_name: omm + user_group: dbgrp + user_pass: "{{ lookup('password', inventory_dir + '/credentials/openGauss_omm_pass', chars=['ascii_letters', 'digits']) | password_hash }}" + iface_mtu: 8192 + clusterName: openGauss + dataPortBase: 15400 + cmServerPortBase: 15300 + cmServerPortStandby: 15500 + azName: AZ1 + +# 数据库安装配置 +openGauss_db_set: + locale: en_US.utf8 + root_pass: "{{ lookup('password', inventory_dir + '/credentials/openGauss_root_pass', chars=['ascii_letters', 'digits'], length=16) }}" + +# Sysctl 的配置,可自行扩展。 +# 参考官方文档->初始化安装环境->配置操作系统参数 +openGauss_sysctl: + net.ipv4.tcp_retries1: 5 + net.ipv4.tcp_syn_retries: 5 + net.ipv4.tcp_synack_retries: 5 + net.ipv4.tcp_fin_timeout: 60 + +# 安装包的下载链接。按 CPU 架构、操作系统及版本做区分。例如 openEuler_22 表示是针对 openEuler 22.03 版本的下载链接。 +openGauss_download: + aarch64: + openEuler_22: "https://opengauss.obs.cn-south-1.myhuaweicloud.com/{{ openGauss_version }}/arm_2203/openGauss-{{ openGauss_version }}-openEuler-64bit-all.tar.gz" + openEuler_20: "https://opengauss.obs.cn-south-1.myhuaweicloud.com/{{ openGauss_version }}/arm/openGauss-{{ openGauss_version }}-openEuler-64bit-all.tar.gz" + x86_64: + openEuler_22: "https://opengauss.obs.cn-south-1.myhuaweicloud.com/{{ openGauss_version }}/x86_openEuler_2203/openGauss-{{ openGauss_version }}-openEuler-64bit-all.tar.gz" + openEuler_20: "https://opengauss.obs.cn-south-1.myhuaweicloud.com/{{ openGauss_version }}/x86_openEuler/openGauss-{{ openGauss_version }}-openEuler-64bit-all.tar.gz" + CentOS_7: "https://opengauss.obs.cn-south-1.myhuaweicloud.com/{{ openGauss_version }}/x86/openGauss-{{ openGauss_version }}-CentOS-64bit-all.tar.gz" \ No newline at end of file diff --git a/roles/openGauss/handlers/main.yml b/roles/openGauss/handlers/main.yml new file mode 100644 index 0000000000000000000000000000000000000000..b24a3cd7b499c1e177621bc0218fa1da25f73bae --- /dev/null +++ b/roles/openGauss/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for openGauss diff --git a/roles/openGauss/meta/main.yml b/roles/openGauss/meta/main.yml new file mode 100644 index 0000000000000000000000000000000000000000..4c3689d8406ab31181bc16cdf7b07c56665ab984 --- /dev/null +++ b/roles/openGauss/meta/main.yml @@ -0,0 +1,4 @@ +dependencies: + - name: pre-tasks + tags: + - always \ No newline at end of file diff --git a/roles/openGauss/tasks/install/cleanup.yml b/roles/openGauss/tasks/install/cleanup.yml new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/roles/openGauss/tasks/install/install.yml b/roles/openGauss/tasks/install/install.yml new file mode 100644 index 0000000000000000000000000000000000000000..3249ec1b9d5e6b0fe615eec426bee6b79857f4f2 --- /dev/null +++ b/roles/openGauss/tasks/install/install.yml @@ -0,0 +1,27 @@ +- name: Create /opt/software/openGauss/cluster_config.xml + template: + src: "{{ item }}" + dest: "/opt/software/openGauss/cluster_config.xml" + owner: "{{ og_user }}" + group: "{{ og_group }}" + backup: true + lstrip_blocks: true + with_first_found: + - "{{ inventory_dir }}/templates/openGauss/cluster_config.xml.j2" + - "cluster_config.xml.j2" + +- name: Starting pre install + command: "python3 gs_preinstall -U {{ og_user }} -G {{ og_group }} -X /opt/software/openGauss/cluster_config.xml --non-interactive" + args: + chdir: "/opt/software/openGauss/script" + changed_when: false + +- name: Deploy openGauss + shell: | + . ~/.bashrc && \ + python3 gs_install \ + -X /opt/software/openGauss/cluster_config.xml \ + --gsinit-parameter="--pwpasswd={{ combined_vars.openGauss_db_set.root_pass }}" + args: + chdir: "{{ og_home }}/install/om/script" + become_user: "{{ og_user }}" diff --git a/roles/openGauss/tasks/install/ssh.yml b/roles/openGauss/tasks/install/ssh.yml new file mode 100644 index 0000000000000000000000000000000000000000..757a82ca8c65e3ec90e4d6187e9241867ae81156 --- /dev/null +++ b/roles/openGauss/tasks/install/ssh.yml @@ -0,0 +1,88 @@ +- name: "Create {{ og_ssh.home }}/.ssh" + file: + path: "{{ og_ssh.home }}/.ssh" + state: directory + mode: 0700 + owner: "{{ og_ssh.user }}" + group: "{{ og_ssh.group }}" + +- name: Generate ssh keys + block: + - name: "Create {{ inventory_dir }}/credentials" + file: + path: "{{ inventory_dir }}/credentials" + state: directory + + - name: Generate openGauss_id_om + openssh_keypair: + path: "{{ inventory_dir }}/credentials/openGauss_id_om" + type: ed25519 + regenerate: never + + - name: Generate openGauss_id_rsa + openssh_keypair: + path: "{{ inventory_dir }}/credentials/openGauss_id_rsa" + regenerate: never + delegate_to: localhost + become: false + run_once: true + +- name: Upload ssh keys + copy: + src: "{{ og_key }}" + dest: "{{ og_ssh.home }}/.ssh/{{ og_key | basename | replace('openGauss_', '') }}" + mode: 0400 + owner: "{{ og_ssh.user }}" + group: "{{ og_ssh.group }}" + backup: true + with_fileglob: + - "{{ inventory_dir }}/credentials/openGauss_id*" + loop_control: + loop_var: og_key + label: "{{ og_ssh.home }}/.ssh/{{ og_key | basename | replace('openGauss_', '') }}" + +- 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: "Setup {{ og_ssh.home }}/.ssh/config" +# blockinfile: +# create: true +# path: "{{ og_ssh.home }}/.ssh/config" +# owner: "{{ og_ssh.user }}" +# group: "{{ og_ssh.group }}" +# block: | +# Host * +# StrictHostKeyChecking no +# UserKnownHostsFile /dev/null + +- name: Scan hosts key + command: "ssh-keyscan -p {{ port }} {{ node }},opengauss{{ ansible_loop.index }}" + changed_when: false + loop: "{{ groups['openGauss'] | sort }}" + loop_control: + loop_var: node + extended: true + vars: + port: "{{ ansible_ssh_port | default('22') }}" + register: known_host_keys + +- name: "Update {{ og_ssh.home }}/.ssh/known_hosts" + blockinfile: + path: "{{ og_ssh.home }}/.ssh/known_hosts" + owner: "{{ og_ssh.user }}" + group: "{{ og_ssh.group }}" + create: true + block: | + {% for key in (host_keys | sort) %} + {{ key }} + {% endfor %} + vars: + host_keys: "{{ known_host_keys.results | map(attribute='stdout_lines') | flatten }}" \ No newline at end of file diff --git a/roles/openGauss/tasks/install/upload.yml b/roles/openGauss/tasks/install/upload.yml new file mode 100644 index 0000000000000000000000000000000000000000..1df27c90b52477f96c235ad66ab87da1a8405332 --- /dev/null +++ b/roles/openGauss/tasks/install/upload.yml @@ -0,0 +1,43 @@ +- name: Upload and extract files + block: + - name: Create /opt/software/openGauss + file: + path: /opt/software/openGauss + state: directory + # owner: "{{ og_user }}" + # group: "{{ og_group }}" + recurse: true + + - name: "Extracting {{ og_pkg_url | basename }}" + unarchive: + src: "{{ playbook_dir }}/downloaded_files/{{ og_pkg_url | basename }}" + dest: /opt/software/openGauss/ + # owner: "{{ og_user }}" + # group: "{{ og_group }}" + + - name: "Extracting {{ og_pkg_url | basename | replace('all', 'om') }}" + unarchive: + remote_src: true + src: "/opt/software/openGauss/{{ og_pkg_url | basename | replace('all', 'om') }}" + dest: "/opt/software/openGauss/" + # owner: "{{ og_user }}" + # group: "{{ og_group }}" + + rescue: + - name: "Get {{ og_pkg_url }}" + block: + - name: "Create {{ playbook_dir }}/downloaded_files" + file: + path: "{{ playbook_dir }}/downloaded_files" + state: directory + + - name: Downloading + get_url: + url: "{{ og_pkg_url }}" + dest: "{{ playbook_dir }}/downloaded_files/" + run_once: true + delegate_to: localhost + become: false + + - include_tasks: install/upload.yml + diff --git a/roles/openGauss/tasks/install/user.yml b/roles/openGauss/tasks/install/user.yml new file mode 100644 index 0000000000000000000000000000000000000000..cc69a0a45c2e0b5f0a23605fa1108c725262a7bc --- /dev/null +++ b/roles/openGauss/tasks/install/user.yml @@ -0,0 +1,28 @@ +- name: "Create group '{{ og_group }}'" + group: + name: "{{ og_group }}" + +- name: "Create user '{{ og_user }}'" + user: + name: "{{ og_user }}" + group: "{{ og_group }}" + shell: "{{ ansible_user_shell }}" + password: "{{ og_user_pass }}" + update_password: on_create + +# - name: Touch user profile +# file: +# path: "/home/{{ og_user }}/.bashrc" +# state: touch +# owner: "{{ og_user }}" +# group: "{{ og_group }}" + +# - name: Create paths +# file: +# path: "{{ openGauss_home }}/install" +# state: directory +# owner: "{{ og_user }}" +# group: "{{ og_group }}" +# # with_dict: "{{ og_paths }}" +# # loop_control: +# # label: "{{ item.value }}" \ No newline at end of file diff --git a/roles/openGauss/tasks/main.yml b/roles/openGauss/tasks/main.yml new file mode 100644 index 0000000000000000000000000000000000000000..81e64f31ae73c728b7e4866038aad27bdc7a90d1 --- /dev/null +++ b/roles/openGauss/tasks/main.yml @@ -0,0 +1,92 @@ +--- +# tasks file for openGauss + +- name: Tasks always run + block: + - name: Combine vars + import_role: + name: "pre-tasks" + tasks_from: "vars_combine.yml" + + - name: Set runtime facts + import_tasks: runtime_facts.yml + + - name: Config /etc/sysctl.d/50-opengauss.conf + 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 + tags: always + +- name: Deploy openGauss + block: + - name: Check cluster status + shell: ". ~/.bashrc && gs_om -t status --detail" + changed_when: false + args: + chdir: "{{ og_home }}/install/om/script" + become_user: "{{ og_user }}" + run_once: true + register: cluster_detail + + rescue: + - name: Common sets for all distribution + import_tasks: os/common_set.yml + + - name: Custom sets by distribution + include_tasks: "{{ item }}" + with_first_found: + - "os/{{ ansible_distribution }}.yml" + - "os/not_supported.yml" + + - name: Custom sets by os family + include_tasks: "{{ item }}" + with_first_found: + - "os/{{ ansible_os_family }}.yml" + - "os/not_supported.yml" + + - import_tasks: install/user.yml + + - include_tasks: install/ssh.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 + + - block: + - import_tasks: install/upload.yml + - import_tasks: install/install.yml + run_once: true + + - name: Check cluster status + shell: ". ~/.bashrc && gs_om -t status --detail" + changed_when: false + args: + chdir: "{{ og_home }}/install/om/script" + become_user: "{{ og_user }}" + run_once: true + register: cluster_detail + + always: + - name: Remove authorized key + authorized_key: + user: root + state: absent + key: "{{ lookup('file', item) }}" + with_fileglob: + - "{{ inventory_dir }}/credentials/openGauss_id_*.pub" + + - name: Print cluster detail + debug: + msg: | + {{ cluster_detail.stdout_lines }} + run_once: true \ No newline at end of file diff --git a/roles/openGauss/tasks/os/CentOS.yml b/roles/openGauss/tasks/os/CentOS.yml new file mode 100644 index 0000000000000000000000000000000000000000..eb44c2ff3c3657fcf68717bee0c4964c24d0bbc0 --- /dev/null +++ b/roles/openGauss/tasks/os/CentOS.yml @@ -0,0 +1,19 @@ +- name: Install epel-release + package: + name: epel-release + +- name: Install dependencies + package: + name: + - python36 + - libaio-devel + - flex + - bison + - ncurses-devel + - glibc-devel + - patch + - redhat-lsb-core + - readline-devel + - nano + - htop + diff --git a/roles/openGauss/tasks/os/Debian.yml b/roles/openGauss/tasks/os/Debian.yml new file mode 100644 index 0000000000000000000000000000000000000000..31f42991594ec5e13dcc06b472a7273b5761736b --- /dev/null +++ b/roles/openGauss/tasks/os/Debian.yml @@ -0,0 +1,8 @@ +- name: Install dependencies + apt: + name: + - libaio-dev + - flex + - bison + - patch + - readline-common \ No newline at end of file diff --git a/roles/openGauss/tasks/os/RedHat.yml b/roles/openGauss/tasks/os/RedHat.yml new file mode 100644 index 0000000000000000000000000000000000000000..7fa8834e1362ed6738c3dbdeaf8942e55d466670 --- /dev/null +++ b/roles/openGauss/tasks/os/RedHat.yml @@ -0,0 +1,14 @@ +- name: Disable firewalld + service: + name: firewalld + state: stopped + enabled: false + +- name: "Config MTU in /etc/sysconfig/network-scripts/ifcfg-{{ og_back_iface }}" + ini_file: + path: "/etc/sysconfig/network-scripts/ifcfg-{{ og_back_iface }}" + section: null + option: MTU + value: "{{ combined_vars.openGauss_env.iface_mtu }}" + backup: true + no_extra_spaces: true \ No newline at end of file diff --git a/roles/openGauss/tasks/os/common_set.yml b/roles/openGauss/tasks/os/common_set.yml new file mode 100644 index 0000000000000000000000000000000000000000..5f1e5f10bda9ea657edae86033d2dc71f084b44d --- /dev/null +++ b/roles/openGauss/tasks/os/common_set.yml @@ -0,0 +1,78 @@ +- name: Set hostname + hostname: + name: "opengauss{{ ansible_loop.index }}" + loop: "{{ groups['openGauss'] | sort }}" + loop_control: + extended: true + loop_var: node + label: "opengauss{{ ansible_loop.index }}" + when: "node == inventory_hostname" + +- name: Disable selinux + selinux: + state: disabled + when: "ansible_selinux.status != 'disabled'" + +- name: "Set timezone to {{ global_timezone | default('Asia/Shanghai') }}" + timezone: + name: "{{ global_timezone | default('Asia/Shanghai') }}" + +- name: Config /etc/systemd/logind.conf + ini_file: + path: /etc/systemd/logind.conf + section: Login + option: RemoveIPC + value: 'no' + +- name: Config /usr/lib/systemd/system/systemd-logind.service + ini_file: + path: /usr/lib/systemd/system/systemd-logind.service + section: Service + option: RemoveIPC + value: 'no' + register: systemd_logind + +- name: Restart systemd-logind.service + service: + name: systemd-logind + state: restarted + enabled: true + when: "systemd_logind is changed" + +- name: Disable history command logs + lineinfile: + path: /etc/profile + line: "HISTSIZE=0" + regex: "^HISTSIZE=" + backup: true + +- name: Install dependencies + package: + name: + - bzip2 + - expect + - net-tools + state: latest + update_cache: true + +- name: Config /etc/hosts + blockinfile: + path: /etc/hosts + marker: "# {mark} OPENGAUSS NODES" + block: | + {% for node in (groups['openGauss'] | sort) %} + {{ node }} opengauss{{ loop.index }} #Gauss OM IP Hosts Mapping + {% endfor %} + +- name: Get iface name + shell: "ip a | grep {{ backIp1 | default(inventory_hostname) }} | awk '{print $NF}'" + changed_when: false + register: backIface + +- name: Set og_back_iface + set_fact: + og_back_iface: "{{ backIface.stdout | trim }}" + +- name: Config MTU on the fly + command: "ifconfig {{ og_back_iface }} mtu {{ combined_vars.openGauss_env.iface_mtu }}" + changed_when: false \ No newline at end of file diff --git a/roles/openGauss/tasks/os/not_supported.yml b/roles/openGauss/tasks/os/not_supported.yml new file mode 100644 index 0000000000000000000000000000000000000000..253883e703099590ffebd3ff7a6a4162818569c0 --- /dev/null +++ b/roles/openGauss/tasks/os/not_supported.yml @@ -0,0 +1,5 @@ +- debug: + msg: "'{{ ansible_distribution }}' is not supported" + +- name: Play aborted + meta: end_play \ No newline at end of file diff --git a/roles/openGauss/tasks/runtime_facts.yml b/roles/openGauss/tasks/runtime_facts.yml new file mode 100644 index 0000000000000000000000000000000000000000..9006508f5e2f60538fc49d25a846fb0322bd7be1 --- /dev/null +++ b/roles/openGauss/tasks/runtime_facts.yml @@ -0,0 +1,19 @@ +- name: Set runtime facts + set_fact: + 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_home: "{{ combined_vars.openGauss_home }}" + og_paths: "{{ combined_vars.openGauss_paths }}" + og_pkg_url: "{{ combined_vars.openGauss_download[ansible_architecture][ansible_distribution + '_' + ansible_distribution_major_version] }}" + og_ver: "{{ combined_vars.openGauss_version }}" + og_ip_list: "{{ groups['openGauss'] | sort | join(',') }}" + og_host_list: >- + {%- for cm_node in (groups['openGauss'] | sort) -%} + opengauss{{ loop.index }}{{ (loop.nextitem is defined) | ternary(',', '') }} + {%- endfor -%} + og_hostname: >- + {%- for cm_node in (groups['openGauss'] | sort) if cm_node == inventory_hostname -%} + opengauss{{ loop.index }} + {%- endfor -%} + og_data_path: "{{ combined_vars.openGauss_paths.dataPath }}" diff --git a/roles/openGauss/templates/cluster_config.xml.j2 b/roles/openGauss/templates/cluster_config.xml.j2 new file mode 100644 index 0000000000000000000000000000000000000000..8485733e91c9018bd42258473b0538c7aed80fa5 --- /dev/null +++ b/roles/openGauss/templates/cluster_config.xml.j2 @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + +{% for node in (groups['openGauss'] | sort) %} + + + + + + + +{% 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/tests/inventory b/roles/openGauss/tests/inventory new file mode 100644 index 0000000000000000000000000000000000000000..878877b0776c44f55fc4e458f70840f31da5bb01 --- /dev/null +++ b/roles/openGauss/tests/inventory @@ -0,0 +1,2 @@ +localhost + diff --git a/roles/openGauss/tests/test.yml b/roles/openGauss/tests/test.yml new file mode 100644 index 0000000000000000000000000000000000000000..2943711ab483c60987f90d8e70612d9f5d8435d2 --- /dev/null +++ b/roles/openGauss/tests/test.yml @@ -0,0 +1,5 @@ +--- +- hosts: localhost + remote_user: root + roles: + - openGauss diff --git a/roles/openGauss/vars/main.yml b/roles/openGauss/vars/main.yml new file mode 100644 index 0000000000000000000000000000000000000000..d0bd0ac82c2c45d34e8c10b29d37fdb7df954ac7 --- /dev/null +++ b/roles/openGauss/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for openGauss diff --git a/roles/pre-tasks/README.md b/roles/pre-tasks/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/roles/pre-tasks/defaults/main.yml b/roles/pre-tasks/defaults/main.yml new file mode 100644 index 0000000000000000000000000000000000000000..573ac5e8e27e2089636328991605ba4d047a6b86 --- /dev/null +++ b/roles/pre-tasks/defaults/main.yml @@ -0,0 +1,2 @@ +--- +# defaults file for pre-tasks diff --git a/roles/pre-tasks/handlers/main.yml b/roles/pre-tasks/handlers/main.yml new file mode 100644 index 0000000000000000000000000000000000000000..4df3d0b3ad253f906b6b57163a49c3fd18483aa8 --- /dev/null +++ b/roles/pre-tasks/handlers/main.yml @@ -0,0 +1,2 @@ +--- +# handlers file for pre-tasks diff --git a/roles/pre-tasks/meta/main.yml b/roles/pre-tasks/meta/main.yml new file mode 100644 index 0000000000000000000000000000000000000000..c572acc9f8b466bea50f2799b0ca1956418b862c --- /dev/null +++ b/roles/pre-tasks/meta/main.yml @@ -0,0 +1,52 @@ +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/tasks/Kylin Linux Advanced Server.yml b/roles/pre-tasks/tasks/Kylin Linux Advanced Server.yml new file mode 100644 index 0000000000000000000000000000000000000000..3034251b8b24ea70617cb916432c01c73c1a9615 --- /dev/null +++ b/roles/pre-tasks/tasks/Kylin Linux Advanced Server.yml @@ -0,0 +1,3 @@ +- name: Set custom vars + set_fact: + custom_pkg_mgr: dnf diff --git a/roles/pre-tasks/tasks/main.yml b/roles/pre-tasks/tasks/main.yml new file mode 100644 index 0000000000000000000000000000000000000000..d52820f31a71853b9a4a76bd833697ccfe2ee7a4 --- /dev/null +++ b/roles/pre-tasks/tasks/main.yml @@ -0,0 +1,39 @@ +--- +# tasks file for pre-tasks + +- name: Set timezone + set_fact: + global_timezone: "Asia/Shanghai" + when: global_timezone 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}'" + changed_when: false + register: iface_name + + - name: Set 'global_bond_iface' var + 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 python vars + 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 }}" + with_first_found: + - files: + - "{{ ansible_distribution }}.yml" + - "{{ ansible_os_family }}.yml" + skip: true diff --git a/roles/pre-tasks/tasks/vars_combine.yml b/roles/pre-tasks/tasks/vars_combine.yml new file mode 100644 index 0000000000000000000000000000000000000000..4d90e6c5e23c7aa3c46f3d8b2176243231c6ec1b --- /dev/null +++ b/roles/pre-tasks/tasks/vars_combine.yml @@ -0,0 +1,50 @@ +- name: Combine default vars and custom vars + block: + - name: "Include role's defaults vars" + ansible.builtin.include_vars: + dir: "{{ item }}/defaults" + name: "temp_role_vars" + loop: "{{ ansible_parent_role_paths }}" + + # - debug: + # msg: "{{ temp_role_vars }}" + + - name: Assembling group vars files + assemble: + src: "{{ inventory_dir }}/group_vars" + dest: "{{ inventory_dir }}/assembled_vars/{{ group_names | hash('md5') }}.yml" + regexp: "({{ group_names | join('|') }})" + delegate_to: localhost + become: false + run_once: true + + - name: "Include group custom vars" + ansible.builtin.include_vars: + file: "{{ inventory_dir }}/assembled_vars/{{ group_names | hash('md5') }}.yml" + name: "temp_group_vars" + + # - debug: + # msg: "{{ temp_group_vars }}" + + - name: Combine vars from role and groups + set_fact: + combined_vars: "{{ role_vars | combine(group_vars, recursive=true) }}" + vars: + role_vars: "{{ lookup('vars', 'temp_role_vars') }}" + group_vars: "{{ lookup('vars', 'temp_group_vars') }}" + + + # - debug: + # msg: "{{ combined_vars }}" + + # - meta: end_play + + rescue: + - name: "Create {{ inventory_dir }}/assembled_vars" + file: + path: "{{ inventory_dir }}/assembled_vars" + state: directory + delegate_to: localhost + become: false + + - include_tasks: vars_combine.yml \ No newline at end of file diff --git a/roles/pre-tasks/tests/inventory b/roles/pre-tasks/tests/inventory new file mode 100644 index 0000000000000000000000000000000000000000..878877b0776c44f55fc4e458f70840f31da5bb01 --- /dev/null +++ b/roles/pre-tasks/tests/inventory @@ -0,0 +1,2 @@ +localhost + diff --git a/roles/pre-tasks/tests/test.yml b/roles/pre-tasks/tests/test.yml new file mode 100644 index 0000000000000000000000000000000000000000..37fcbce5713d1794a6ec5af6c377ae9ae639fcf3 --- /dev/null +++ b/roles/pre-tasks/tests/test.yml @@ -0,0 +1,5 @@ +--- +- hosts: localhost + remote_user: root + roles: + - pre-tasks diff --git a/roles/pre-tasks/vars/main.yml b/roles/pre-tasks/vars/main.yml new file mode 100644 index 0000000000000000000000000000000000000000..eacdecbc9802140ded0631a310a2f8132b26a691 --- /dev/null +++ b/roles/pre-tasks/vars/main.yml @@ -0,0 +1,2 @@ +--- +# vars file for pre-tasks