介绍
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_password
和 mysql-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_pw
是mysql
钥匙的孩子。
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数据库复制问题,以便我们的数据在每个环境中的每个数据库都保持一致。