使用 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的价值就减半了…我这么想。

广告
将在 10 秒后关闭
bannerAds