RH358配置MariaDB SQL数据库--自动化部署MariaDB

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: RH358配置MariaDB SQL数据库--自动化部署MariaDB

RH358配置MariaDB SQL数据库–自动化部署MariaDB

本章节介绍如何使用Ansible对MariaDB进行一系列的操作。有些场景下,可提高工作效率。

RH358专栏地址:https://blog.csdn.net/qq_41765918/category_11532281.html

1. Ansible部署MariaDB

使用Ansible部署MariaDB服务器和客户端遵循一个标准流程。

安装MariaDB服务器

# 使用yum Ansible模块安装mariadb-server包。mariadb-server包包含必要的客户机软件。
- name: Install mariadb-server package
  yum:
    name: mariadb-server
    state: present
# 注意:作为一种替代方法,可以使用dnf Ansible模块来安装特定的AppStream模块的MariaDB:
- name: Use MariaDB 10.3 AppStream module
  dnf:
    name: '@mariadb:10.3/server'
    state: present

# 使用Ansible service模块启用并启动mariadb服务。
- name: Enable and start mariadb
  service:
    name: mariadb
    state: started
    enabled: yes

# 使用Ansible firewalld模块打开MariaDB数据库服务器的端口。
- name: Firewall permits mysql service
  firewalld:
    service: mysql
    permanent: true
    state: enabled
    immediate: yes

安装MariaDB客户端

使用yum Ansible模块安装mariadb包,安装客户端而不使用server。

- name: Install mariadb client package
  yum:
    name: mariadb
    state: present

2. 使用Ansible配置安全化的MariaDB

MariaDB服务器安装时默认login_user为root,没有密码。要作为幂等策略的一部分保护根用户的帐户,您必须创建一个任务来为根用户分配密码。然后,第二个任务必须将包含根用户凭据的.my.cnf文件复制到MariaDB服务器主机上根用户的主目录。通过从文件中读取新的凭据而不重置默认根用户,剧本的后续运行将获得成功。

满足Ansible先决条件

为了让mysql_user和mysql_db Ansible模块在你的托管主机上工作,你需要确保python3-PyMySQL或python2-PyMySQL包安装在托管主机上,这取决于Ansible在该主机上使用的Python版本。

- name: Make sure mysql_user module prereqs are installed
  yum:
    name: python3-PyMySQL
    state: present

更新MariaDB Root帐号

使用mysql_user Ansible模块从mysql数据库中添加或删除用户。在下面的剧本任务中,为MariaDB root用户帐户分配了一个密码

- name: Assign password to MariaDB root user
  mysql_user:
    name: root
    host_all: yes
    update_password: always
    password: root_password
  no_log: yes

第二个剧本任务使用copy Ansible模块将根用户的凭据文件files/my.cnf复制到MariaDB服务器主机上的/root/.my.cnf

- name: Authentication credentials copied to root home directory
  copy:
    src: files/my.cnf
    dest: /root/.my.cnf

删除匿名用户帐户

使用mysql_user Ansible模块删除任何匿名用户帐户。

- name: Remove anonymous user accounts
  mysql_user:
    name: ''
    host_all: yes
    state: absent

删除测试数据库

一些较旧的MariaDB安装可能包含一个不安全的测试数据库,用于演示和实验目的。您可以使用mysql_db Ansible模块来确保从数据库服务器中删除它。

- name: Remove test database
  mysql_db:
    name: test
    state: absent

3. 使用Ansible管理MariaDB用户

Ansible Vault用于加密用于存储用户名和密码变量的文件。这避免了在剧本中暴露明文密码。

使用Ansible Vault保护用户密码

使用加密的Ansible Vault组变量文件安全地存储用户名和密码。本例中为password.yml文件位于与目录文件中的group_name组相关联的inventory中。

[user@host ansible]$ cat inventory
[group_name]
hosta.lab.example.com

# 要创建一个Ansible Vault组变量文件:
[user@host ansible]$ ansible-vault create group_vars/group_name/password.yml
New Vault password: vault_password
Confirm New Vault password: vault_password
mysql_user_passwords:
- name: john
password: john_password
- name: steve
password: steve_password

创建和删除用户

下面的示例剧本任务引用在加密密码中创建的名称和密码变量password.yml文件。当剧本执行时,提示您输入用于创建密码的Ansible Vault密码。

- name: Create users and set password if not present
  mysql_user:
    name: "{
    { item['name'] }}"
    password: "{
    { item['password'] }}"
    update_password: on_create
    state: present
  loop: "{
    { mysql_user_passwords }}"
  no_log: yes

重要:updated_password: on_create设置在这里很重要,因为它只在用户不存在时更新用户的密码。否则,每次包含此任务的剧本运行都会将密码重置为其原始的初始设置。如果用户在创建帐户后更新了他们的密码,这可能是一个问题

确保用户帐户不存在,如果存在就删除它,方法是指定state:mysql_user模块的用户名为absent。

- name: User does not exist for any host
  mysql_user:
    name: "{
    { removed_user }}"
    host_all: yes
    state: absent

授予和撤销权限

使用组变量文件存储用户访问权限。在本例中,users.yml文件位于与目录文件中的group_name组相关联的清单中

play的任务遍历mysqL_users:变量列表中声明的每个用户帐户,并相应地分配权限。例如,使用了用户john的变量声明在剧本的任务中分配特权相当于GRANT SELECT, UPDATE, DELETE,INSERT ON inventory.* TO john’@'localhost; MariaDB命令(将目录数据库中所有表的权限授予john@localhost)。

样本group_vars/group_name/users.yml文件:

---
mysql_users:
  - name: john
    host: localhost
    priv: 'inventory.*:INSERT,UPDATE,DELETE,SELECT'
    state: present
  - name: steve
    host: '%'
    priv: 'inventory.*:SELECT'
    state: present

# 剧本的任务是:
- name: Configure users in MariaDB inventory
  mysql_user:
    name: "{
    { item['name'] }}"
    host: "{
    { item['host'] }}"
    priv: "{
    { item['priv'] }}"
    state: "{
    { item['state'] }}"
  loop: "{
    { mysql_users }}"

# 撤销一个用户的特权,并将其还原为新用户拥有的最小权限:
- name: Ensure user only has minimal privileges, on all hosts
  mysql_user:
    name: "{
    { revoked_user }}"
    priv: "*.*:USAGE"
    host_all: yes
    state: present

4. 用Ansible创建和恢复备份文件

mysql_db Ansible模块用于执行创建(dump)和恢复(import)操作

创建数据库备份文件

下面的剧本任务使用mysql_db Ansible模块,将state参数设置为dump,以创建inventory数据库的备份。target参数指定要将备份文件存储在何处。

- name: Backup inventory database
  mysql_db:
    state: dump
    name: inventory
    target: /srv/inventory.dump

从备份文件恢复数据库

# 在下面的剧本中,第一个任务使用mysql_db Ansible模块来测试MariaDB中是否存在inventory数据库。结果存储在inventory_present变量中。
- name: Make sure an inventory database exists
  mysql_db:
    name: inventory
    state: present
  register: inventory_present

# 第二个任务使用stat Ansible模块来测试inventory.dump备份文件是否存。结果存储在inventory_present变量中。
- name: Is inventory database backup present?
  stat:
    path: /srv/inventory.dump
  register: inventory_bkup

# 剧本的第三个也是最后一个任务评估inventory_present变量,以确定inventory数据库是否仍然存在(没有任何变化),以及inventory y_bkup变量结果是否表明目标inventory备份文件存在。
- name: Import inventory backup data
  mysql_db:
    name: inventory
    state: import
    target: /srv/inventory.dump
  when:
    - inventory_present['changed'] == false
    - inventory_bkup['stat']['exists'] == true

5. 课本练习

[student@workstation ~]$ lab database-automation start

这个命令确保从servera和serverb删除MariaDB数据库服务器和客户端之前的任何安装。

1. 查看~/database-auto项目目录的结构和内容,熟悉为本练习提供的文件。

[student@workstation ~]$ cd ~/database-auto
[student@workstation database-auto]$ tree
.
├── ansible.cfg
├── configure_mariadb_security.yml
├── configure_users.yml
├── dump_inventory_db.yml
├── files
│   ├── inventory-database.sql
│   └── my.cnf
├── import_inventory_db.yml
├── install_mariadb_client.yml
├── install_mariadb_server.yml
├── inventory
├── restore_inventory_db.yml
└── solutions
    ├── configure_mariadb_security.yml.solution
    ├── configure_users.yml.solution
    ├── dump_inventory_db.yml.solution
    ├── import_inventory_db.yml.solution
    ├── install_mariadb_client.yml.solution
    ├── install_mariadb_server.yml.solution
    └── restore_inventory_db.yml.solution

2 directories, 18 files
[student@workstation database-auto]$ cat ansible.cfg
[defaults]
inventory=./inventory
remote_user=devops

[privilege_escalation]
become = False
become_method = sudo
become_user = root
become_ask_pass = False
[student@workstation database-auto]$ cat inventory
[control_node]
workstation.lab.example.com

[db_servers]
servera.lab.example.com

[db_clients]
serverb.lab.example.com

2. 完成名为install_mariadb_server.yml的Ansible Playbook。

servera上安装MariaDB服务器。配置playbook以启动和启用mariadb服务,并将mysql服务添加到防火墙中。更新MariaDB root帐号,以redhat作为密码。

[student@workstation database-auto]$ vim install_mariadb_server.yml
---
- name: Install MariaDB server
  hosts: db_servers
  become: yes

  tasks:
  - name: Install mariadb-server package
    yum:
      name: mariadb-server
      state: present

  - name: Enable and start mariadb
    service:
      name: mariadb
      state: started
      enabled: yes

  - name: Firewall permits mysql service
    firewalld:
      service: mysql
      permanent: true
      state: enabled
      immediate: yes

[student@workstation database-auto]$ ansible-playbook install_mariadb_server.yml --syntax-check
[student@workstation database-auto]$ ansible-playbook install_mariadb_server.yml

3. 完成名为install_mariadb_client.yml的Ansible Playbook。

在serverb安装MariaDB客户端。配置剧本以运行安装mariadb客户端包的单个任务。在客户端主机上不需要其他配置。

[student@workstation database-auto]$ vim install_mariadb_client.yml 
---
- name: Install MariaDB client
  hosts: db_clients
  become: yes

  tasks:
    - name: Install mariadb client package
      yum:
        name: mariadb
        state: present

[student@workstation database-auto]$ ansible-playbook install_mariadb_client.yml --syntax-check
[student@workstation database-auto]$ ansible-playbook install_mariadb_client.yml

4. 创建一个名为~/database-auto/group_vars/db_servers/vault.yml的加密文件。

# 存储MariaDB root用户密码的变量值。
[student@workstation database-auto]$ ansible-vault create group_vars/db_servers/vault.yml
New Vault password: fedora
Confirm New Vault password: fedora
pw: redhat

[student@workstation database-auto]$ ansible-vault view group_vars/db_servers/vault.yml
Vault password: fedora
pw: redhat

5. 完成名为configure_mariadb_security.yml的Ansible Playbook。

执行以下任务:

  • 使用db_servers主机组将servera上的MariaDB数据库作为配置目标。

  • 更新MariaDB root用户密码。

  • 将身份验证凭据复制到servera上用root户的主目录。

  • 删除所有匿名用户帐户。

  • 如果存在test数据库,则删除它。

[student@workstation database-auto]$ vim configure_mariadb_security.yml 
---
- name: Securing MariaDB
  hosts: db_servers
  become: yes

  tasks:
    - name: Assign password to MariaDB root user
      mysql_user:
        name: root
        host_all: yes
        update_password: always
        password: "{
    { pw }}"

    - name: Authentication credentials copied to root home directory
      copy:
        src: files/my.cnf
        dest: /root/.my.cnf

    - name: Remove anonymous user accounts
      mysql_user:
        name: ''
        host_all: yes
        state: absent

    - name: Remove test database
      mysql_db:
        name: test
        state: absent

[student@workstation database-auto]$ ansible-playbook --syntax-check configure_mariadb_security.yml
[student@workstation database-auto]$ ansible-playbook \
 --vault-id @prompt configure_mariadb_security.yml

6. 完成名为restore_inventory_db.yml的Ansible Playbook。

执行以下任务:

  • 使用db_servers目录组作为配置目标servera

  • 创建inventory数据库,如果不存在。

  • 如果不存在inventory数据库的先前备份,则将其复制到servera

  • 从备份数据恢复inventory数据库。

[student@workstation database-auto]$ cat restore_inventory_db.yml 
---
- name: Restore inventory database if not present
  hosts: db_servers
  become: yes

  tasks:
    - name: Make sure inventory database exists
      mysql_db:
        name: inventory
        state: present
      register: inventory_present

    - name: Is inventory database backup present?
      stat:
        path: /srv/inventory-database.sql
      register: inventory_bkup

    - name: Copy database backup file to host if not present
      copy:
        src: files/inventory-database.sql
        dest: /srv
      when:
        - inventory_present['changed'] == true
        - inventory_bkup['stat']['exists'] == false

    - name: Restore inventory backup data
      mysql_db:
        name: inventory
        state: import
        target: /srv/inventory-database.sql
      when: inventory_present['changed'] == true

[student@workstation database-auto]$ ansible-playbook \
 --syntax-check restore_inventory_db.yml
playbook: restore_inventory_db.yml
[student@workstation database-auto]$ ansible-playbook \
 --vault-id @prompt restore_inventory_db.yml
Vault password (default): fedora

7. 完成名为dump_inventory_db.yml的剧本。

创建inventory数据库的附加备份。将备份文件存放在servera的/home/student/inventory.dump中。

[student@workstation database-auto]$ vim dump_inventory_db.yml 
---
- name: Database backup
  hosts: db_servers
  become: yes

  tasks:
    - name: Backup inventory database
      mysql_db:
        state: dump
        name: inventory
        target: /home/student/inventory.dump

[student@workstation database-auto]$ ansible-playbook \
--syntax-check dump_inventory_db.yml
playbook: dump_inventory_db.yml
[student@workstation database-auto]$ ansible-playbook \
--vault-id @prompt dump_inventory_db.yml
Vault password (default): fedora

8. 完成名为configure_users的Ansible Playbook。

创建MariaDB用户并分配使用inventory数据库的权限。使用以下条件创建两个MariaDB用户:

[student@workstation database-auto]$ vim group_vars/db_servers/users.yml
---
mysql_users:
  - name: john
    host: localhost
    priv: 'inventory.*:INSERT,UPDATE,DELETE,SELECT'
    state: present
  - name: steve
    host: '%'
    priv: 'inventory.*:SELECT'
    state: present

[student@workstation database-auto]$ ansible-vault edit group_vars/db_servers/vault.yml
Vault password: fedora
pw: redhat
mysql_user_passwords:
  - name: john
    password: john_password
  - name: steve
    password: steve_password

[student@workstation database-auto]$ cat configure_users.yml 
---
- name: Configure users in MariaDB
  hosts: db_servers
  become: yes

  tasks:
    - name: Create users and set password if not present
      mysql_user:
        name: "{
    { item['name'] }}"
        update_password: on_create
        password: "{
    { item['password'] }}"
        state: present
      loop: "{
    { mysql_user_passwords }}"

    - name: Configure users in MariaDB inventory
      mysql_user:
        name: "{
    { item['name'] }}"
        host: "{
    { item['host'] }}"
        priv: "{
    { item['priv'] }}"
        state: "{
    { item['state'] }}"
      loop: "{
    { mysql_users }}"

    - name: Update users with password for all host
      mysql_user:
        name: "{
    { item['name'] }}"
        host_all: yes
        update_password: always
        password: "{
    { item['password'] }}"
        state: present
      loop: "{
    { mysql_user_passwords }}"

[student@workstation database-auto]$ ansible-playbook \
--syntax-check configure_users.yml
playbook: configure_users.yml
[student@workstation database-auto]$ ansible-playbook \
--vault-id @prompt configure_users.yml
Vault password (default): fedora

9. 从servera以用户john的身份本地连接到MariaDB,并验证他对inventory数据库的特权。

[student@servera ~]$ mysql -u john -p
Enter password: john_password

MariaDB [(none)]> USE inventory;
MariaDB [inventory]> SELECT * FROM category;
+----+------------+
| id | name |
+----+------------+
| 1 | Networking |
| 2 | Servers |
| 3 | Ssd |
+----+------------+
3 rows in set (0.00 sec)

MariaDB [inventory]> INSERT INTO category(name) VALUES('Memory');
Query OK, 1 row affected (0.00 sec)
MariaDB [inventory]> UPDATE category SET name='Solid State Drive' WHERE id = 3;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
MariaDB [inventory]> SELECT * FROM category;
+----+-------------------+
| id | name |
+----+-------------------+
| 1 | Networking |
| 2 | Servers |
| 3 | Solid State Drive |
| 4 | Memory |
+----+-------------------+
4 rows in set (0.000 sec)

MariaDB [inventory]> DELETE FROM category WHERE name LIKE 'Memory';
Query OK, 1 row affected (0.01 sec)
MariaDB [inventory]> SELECT * FROM category;
+----+-------------------+
| id | name |
+----+-------------------+
| 1 | Networking |
| 2 | Servers |
| 3 | Solid State Drive |
+----+-------------------+
3 rows in set (0.000 sec)
MariaDB [inventory]> exit
Bye
[student@servera ~]$ exit
logout

10. 从serverb以用户steve的身份远程连接到servera上的MariaDB,并验证他对inventory数据库的特权。

[student@serverb ~]$ mysql -u steve -h servera -p
Enter password: steve_password
MariaDB [(none)]> USE inventory;
MariaDB [inventory]> SELECT * FROM category;
+----+-------------------+
| id | name |
+----+-------------------+
| 1 | Networking |
| 2 | Servers |
| 3 | Solid State Drive |
+----+-------------------+
3 rows in set (0.00 sec)

MariaDB [inventory]> INSERT INTO category(name) VALUES('Memory');
ERROR 1142 (42000): INSERT command denied to user 'steve'@'serverb.example.com' for table 'category'
MariaDB [inventory]> exit
Bye
[student@serverb ~]$ exit
logout

11. 完成名为import_inventory_db的Ansible Playbook。

导入/home/student/inventory.dump之前创建的数据库备份。确认inventory数据库中的类别表已恢复到其原始状态。

[student@workstation database-auto]$ vim import_inventory_db.yml 
---
- name: Import database
  hosts: db_servers
  become: yes

  tasks:
    - name: Make sure inventory database exists
      mysql_db:
        name: inventory
        state: present
      register: inventory_present

    - name: Is inventory database backup present?
      stat:
        path: /home/student/inventory.dump
      register: inventory_bkup

    - name: Import inventory backup data
      mysql_db:
        name: inventory
        state: import
        target: /home/student/inventory.dump
      when:
        - inventory_present['changed'] == false
        - inventory_bkup['stat']['exists'] == true

[student@workstation database-auto]$ ansible-playbook \
--syntax-check import_inventory_db.yml
playbook: import_inventory_db.yml
[student@workstation database-auto]$ ansible-playbook \
--vault-id @prompt import_inventory_db.yml
Vault password (default): fedora
[student@servera ~]$ mysql -u root -p
Enter password: redhat
MariaDB [(none)]> USE inventory;
MariaDB [inventory]> SELECT * FROM category;
+----+------------+
| id | name |
+----+------------+
| 1 | Networking |
| 2 | Servers |
| 3 | Ssd |
+----+------------+
3 rows in set (0.000 sec)
MariaDB [inventory]> exit
Bye

完成实验

[student@workstation ~]$ lab database-automation finish

总结

  • 介绍如何使用Ansible对MariaDB进行日常的管理和维护。
  • 使用练习例子演示整个过程。
  • 若喜欢金鱼哥的文章,顺手点个赞。也可点个关注,因为后续会不断上干货。

目录
相关文章
|
9天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
51 10
|
26天前
|
SQL 存储 BI
【软件设计师备考 专题 】数据库语言(SQL)
【软件设计师备考 专题 】数据库语言(SQL)
89 0
|
30天前
|
SQL 数据库
sql server中创建数据库和表的语法
sql server中创建数据库和表的语法
18 1
|
9天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
68 6
|
5天前
|
SQL 数据库
数据库SQL语言实战(二)
数据库SQL语言实战(二)
|
5天前
|
SQL 关系型数据库 数据库
【后端面经】【数据库与MySQL】SQL优化:如何发现SQL中的问题?
【4月更文挑战第12天】数据库优化涉及硬件升级、操作系统调整、服务器/引擎优化和SQL优化。SQL优化目标是减少磁盘IO和内存/CPU消耗。`EXPLAIN`命令用于检查SQL执行计划,关注`type`、`possible_keys`、`key`、`rows`和`filtered`字段。设计索引时考虑外键、频繁出现在`where`、`order by`和关联查询中的列,以及区分度高的列。大数据表改结构需谨慎,可能需要停机、低峰期变更或新建表。面试中应准备SQL优化案例,如覆盖索引、优化`order by`、`count`和索引提示。优化分页查询时避免大偏移量,可利用上一批的最大ID进行限制。
32 3
|
8天前
|
SQL 监控 数据库
数据库管理与电脑监控软件:SQL代码优化与实践
本文探讨了如何优化数据库管理和使用电脑监控软件以提升效率。通过SQL代码优化,如使用索引和调整查询语句,能有效提高数据库性能。同时,合理设计数据库结构,如数据表划分和规范化,也能增强管理效率。此外,利用Python脚本自动化收集系统性能数据,并实时提交至网站,可实现对电脑监控的实时性和有效性。这些方法能提升信息系统稳定性和可靠性,满足用户需求。
33 0
|
9天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
|
16天前
|
数据库 SQL 索引
什么是数据库 SQL Execution Plan
什么是数据库 SQL Execution Plan
11 0
|
29天前
|
SQL 数据可视化 Apache
阿里云数据库内核 Apache Doris 兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移
阿里云数据库 SelectDB 内核 Doris 的 SQL 方言转换工具, Doris SQL Convertor 致力于提供高效、稳定的 SQL 迁移解决方案,满足用户多样化的业务需求。兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移。
阿里云数据库内核 Apache Doris 兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移

推荐镜像

更多