使用 ansible 安装 PostgreSQL 11 到 CentOS 8
主持人的准备
我们将准备以下主机作为ansible的hosts。
[ansible@mng053 playbooks]$ cat /etc/ansible/hosts
all:
children:
centos8:
hosts:
192.168.0.54:
postgre11:
hosts:
192.168.0.54:
准备Playbook。
在中国母语中,以下是Playbook的内容列表。
[ansible@mng053 playbooks]$ cat /etc/ansible/playbooks/postgresql.yml
⁻⁻⁻
- hosts: postgre11
vars:
pg_owner: postgres
pg_group: postgres
directory_pgdata: /var/lib/pgsql
remote_user: root
tasks:
- name: test connection
ping:
- name: Group Add
group:
name: "{{ pg_group}}"
- name: User Add
user:
name: "{{ pg_owner }}"
group: "{{ pg_group }}"
- name: Make Directory for DB Cluster
file:
path: "{{ directory_pgdata }}"
state: directory
owner: "{{ pg_owner }}"
group: "{{ pg_group }}"
mode: '0755'
- name: install Postgresql repository
dnf:
name: https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
- name: install postgresql
dnf:
name: postgresql-server,libicu,postgresql-contrib
enablerepo: pgdg11
state: latest
- name: Check DB Cluster
stat:
path: "{{ directory_pgdata }}/data/postgresql.conf"
register: conf_pgdata
- name: Create DB Cluster
become: yes
become_user: "{{ pg_owner }}"
become_method: su
shell: /usr/bin/initdb -D "{{ directory_pgdata }}/data"
when: conf_pgdata.stat.exists == false
- name: Auto Start
systemd:
name: postgresql
enabled: yes
Playbook(任务书)的解说
平
- name: test connection
ping:
在这里,如果通信验证失败,后续处理将不会进行,因此最好先进行通信验证。
团体
- name: Group Add
group:
name: "{{ pg_group}}"
创建一个用于PostgreSQL的群组
请用中文将以下内容进行释义,只需要一个选项:
用户
- name: User Add
user:
name: "{{ pg_owner }}"
group: "{{ pg_group }}"
创建一个用于PostgreSQL的用户
文件
- name: Make Directory for DB Cluster
file:
path: "{{ directory_pgdata }}"
state: directory
owner: "{{ pg_owner }}"
group: "{{ pg_group }}"
mode: '0755'
为DB集群创建目录。
创建目录也可使用”file”模块。通过将state设置为”directory”,可以创建目录。
由于此次指定为默认值,所以安装时将自动创建,但还是推荐创建。
《地下城与勇士》
- name: install Postgresql repository
dnf:
name: https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
- name: install postgresql
dnf:
name: postgresql-server,libicu,postgresql-contrib
enablerepo: pgdg11
state: latest
从 CentOS8 开始,不再使用 yum 命令,而是使用 dnf 命令。
第一个 dnf 模块处理是添加 PostgreSQL 仓库。
第二个 dnf 模块处理是安装包 “postgresql-server,libicu,postgresql-contrib”。
由于 PostgreSQL 仓库有多个版本可用,因此在 enablerepo 中指定了我们想要引入的 PostgreSQL11 仓库。
[root@dbpg054 ~]# dnf repolist | grep PostgreSQL
Last metadata expiration check: 0:00:11 ago on Mon 13 Apr 2020 11:35:31 PM JST.
pgdg-common PostgreSQL common for RHEL/CentOS 8 - x86_64 302
pgdg10 PostgreSQL 10 for RHEL/CentOS 8 - x86_64 274
pgdg11 PostgreSQL 11 for RHEL/CentOS 8 - x86_64 295
pgdg12 PostgreSQL 12 for RHEL/CentOS 8 - x86_64 223
pgdg94 PostgreSQL 9.4 for RHEL/CentOS 8 - x86_64 341
pgdg95 PostgreSQL 9.5 for RHEL/CentOS 8 - x86_64 158
pgdg96 PostgreSQL 9.6 for RHEL/CentOS 8 - x86_64 258
数据
- name: Check DB Cluster
stat:
path: "{{ directory_pgdata }}/data/postgresql.conf"
register: conf_pgdata
将要在后续使用的PostgreSQL配置文件的完整路径设置为”conf_pgdata”。
外壳
- name: Create DB Cluster
become: yes
become_user: "{{ pg_owner }}"
become_method: su
shell: /usr/bin/initdb -D "{{ directory_pgdata }}/data"
when: conf_pgdata.stat.exists == false
Shell会执行命令。使用initdb命令创建数据库集群。
由于这个模块确实不存在,所以只能无奈地使用shell来执行命令。
在这个playbook中,我们使用remote_user: root和root用户进行连接。如果需要更改用户,可以使用become〜来更改用户。
在这里,当指定执行条件时,它指的是前面定义的stat在conf_pgdata中没有文件的情况下执行。
无论多次执行相同的 Playbook,Ansible 都能得到相同的结果(具备幂等性)。我已经亲身感受到它能够完美地保证这一点,因此我觉得使用起来非常轻松。
需要一种处理方法,能够跳过那些不能够被多次执行的部分。
systemd:服务管理系统
- name: Auto Start
systemd:
name: postgresql
enabled: yes
在CentOS7中引入的systemd中启用了PostgreSQL的操作系统启动时自动启动的设置。
由于本次使用的是在安装PostgreSQL时引入的服务文件,所以仅启用而不进行修改。
执行Playbook
执行结果如下。
[ansible@mng053 playbooks]$ ansible-playbook /etc/ansible/playbooks/postgresql.ymml
PLAY [postgre11] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.0.54]
TASK [test connection] *********************************************************
ok: [192.168.0.54]
TASK [Group Add] ***************************************************************
changed: [192.168.0.54]
TASK [User Add] ****************************************************************
changed: [192.168.0.54]
TASK [Make Directory for DB Cluster] *******************************************
changed: [192.168.0.54]
TASK [install Postgresql repository] *******************************************
changed: [192.168.0.54]
TASK [install postgresql] ******************************************************
changed: [192.168.0.54]
TASK [Check DB Cluster] ********************************************************
ok: [192.168.0.54]
TASK [Create DB Cluster] *******************************************************
[WARNING]: Module remote_tmp /home/postgres/.ansible/tmp did not exist and was
created with a mode of 0700, this may cause issues when running as another
user. To avoid this, create the remote_tmp dir with the correct permissions
manually
changed: [192.168.0.54]
TASK [Auto Start] **************************************************************
changed: [192.168.0.54]
PLAY RECAP *********************************************************************
192.168.0.54 : ok=10 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
第二次执行的结果如下:与10个任务中有7个任务发生了变化。很幸运没有出现问题。
[ansible@mng053 playbooks]$ ansible-playbook /etc/ansible/playbooks/postgresql.yml
PLAY [postgre11] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [192.168.0.54]
TASK [test connection] *********************************************************
ok: [192.168.0.54]
TASK [Group Add] ***************************************************************
ok: [192.168.0.54]
TASK [User Add] ****************************************************************
ok: [192.168.0.54]
TASK [Make Directory for DB Cluster] *******************************************
ok: [192.168.0.54]
TASK [install Postgresql repository] *******************************************
ok: [192.168.0.54]
TASK [install postgresql] ******************************************************
ok: [192.168.0.54]
TASK [Check DB Cluster] ********************************************************
ok: [192.168.0.54]
TASK [Create DB Cluster] *******************************************************
skipping: [192.168.0.54]
TASK [Auto Start] **************************************************************
ok: [192.168.0.54]
PLAY RECAP *********************************************************************
192.168.0.54 : ok=9 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
由于跳过了创建DB集群的步骤,结果显示有9个“ok”,1个“skip”。
在数据库服务器上确认结果
服务的自动启动
我确认了自动启动设置已经被设定好。
[root@dbpg054 ~]# systemctl list-unit-files | grep postgresql.service
postgresql.service enabled
启动PostgreSQL
确认处于停止状态后,进行启动。
[root@dbpg054 ~]# systemctl status postgresql
● postgresql.service - PostgreSQL database server
Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled; vendor >
Active: inactive (dead)
[root@dbpg054 ~]# systemctl start postgresql
[root@dbpg054 ~]# systemctl status postgresql
● postgresql.service - PostgreSQL database server
Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled; vendor >
Active: active (running) since Mon 2020-04-13 23:09:50 JST; 27s ago
Process: 25524 ExecStartPre=/usr/libexec/postgresql-check-db-dir postgresql (>
Main PID: 25526 (postmaster)
Tasks: 8 (limit: 11080)
Memory: 16.1M
CGroup: /system.slice/postgresql.service
tq25526 /usr/bin/postmaster -D /var/lib/pgsql/data
tq25528 postgres: logger process
tq25530 postgres: checkpointer process
tq25531 postgres: writer process
tq25532 postgres: wal writer process
tq25533 postgres: autovacuum launcher process
tq25534 postgres: stats collector process
mq25535 postgres: bgworker: logical replication launcher
Apr 13 23:09:49 dbpg054.localdomain systemd[1]: Starting PostgreSQL database se>
Apr 13 23:09:49 dbpg054.localdomain postmaster[25526]: 2020-04-13 23:09:49.596 >
Apr 13 23:09:49 dbpg054.localdomain postmaster[25526]: 2020-04-13 23:09:49.596 >
Apr 13 23:09:49 dbpg054.localdomain postmaster[25526]: 2020-04-13 23:09:49.672 >
Apr 13 23:09:49 dbpg054.localdomain postmaster[25526]: 2020-04-13 23:09:49.821 >
Apr 13 23:09:49 dbpg054.localdomain postmaster[25526]: 2020-04-13 23:09:49.903
顺利启动了。
今天就到这里吧!
通过触摸的体验,给出我的感受
只需要一个选项:意识到幂等性的重要性是非常重要的。我认为这是能够轻松执行Ansible的一个要素。
由于PostgreSQL和Ansible都是我第一次接触,所以我在查阅双方的手册的同时,逐渐编写了Playbook。
如果能够严格遵守幂等性,那么即使稍微改进Playbook,也能轻松地多次执行相同的Playbook。
我认为,shell模块应该作为最后的手段。最好还是使用提供的模块。通常的模块都能确保幂等性,但是shell模块需要自己进行调整。如果自己不断调整,甚至可以通过ssh等方式直接运行脚本来完成,那么引入Ansible的价值就减半了…我这么想。