更新升级 专属应用 系统故障 硬件故障 电脑汽车 鸿蒙刷机 鸿蒙开发Linux教程 鸿蒙开发Linux命令
当前位置:HMXT之家 > 鸿蒙开发Linux教程 > 在Linux上使用Ansible管理PostgreSQL数据库

在Linux上使用Ansible管理PostgreSQL数据库

更新时间:2023-05-17 09:43:18浏览次数:565+次

本文介绍如何在Linux系统上使用Ansible管理PostgreSQL数据库的方法,在配置完成后,将能够使用Ansible管理PostgreSQL,即创建/删除数据库、创建/删除/升级用户、权限管理等。

在Linux上使用Ansible管理PostgreSQL数据库的详细方法

步骤1:在控制节点上安装Ansible的说明

首先,确保您已经在控制节点上安装了Ansible。可参考在Ubuntu/RHEL/CentOS/Rocky/macOS上安装Ansible一文,阅读地址在https://www.hmxthome.com/linux/5162.html。

步骤2:创建Ansible库存文件

在本文中,我们将使用ansible.cfg和hosts文件运行Ansible Playbook。此配置是指定目标机器的Playbook所期望的。

按如下方式编辑ansible.cfg文件:

sudo vi /etc/ansible/ansible.cfg

在文件中,在默认情况下添加以下行:

[defaults]

inventory = hosts

编辑hosts文件:

sudo vi /etc/ansible/hosts

在文件中,在突出显示的区域中添加以下行以替换您的IP地址。可以在此处放置多个IP地址:

[app1]

192.168.1.18 ansible_ssh_user=your_username

注:your_username是您的用户名。

为控制节点上的托管节点生成ssh密钥,替换username@192.168.1.19用自己的:

ssh-copy-id username@192.168.1.18

步骤3:创建Ansible变量文件

我们将需要我们的Playbook的引用vars.yml文件来外部化配置。这使得Playbook可以重复使用。在变量文件中,我们将放置数据库用户、数据库名称和密码:

sudo vi /etc/ansible/vars.yml

在文件中,添加以下行:

db_user: admin

db_password: Passw0rd

db_name: testdb

步骤4:为PostgreSQL创建Ansible Playbook

Ansible Playbook是一个YAML文件,其中包含要在指定主机或特定组上执行的所有任务和角色的列表。我们需要安装PostgreSQL数据库本身以及python3-psycopg2 Python库,这将允许我们使用可解析的PostgreSQL模块,即postgresql_db、postgresql_user、postgresql_pg_hba和postgresql_privs:

sudo vi /etc/ansible/postgresql.yml

然后添加下面的行:

---

- hosts: all

  become: yes

  vars_files:

    - vars.yml

  pre_tasks:

    - name: "Install packages"

      dnf: "name={{ item }} state=present"

      with_items:

        - postgresql

        - postgresql-server

    - name: "Install Python packages"

      yum: "name={{ item }}  state=present"

      with_items:

        - python3-psycopg2

  tasks:

    - name: "Find out if PostgreSQL is initialized"

      ansible.builtin.stat:

        path: "/var/lib/pgsql/data/pg_hba.conf"

      register: postgres_data

    - name: "Initialize PostgreSQL"

      shell: "postgresql-setup initdb"

      when: not postgres_data.stat.exists

    - name: "Start and enable services"

      service: "name={{ item }} state=started enabled=yes"

      with_items:

        - postgresql

  handlers:

    - name: restart postgres

      service: name=postgresql state=restarted

在Playbook中,我们参考了vars.yml文件,并在创建的hosts文件中指定了要在所有主机上运行的任务。

在pre_tasks中,为目标系统安装了所有必要的包,例如允许Ansible模块交互的Python包。

步骤5:创建数据库和数据库用户

尽管如此,在Playbook文件中,我们将:

1]、为我们的应用程序testdb创建一个数据库。

2]、为数据库创建新用户。

3]、授予用户对创建的数据库的访问权限。

4]、修改pg_hba.conf文件以允许用户使用连接字符串进行连接。

  tasks:

    - name: "Create app database"

      postgresql_db:

        state: present

        name: "{{ db_name }}"

      become: yes

      become_user: postgres

    - name: "Create db user"

      postgresql_user:

        state: present

        name: "{{ db_user }}"

        password: "{{ db_password }}"

      become: yes

      become_user: postgres

    - name: "Grant db user access to app db"

      postgresql_privs:

        type: database

        database: "{{ db_name }}"

        roles: "{{ db_user }}"

        grant_option: no

        privs: all

      become: yes

      become_user: postgres

    - name: "Allow md5 connection for the db user"

      postgresql_pg_hba:

        dest: "~/data/pg_hba.conf"

        contype: host

        databases: all

        method: md5

        users: "{{ db_user }}"

        create: true

      become: yes

      become_user: postgres

      notify: restart postgres

在这里,我们使用vars文件中设置的数据库名称、用户和密码。

步骤6:对数据库运行SQL脚本

最后,我们需要在数据库中创建一个表。我们将通过从现有数据库创建一个SQL文件来添加一些伪数据,该文件将被导入到我们的新数据库中。在Playbook文件中,添加以下行:

    - name: "Add some dummy data to our database"

      become: true

      become_user: postgres

      shell: psql {{ db_name }} < /tmp/dump.sql

现在,您的最终Playbook文件应该如下所示:

---

- hosts: all

  become: yes

  vars_files:

    - vars.yml

  pre_tasks:

    - name: "Install packages"

      dnf: "name={{ item }} state=present"

      with_items:

        - postgresql

        - postgresql-server

    - name: "Install packages"

      yum : "name={{ item }} state=present"

      with_items:

        - python3-psycopg2

  tasks:

    - name: "Find out if PostgreSQL is initialized"

      ansible.builtin.stat:

        path: "/var/lib/pgsql/data/pg_hba.conf"

      register: postgres_data

    - name: "Initialize PostgreSQL"

      shell: "postgresql-setup initdb"

      when: not postgres_data.stat.exists

    - name: "Start and enable services"

      service: "name={{ item }} state=started enabled=yes"

      with_items:

        - postgresql

    - name: "Create app database"

      postgresql_db:

        state: present

        name: "{{ db_name }}"

      become: yes

      become_user: postgres

    - name: "Create db user"

      postgresql_user:

        state: present

        name: "{{ db_user }}"

        password: "{{ db_password }}"

      become: yes

      become_user: postgres

    - name: "Grant db user access to app db"

      postgresql_privs:

        type: database

        database: "{{ db_name }}"

        roles: "{{ db_user }}"

        grant_option: no

        privs: all

      become: yes

      become_user: postgres

    - name: "Allow md5 connection for the db user"

      postgresql_pg_hba:

        dest: "~/data/pg_hba.conf"

        contype: host

        databases: all

        method: md5

        users: "{{ db_user }}"

        create: true

      become: yes

      become_user: postgres

      notify: restart postgres

    - name: "Add some dummy data to our database"

      become: true

      become_user: postgres

      shell: psql {{ db_name }} < /tmp/dump.sql

  handlers:

    - name: restart postgres

      service: name=postgresql state=restarted

步骤7:在托管节点上创建SQL文件

在Managed Node上创建伪SQL文件,如下所示:

sudo vi /tmp/dump.sql

现在,在文件中,添加一些关于如何创建表和向表中添加一些数据的简单命令:

CREATE TABLE IF NOT EXISTS test (

  message varchar(255) NOT NULL

  );

  INSERT INTO test(message) VALUES('Ansible is fun');

ALTER TABLE test OWNER TO "admin";

现在更改文件的所有权:

sudo chmod -R a+rwX /tmp/dump.sql

第六步:运行并测试新的Playbook

现在,我们准备在主机上运行该Playbook:

ansible-playbook -i hosts postgresql.yml

如果一切顺利,您应该会看到以下输出信息:

PLAY [all] **************************

TASK [Gathering Facts] *************

ok: [192.168.1.18]

TASK [Install packages] *************

ok: [192.168.1.18] => (item=['postgresql', 'postgresql-server'])

TASK [Install packages] *************

ok: [192.168.1.18] => (item=['python3-psycopg2'])

TASK [Find out if PostgreSQL is initialized] *************

ok: [192.168.1.18]

TASK [Initialize PostgreSQL] *************

skipping: [192.168.1.18]

TASK [Start and enable services] *************

ok: [192.168.1.18] => (item=postgresql)

TASK [Create app database] *************

ok: [192.168.1.18]

TASK [Create db user] *************

[WARNING]: Module did not set no_log for no_password_changes

ok: [192.168.1.18]

TASK [Grant db user access to app db] *************

ok: [192.168.1.18]

TASK [Allow md5 connection for the db user] *************

ok: [192.168.1.18]

TASK [Add some dummy data to our database] *************

changed: [192.168.1.18]

PLAY RECAP **************************

192.168.1.18               : ok=10   changed=1    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

下面,我们验证托管节点上的已创建数据库:

让我们验证数据库testdb是否已经创建并且其中有数据:

psql testdb -h localhost -U admin

样本输出如下图所示:

\

至此,验证托管节点上的已创建数据库成功,达到了预期的目标。