更新时间: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
样本输出如下图所示:
至此,验证托管节点上的已创建数据库成功,达到了预期的目标。
相关资讯