SaltStack 基础设施:为 MySQL 数据库服务器创建 Salt 状态

介绍

SaltStack,或盐,是一个强大的远程执行和配置管理系统,可以用来轻松地以结构化、可重复的方式管理基础设施. 在本系列中,我们将展示一种方法来管理您的开发,舞台和生产环境,从盐部署。

在本系列的 最后的指南中,我们将HAProxy设置为负载平衡器,在我们的Web服务器前面。 在本指南中,我们将改变我们的重点,以创建将安装和管理我们的MySQL数据库服务器在我们每个环境中的状态。

使用 debconf-utils 获取 MySQL Prompt 信息

创建 MySQL 状态的过程将比我们以前的 Nginx 和 MySQL 示例更为复杂,与其他两个安装步骤不同,MySQL 安装通常涉及回答一组提示来设置 MySQL 根密码。

在我们开始使用我们的状态文件之前,我们应该在我们的小伙伴中进行MySQL的测试安装,然后我们可以使用debconf-utils包来获取有关我们需要填写的提示的信息。

如果您还没有可用的舞台环境,您可以使用我们之前创建的舞台环境地图文件来旋转环境:

1sudo salt-cloud -P -m /etc/salt/cloud.maps.d/stage-environment.map

一旦您的数据库服务器启动并可用,请选择您的数据库服务器之一来安装MySQL,以便我们可以从安装中获取相关信息:

1sudo salt stage-db1 pkg.install mysql-server

为了方便地查询‘debconf’数据库以获取我们所需要的即时信息,我们还应该在数据库中安装‘debconf-utils’包:

1sudo salt stage-db1 pkg.install debconf-utils

我们可以使用debconf.get_selections执行模块函数从数据库中获取所有提示信息,我们应该将此信息输入到,因为这将返回安装在该主机上的所有信息:

1sudo salt stage-db1 debconf.get_selections | less

在输出中,寻找涉及MySQL的部分,它应该看起来像这样:

 1[secondary_label Output]
 2. . .
 3
 4mysql-server-5.5:
 5    |_
 6      - mysql-server/root_password
 7      - password
 8    |_
 9      - mysql-server/root_password_again
10      - password
11    |_
12      - mysql-server-5.5/really_downgrade
13      - boolean
14      - false
15    |_
16      - mysql-server-5.5/start_on_boot
17      - boolean
18      - true
19
20. . .

上面的两个条目包含我们需要的字段名称(mysql-server/root_passwordmysql-server/root_password_again)。

一旦您从debconf输出中复制了这些信息,我们也应该继续抓住/etc/mysql/my.cnf文件。

1sudo salt stage-db1 cp.push /etc/mysql/my.cnf

在將 /etc/mysql/my.cnf 檔案推回 Salt 主機後,我們可以刪除資源,以便我們在後面指南中有清潔的表格來測試:

1sudo salt-cloud -d stage-db1

一旦服务器被删除,您可以通过键入以下方式在背景中重新创建服务器。在这种情况下,sm是我们 Salt 主服务器的名称,该服务器具有相应的云凭据:

1sudo salt --async sm cloud.profile stage-db stage-db1

当您的数据库服务器正在重建时,我们可以开始构建MySQL状态文件。

创建主MySQL状态文件

我们将通过在 /srv/salt 目录中创建 MySQL 状态的目录开始:

1sudo mkdir -p /srv/salt/mysql

在此目录中,我们可以创建并打开一个init.sls文件来存储我们的主要MySQL状态文件:

1sudo nano /srv/salt/mysql/init.sls

我们需要确保debconf-utils包安装在小程序上,以便轻松设置所需的值。

1[label /srv/salt/mysql/init.sls]
2debconf-utils:
3  pkg.installed

安装了debconf-utils包后,我们可以使用debconf.set状态模块预先播种答案,我们将使用名称属性来指定我们想要设置提示的包名称,然后我们创建一个包含信息字典的数据结构,可以用来填写提示。

数据结构基本上使用了我们从我们的测试MySQL安装中查询的提示信息。我们知道这些字段应该使用的字段名称和数据类型。

我们将稍后在支柱系统中设置密码,这将使我们能够将密码数据与我们的配置分开。

<$>[note] [label Note] 密切关注在数据中存储的字典的注入。整个区块被注入一个额外的 空间,而不是典型的两个空间注入。当一个字典嵌入到YAML列表中时,会发生这种情况。

 1[label /srv/salt/mysql/init.sls]
 2debconf-utils:
 3  pkg.installed
 4
 5mysql_setup:
 6  debconf.set:
 7    - name: mysql-server
 8    - data:
 9        'mysql-server/root_password': {'type': 'password', 'value': '{{ salt['pillar.get']('mysql:root_pw', '') }}' }
10        'mysql-server/root_password_again': {'type': 'password', 'value': '{{ salt['pillar.get']('mysql:root_pw', '') }}' }
11    - require:
12      - pkg: debconf-utils

为了真正与MySQL互动,适当的Python库必须在数据库服务器上可用。我们可以安装ptyhon-mysqldb包,以确保我们可以访问Salt的MySQL功能。之后,我们可以安全地安装实际的MySQL服务器软件。

安装后,我们可以添加服务状态,以确保服务正在运行. 这将监视MySQL服务器包的更改。它还会监视基本的MySQL配置文件,如果发现更改,则会重新加载服务:

 1[label /srv/salt/mysql/init.sls]
 2debconf-utils:
 3  pkg.installed
 4
 5mysql_setup:
 6  debconf.set:
 7    - name: mysql-server
 8    - data:
 9        'mysql-server/root_password': {'type': 'password', 'value': '{{ salt['pillar.get']('mysql:root_pw', '') }}' }
10        'mysql-server/root_password_again': {'type': 'password', 'value': '{{ salt['pillar.get']('mysql:root_pw', '') }}' }
11    - require:
12      - pkg: debconf-utils
13
14python-mysqldb:
15  pkg.installed
16
17mysql-server:
18  pkg.installed:
19    - require:
20      - debconf: mysql-server
21      - pkg: python-mysqldb
22
23mysql:
24  service.running:
25    - watch:
26      - pkg: mysql-server
27      - file: /etc/mysql/my.cnf

我们需要管理的最明显的文件是我们上面提到的 /etc/mysql/my.cnf 文件,我们需要根据变量信息进行一些更改,所以这个文件必须是 Jinja 模板。

我们需要管理的其他文件与Salt的MySQL系统管理有关。为了管理数据库,Salt minion必须有有关如何连接到RDBMS的信息。 首先,我们可以在/etc/salt/minion.d目录中创建一个简单的文件。 这只会列出我们的连接详细信息所在的文件。 数据库连接详细信息的文件是我们需要管理的另一个文件。 数据库连接文件将需要一个模板:

 1[label /srv/salt/mysql/init.sls]
 2. . .
 3
 4mysql:
 5  service.running:
 6    - watch:
 7      - pkg: mysql-server
 8      - file: /etc/mysql/my.cnf
 9
10/etc/mysql/my.cnf:
11  file.managed:
12    - source: salt://mysql/files/etc/mysql/my.cnf.jinja
13    - template: jinja
14    - user: root
15    - group: root
16    - mode: 640
17    - require:
18      - pkg: mysql-server
19
20/etc/salt/minion.d/mysql.conf:
21  file.managed:
22    - source: salt://mysql/files/etc/salt/minion.d/mysql.conf
23    - user: root
24    - group: root
25    - mode: 640
26    - require:
27      - service: mysql
28
29/etc/mysql/salt.cnf:
30  file.managed:
31    - source: salt://mysql/files/etc/mysql/salt.cnf.jinja
32    - template: jinja
33    - user: root
34    - group: root
35    - mode: 640
36    - require:
37      - service: mysql

最后,我们需要包含一个service.restart状态,它将重新加载salt-minion过程本身。 这是必要的,以便我们的minion可以收集/etc/salt/minion.d/mysql.conf文件。 我们只希望salt-minion/etc/salt/minion.d/mysql.conf文件本身发生更改时重新启动。

 1[label /srv/salt/mysql/init.sls]
 2. . .
 3
 4/etc/mysql/salt.cnf:
 5  file.managed:
 6    - source: salt://mysql/files/etc/mysql/salt.cnf.jinja
 7    - template: jinja
 8    - user: root
 9    - group: root
10    - mode: 640
11    - require:
12      - service: mysql
13
14restart_minion_for_mysql:
15  service.running:
16    - name: salt-minion
17    - watch:
18      - file: /etc/salt/minion.d/mysql.conf

当您完成添加上述细节时,保存并关闭文件。

创建MySQL的支柱

在我们的MySQL状态中,我们使用pillar.get执行模块函数将MySQL根密码填充到支柱系统的值中,我们需要设置这个支柱,以便该支柱可以抽取必要的数据以构建数据库凭据。

支柱系统非常适合这种类型的用例,因为它允许您将数据分配给某些主机。不匹配的主机将无法访问敏感数据。到目前为止,我们的状态只需要根密码。

为支柱系统创建一个顶级文件

在我们创建我们需要的MySQL支柱文件之前,我们需要创建一个支柱顶部文件。顶部文件用于匹配 Salt minions 与支柱数据。

在安装指南中应该创建 /srv/pillar 目录. 我们可以在这个目录中创建一个 top.sls 文件,以便开始:

1cd /srv/pillar
2sudo nano top.sls

内部,我们需要指定基础环境(由于复杂性和某些未经证实的行为,我们在本系列中不使用Salt的环境概念。我们所有的服务器都在基础环境中运行,并为环境指定使用谷物)。

支柱使用点符号来表示目录中的文件. 例如,支柱系统的根是 /srv/pillar. 为了分配位于 dev 目录中的 mysql.sls 支柱,我们使用 dev.mysql

我们将需要这个指南的任务看起来像这样:

 1[label /srv/pillar/top.sls]
 2base:
 3  'G@env:dev and G@role:dbserver':
 4    - match: compound
 5    - dev.mysql
 6
 7  'G@env:stage and G@role:dbserver':
 8    - match: compound
 9    - stage.mysql
10
11  'G@env:prod and G@role:dbserver':
12    - match: compound
13    - prod.mysql

保存并关闭文件,当你完成。

建立环境特定支柱

以上,我们根据角色和环境为服务器分配了支柱,这使我们能够为不同的环境指定不同的连接和凭证信息。

开始通过在柱顶文件中提到的目录:

1sudo mkdir /srv/pillar/{prod,stage,dev}

接下来,我们应该在每个目录中创建一个myslq.sls文件,我们可以从/srv/salt/stage/mysql.sls文件开始,因为我们目前正在使用阶段环境来测试:

1sudo nano /srv/pillar/stage/mysql.sls

我们创建的状态文件希望使用mysql:root_pw密钥将MySQL根密码从支柱系统中拉出来,这实际上是一个嵌入的密钥,这意味着root_pwmysql钥匙的孩子。

1[label /srv/pillar/stage/mysql.sls]
2mysql:
3  root_pw: staging_mysql_root_pass

选择您想要使用的任何密码. 完成后,保存并关闭文件. 这是我们现在所需要的。

在您的开发支柱中创建类似的文件:

1sudo nano /srv/pillar/dev/mysql.sls
1[label /srv/pillar/dev/mysql.sls]
2mysql:
3  root_pw: development_mysql_root_pass

对您的生产环境支柱做同样的事情:

1sudo nano /srv/pillar/prod/mysql.sls
1[label /srv/pillar/prod/mysql.sls]
2mysql:
3  root_pw: production_mysql_root_pass

为每个环境选择不同的密码。

我们将在以后返回这些支柱,因为我们需要更多的数据,这些数据不属于配置本身。

创建 /etc/mysql/my.cnf.jinja 模板

我们早些时候创建了我们的基本MySQL状态文件,但我们从未创建过用于安装的管理文件。

當我們在我們的「stage-db1」伺服器上進行了「mysql-server」的測試安裝時,我們將「/etc/mysql/my.cnf」檔案推回主機,這應該在我們的 Salt master cache 中仍然可用。

1sudo cp -r /var/cache/salt/master/minions/stage-db1/files /srv/salt/mysql

进入 MySQL 状态目录中包含复制的 mycnf 文件的目录:

1cd /srv/salt/mysql/files/etc/mysql

将当前存在的文件复制到.orig字符串,以便在必要时返回更改:

1sudo cp my.cnf my.cnf.orig

接下來,重命名「my.cnf」檔案以擁有「.jinja」字符串,這將向我們顯示,一眼看,這個檔案是一個模板,而不是一個可以放到主機上的檔案,而沒有顯示:

1sudo mv my.cnf my.cnf.jinja

打开 Jinja 模板文件以开始所需的编辑:

1sudo nano my.cnf.jinja

我们现在想要创建的所有更改都与允许远程MySQL连接有关。

要做到这一点,在[mysqld]部分找到bind-address行,我们将使用network.interface_ip执行模块函数来将地址分配给小组的eth1接口。

1[label /srv/salt/mysql/files/etc/mysql/my.cnf.jinja]
2. . .
3
4[mysqld]
5
6. . .
7
8bind-address            = {{ salt['network.interface_ip']('eth1') }}

我们需要做的另一个补充是关闭我们的服务器的DNS名称分辨率. 通过添加‘skip-name-resolve’选项,如果MySQL无法完成名称和逆名称分辨率,MySQL将不会失败:

1[label /srv/salt/mysql/files/etc/mysql/my.cnf.jinja]
2. . .
3
4[mysqld]
5
6. . .
7
8bind-address            = {{ salt['network.interface_ip']('eth1') }}
9skip-name-resolve

保存并关闭文件,当你完成。

创建 /etc/salt/minion.d/mysql.conf 文件

接下来,我们需要创建用于修改 minion 配置的管理文件,并了解如何连接到 MySQL 数据库,而不是将配置保存在 /etc/salt/minion’ 文件中,我们会将一个新的文件放入 /etc/salt/minion.d 目录中,告诉 minion 在哪里找到连接信息。

首先,创建必要的目录结构,并使用 `/srv/salt/mysql/files’ 目录:

1sudo mkdir -p /srv/salt/mysql/files/etc/salt/minion.d

我们可以在这个目录中创建一个名为mysql.conf的文件:

1sudo nano /srv/salt/mysql/files/etc/salt/minion.d/mysql.conf

内部,我们只需要设置一个选项:连接信息文件的位置. 在我们的情况下,我们将将此设置为在 /etc/mysql/salt.cnf 的文件:

1[label /srv/salt/mysql/files/etc/salt/minion.d/mysql.conf]
2mysql.default_file: '/etc/mysql/salt.cnf'

保存并关闭文件,当你完成。

创建 /etc/mysql/salt.cnf 模板文件

现在,我们需要创建我们的 minion 配置所指的文件,这是一个模板文件,因为我们需要从支柱系统中获取一些连接细节,我们会将此文件放入 /srv/salt/mysql/files/etc/mysql 目录:

1sudo nano /srv/salt/mysql/files/etc/mysql/salt.cnf.jinja

在内部,我们需要打开一个[客户端]部分来指定我们正在定义的信息类型。在这个标题下,我们可以指定客户端在位于/var/run/mysqld/mysqld.sock的 Unix 接口上连接到本地机器的 MySQL 根用户。

1[label /srv/salt/mysql/files/etc/mysql/salt.cnf.jinja]
2[client]
3host                = localhost
4user                = root
5socket              = /var/run/mysqld/mysqld.sock

现在我们需要添加的唯一东西是密码,再一次,我们将直接从支柱系统中提取,就像我们在MySQL状态文件的debconf部分中所做的那样。

1[label /srv/salt/mysql/files/etc/mysql/salt.cnf.jinja]
2[client]
3host                = localhost
4user                = root
5socket              = /var/run/mysqld/mysqld.sock
6password            = {{ salt['pillar.get']('mysql:root_pw', '') }}

保存并关闭文件,当你完成。

测试安装和卫生检查

现在我们已经配置了基本的安装状态和支持文件,我们应该快速测试我们的设置,以确保它正常工作。

我们将通过我们的典型测试过程开始使用state.show_sls执行模块函数,以确保它可以渲染您的状态文件:

1sudo salt stage-db1 state.show_sls mysql

查看输出,以确保 Salt 没有解决您的 `/srv/salt/mysql/init.sls 文件的问题。

接下来,通过在state.apply执行模块函数的末尾添加test=True来执行状态应用程序的干运行:

1sudo salt stage-db1 state.apply mysql test=True

此命令预计会失败.由于我们文件中的某些状态函数在安装特定包之后才可用,因此在干燥运行期间可能会出现故障。

对于失败状态的所有评论都应该表示一个或多个要求失败,除了mysql_setup状态,因为debconf.set不可用(这只是另一个前提失败)。

运行测试后,我们可以通过键入应用状态:

1sudo salt stage-db1 state.apply mysql

这将导致一个成功的国家运行。

我们需要测试 Salt 是否能够连接和查询 MySQL 数据库. 请确保您可以通过键入列出默认数据库:

1sudo salt stage-db1 mysql.db_list

你应该得到一个列表,看起来像这样的东西:

1[secondary_label Output]
2stage-db1:
3    - information_schema
4    - mysql
5    - performance_schema

这表明 Salt 能够使用在 `/etc/mysql/salt.cnf 文件中指定的信息连接到 MySQL 实例。

现在我们已经验证了我们的 MySQL 数据库状态是否正常运行,我们可以删除‘stage-db1’服务器:

1sudo salt-cloud -d stage-db1

重新创建后台服务器,以便我们稍后再进行测试。再次,‘sm’是我们 Salt 主服务器的名称:

1sudo salt --async sm cloud.profile stage-db stage-db1

现在,我们的基本MySQL设置已经完成。

结论

你现在应该有状态,将安装MySQL在你的小伙子上,这些也会在每个服务器上启动盐小伙子的过程,以便Salt可以连接和管理相关的数据库。

虽然我们目前的国家安装MySQL并配置我们的小伙伴来控制数据库系统,但目前我们的数据库完全分开,在未来的一篇指南中,我们将解决MySQL数据库复制问题,以便我们的数据在每个环境中的每个数据库都保持一致。

Published At
Categories with 技术
comments powered by Disqus