介绍
SaltStack或Salt是一个强大的远程执行和配置管理系统,可用于以结构化,可重复的方式轻松管理基础架构。在本系列中,我们将演示从Salt部署管理开发,暂存和生产环境的一种方法。我们将使用Salt状态系统来编写和应用可重复的操作。这将允许我们破坏任何我们的环境,安全的知识,我们可以很容易地使他们在相同的状态在以后的时间恢复在线。 在 过去的指南在这个系列中,我们建立了HAProxy的在我们的网络服务器前面的负载平衡器。在本指南中,我们将重点转向创建在每个环境中安装和管理MySQL数据库服务器的状态。本文将介绍MySQL的基本安装和设置。在将来的指南中,我们将讨论设置复制的更复杂的任务。使用debconf-utils获取MySQL提示信息
创建我们的MySQL状态的过程将比我们以前的Nginx和MySQL示例有点复杂。与其他两个安装步骤不同,MySQL安装通常涉及回答一组提示以设置MySQL root密码。 在我们开始使用我们的状态文件之前,我们应该在我们的一个minion上测试安装MySQL。 然后我们可以使用debconf-utils
包来获取我们需要填写提示信息。 如果您尚未拥有可用的登台环境,则可以使用我们之前创建的登台环境映射文件来启动环境:
sudo salt-cloud -P -m /etc/salt/cloud.maps.d/stage-environment.map
一旦数据库服务器启动并可用,请选择一个数据库服务器来安装MySQL,以便我们从安装中获取相关信息:
sudo salt stage-db1 pkg.install mysql-server
为了便于查询
debconf
的,我们需要提示信息数据库,我们还应该安装
debconf-utils
包对于数据库:
sudo salt stage-db1 pkg.install debconf-utils
该
debconf
内Salt功能现在已安装该软件包将可用。 我们可以使用
debconf.get_selections
执行模块功能,让所有的从数据库中仆从的提示信息。 我们应该管到这一点
less
,因为这将返回
所有从安装的主机包装上的信息:
sudo salt stage-db1 debconf.get_selections | less
在输出中,查找涉及MySQL的部分。它应该看起来像这样:
Output. . .
mysql-server-5.5:
|_
- mysql-server/root_password
- password
|_
- mysql-server/root_password_again
- password
|_
- mysql-server-5.5/really_downgrade
- boolean
- false
|_
- mysql-server-5.5/start_on_boot
- boolean
- true
. . .
顶部的两个条目包含我们所需要的字段名(
mysql-server/root_password
和
mysql-server/root_password_again
)。这些条目的第二行指定字段类型,我们将需要在我们的状态文件中指定。 一旦你抄下来从这些信息
debconf
输出,我们也应该继续和抢
/etc/mysql/my.cnf
文件。我们将需要这些,因为我们配置我们的MySQL状态:
sudo salt stage-db1 cp.push /etc/mysql/my.cnf
推后
/etc/mysql/my.cnf
文件传回Salt Master,我们可以删除该资源,使我们拥有一个干净的salt后在引导上测试:
sudo salt-cloud -d stage-db1
删除服务器后,您可以通过键入以下内容在后台重新创建它。在
sm
在这种情况下是我们的Salt主服务器,它具有适当的云凭据的名称:
sudo salt --async sm cloud.profile stage-db stage-db1
当您的数据库服务器正在重建时,我们可以开始构建MySQL状态文件。
创建主MySQL状态文件
我们将通过创建之内我们的MySQL状态的目录开始/srv/salt
目录:
sudo mkdir -p /srv/salt/mysql
在该目录中,我们可以创建和打开
init.sls
文件来存储我们的主要的MySQL状态文件:
sudo nano /srv/salt/mysql/init.sls
我们需要确保
debconf-utils
软件包安装走狗,以轻松设置我们需要的值。 我们可以用做
pkg.installed
状态模块:
/srv/salt/mysql/init.sls
debconf-utils:
pkg.installed
在之后
debconf-utils
安装包,然后我们可以预种子的答案使用提示
debconf.set
状态模块。 我们将使用
name
属性来指定我们要设置提示输入包名称。 然后,创建一个
data
,其中包含了可用于填充在提示信息的词典结构。 该
data
结构基本上使用有关,我们从我们的测试安装MySQL查询的提示信息。 我们知道应该用于这些字段的字段名称和数据类型。 要指定实际的密码,我们将拉动从与Salt支柱体系
pillar.get
执行模块的功能。 我们将在柱系统中稍后设置密码。这将允许我们保持我们的密码数据与我们的配置分开。
注意
存储在字典的data
。整个块缩进4个空格,而不是典型的两空格的缩进。当字典嵌入在YAML列表中时,会发生这种情况。你可以查看更多信息访问此链接 。
/srv/salt/mysql/init.sls
debconf-utils:
pkg.installed
mysql_setup:
debconf.set:
- name: mysql-server
- data:
'mysql-server/root_password': {'type': 'password', 'value': '{{ salt['pillar.get']('mysql:root_pw', '') }}' }
'mysql-server/root_password_again': {'type': 'password', 'value': '{{ salt['pillar.get']('mysql:root_pw', '') }}' }
- require:
- pkg: debconf-utils
为了实际与MySQL交互,必须在数据库服务器上提供适当的Python库。我们可以安装
ptyhon-mysqldb
包,以确保我们能够获得Salt的MySQL的能力。 之后,我们可以安全地安装实际的MySQL服务器软件。 我们将使用
require
,以确保
debconf
和Python库都可用。 安装后,我们可以添加服务状态,以确保服务正在运行。这将监视MySQL服务器包中的更改。它还将查看基本的MySQL配置文件,如果检测到更改,将重新加载服务:
/srv/salt/mysql/init.sls
debconf-utils:
pkg.installed
mysql_setup:
debconf.set:
- name: mysql-server
- data:
'mysql-server/root_password': {'type': 'password', 'value': '{{ salt['pillar.get']('mysql:root_pw', '') }}' }
'mysql-server/root_password_again': {'type': 'password', 'value': '{{ salt['pillar.get']('mysql:root_pw', '') }}' }
- require:
- pkg: debconf-utils
python-mysqldb:
pkg.installed
mysql-server:
pkg.installed:
- require:
- debconf: mysql-server
- pkg: python-mysqldb
mysql:
service.running:
- watch:
- pkg: mysql-server
- file: /etc/mysql/my.cnf
有一些文件,我们将需要使用MySQL管理。我们需要管理最明显的文件是
/etc/mysql/my.cnf
我们上面提到的文件。我们需要根据变量信息做一些修改,所以这个文件必须是一个Jinja模板。 我们需要管理的其他文件与Salt对MySQL系统的管理有关。为了管理数据库,Salt minion必须有关于如何连接到RDBMS的信息。首先,我们可以建立在一个简单的文件
/etc/salt/minion.d
目录。这将只是列出可以找到我们的连接详细信息的文件。具有数据库连接详细信息的文件是我们将需要管理的另一个文件。数据库连接文件将需要是一个模板:
/srv/salt/mysql/init.sls
. . .
mysql:
service.running:
- watch:
- pkg: mysql-server
- file: /etc/mysql/my.cnf
/etc/mysql/my.cnf:
file.managed:
- source: salt://mysql/files/etc/mysql/my.cnf.jinja
- template: jinja
- user: root
- group: root
- mode: 640
- require:
- pkg: mysql-server
/etc/salt/minion.d/mysql.conf:
file.managed:
- source: salt://mysql/files/etc/salt/minion.d/mysql.conf
- user: root
- group: root
- mode: 640
- require:
- service: mysql
/etc/mysql/salt.cnf:
file.managed:
- source: salt://mysql/files/etc/mysql/salt.cnf.jinja
- template: jinja
- user: root
- group: root
- mode: 640
- require:
- service: mysql
最后,我们需要包括
service.restart
这将刷新状态
salt-minion
过程本身。 这是为了有必要为我们的Minion拿起
/etc/salt/minion.d/mysql.conf
文件。 我们只希望
salt-minion
当有更改重新启动
/etc/salt/minion.d/mysql.conf
文件本身。 我们可以用
watch
所需来实现这一目标:
/srv/salt/mysql/init.sls
. . .
/etc/mysql/salt.cnf:
file.managed:
- source: salt://mysql/files/etc/mysql/salt.cnf.jinja
- template: jinja
- user: root
- group: root
- mode: 640
- require:
- service: mysql
restart_minion_for_mysql:
service.running:
- name: salt-minion
- watch:
- file: /etc/salt/minion.d/mysql.conf
完成添加上述详细信息后,保存并关闭文件。
创建MySQL的支柱
在我们的MySQL的状态,我们使用了pillar.get
执行模块的功能从支柱体系的值来填充MySQL root密码。我们需要设置这个支柱,以便状态可以拉取必要的数据,以构建数据库凭据。 支柱系统非常适合这种类型的用例,因为它允许您将数据分配给某些主机。不匹配的主机将无法访问敏感数据。到目前为止,我们的状态只需要root密码。我们指定的位置的支柱系统内是
mysql:root_pw
。我们现在将设置该键。
为柱系统创建首要文件
在我们创建我们需要的MySQL桩文件之前,我们需要创建一个支柱“顶”文件。顶部文件用于匹配Salt minions和立柱数据。 Salt minions将无法访问在顶部文件中他们不匹配的任何柱状数据。 在/srv/pillar
目录应该安装指南中已经建立。 我们可以创建一个
top.sls
这个目录中的文件开始:
cd /srv/pillar
sudo nano top.sls
在内部,我们需要指定
base
的环境(我们不使用环境的Salt的概念在这个系列,由于复杂性和一些无证的行为。我们所有的服务器在运行
base
环境和使用环境标志粒)。我们将使用复合匹配来匹配节点。我们将匹配服务器角色和服务器环境,以确定要分配给每个主机的哪些柱。 支柱使用点符号表示目录中的文件。例如,支柱系统的根目录是
/srv/pillar
。 要分配
mysql.sls
位于内支柱
dev
目录中,我们使用
dev.mysql
。 我们将需要这份指南的分配如下:
/srv/pillar/top.sls
base:
'G@env:dev and G@role:dbserver':
- match: compound
- dev.mysql
'G@env:stage and G@role:dbserver':
- match: compound
- stage.mysql
'G@env:prod and G@role:dbserver':
- match: compound
- prod.mysql
保存并在完成后关闭文件。
创建环境特定支柱
上面,我们根据角色和环境为服务器分配了柱子。这允许我们为不同的环境指定不同的连接和凭证信息。 首先使在柱顶文件中引用的目录:sudo mkdir /srv/pillar/{prod,stage,dev}
接下来,我们需要创建一个
myslq.sls
内的每个目录中的文件。 我们可以从开始
/srv/salt/stage/mysql.sls
文件,因为我们目前使用的临时环境进行测试:
sudo nano /srv/pillar/stage/mysql.sls
我们创建的状态文件要使用该支柱系统拉MySQL root密码
mysql:root_pw
键。 这实际上是一个嵌套的关键,这意味着
root_pw
是一个孩子
mysql
关键。考虑到这一点,我们可以为我们的MySQL root用户选择密码,并将其设置在文件中,如下所示:
/srv/pillar/stage/mysql.sls
mysql:
root_pw: staging_mysql_root_pass
选择您要使用的任何密码。完成后,保存并关闭文件。这是我们现在需要的。 在开发支柱内创建类似的文件:
sudo nano /srv/pillar/dev/mysql.sls
/srv/pillar/dev/mysql.sls
mysql:
root_pw: development_mysql_root_pass
对您的生产环境支柱执行相同操作:
sudo nano /srv/pillar/prod/mysql.sls
/srv/pillar/prod/mysql.sls
mysql:
root_pw: production_mysql_root_pass
为每个环境选择不同的密码。 我们将回到这些柱子,因为我们需要更多的数据,不属于配置本身。现在,保存并关闭任何打开的文件。
创建/etc/mysql/my.cnf.jinja模板
我们之前创建了基本的MySQL状态文件,但是我们从来没有为安装创建托管文件。 当我们做测试安装的mysql-server
我们的
stage-db1
早期版本的服务器,我们推
/etc/mysql/my.cnf
文件备份到主。 这应该仍然可以在我们的Salt主缓存。 我们可以复制导致这一缓存文件给我们的整个目录结构
/srv/salt/mysql
通过键入目录:
sudo cp -r /var/cache/salt/master/minions/stage-db1/files /srv/salt/mysql
转到包含复制的目录
mycnf
MySQL的state目录中的文件:
cd /srv/salt/mysql/files/etc/mysql
因为它目前存在的一个文件复制
.orig
Stapling,这样我们就可以在必要时还原更改:
sudo cp my.cnf my.cnf.orig
接下来,重命名
my.cnf
文件有一个
.jinja
Stapling。这将向我们显示,这个文件是一个模板,而不是一个可以放到主机上而不渲染的文件:
sudo mv my.cnf my.cnf.jinja
打开Jinja模板文件,开始必要的编辑:
sudo nano my.cnf.jinja
我们希望创建的所有更改现在都与允许远程MySQL连接有关。因为它是,MySQL绑定到本地环回接口。我们希望将其设置为监听节点的专用网络地址。 要做到这一点,找到
bind-address
在该行
[mysqld]
部分。 我们将使用
network.interface_ip
执行模块函数来获得分配给minion的地址
eth1
接口。
/srv/salt/mysql/files/etc/mysql/my.cnf.jinja
. . .
[mysqld]
. . .
bind-address = {{ salt['network.interface_ip']('eth1') }}
另外,我们需要做的是关闭我们的服务器的DNS名称解析。通过添加
skip-name-resolve
选项,如果它不能完成的名称和反向名称解析MySQL不会失败:
/srv/salt/mysql/files/etc/mysql/my.cnf.jinja
. . .
[mysqld]
. . .
bind-address = {{ salt['network.interface_ip']('eth1') }}
skip-name-resolve
保存并在完成后关闭文件。
创建/etc/salt/minion.d/mysql.conf文件
接下来,我们需要创建托管文件,用于修改minion的配置以及如何连接到MySQL数据库的知识。相反,保持内部的配置/etc/salt/minion
文件本身,我们将把一个新的文件到
/etc/salt/minion.d
目录告诉Minion在哪里可以找到连接信息。 通过创建了必要的目录结构,启动
/srv/salt/mysql/files
目录:
sudo mkdir -p /srv/salt/mysql/files/etc/salt/minion.d
我们可以创建这个目录叫中的文件
mysql.conf
:
sudo nano /srv/salt/mysql/files/etc/salt/minion.d/mysql.conf
在里面,我们只需要设置一个选项:连接信息文件的位置。在我们的例子中,我们将在此设置一个文件
/etc/mysql/salt.cnf
:
/srv/salt/mysql/files/etc/salt/minion.d/mysql.conf
mysql.default_file: '/etc/mysql/salt.cnf'
保存并在完成后关闭文件。
创建/etc/mysql/salt.cnf模板文件
现在,我们需要创建我们的minion配置引用的文件。这将是一个模板文件,因为我们需要从支柱系统中获取一些连接细节。我们将放置在这个文件/srv/salt/mysql/files/etc/mysql
目录:
sudo nano /srv/salt/mysql/files/etc/mysql/salt.cnf.jinja
在内部,我们需要打开一个
[client]
部分指定的信息我们定义的类型。 下面这个头,我们可以指定客户端在位于Unix套接字连接到本地计算机与MySQL root用户
/var/run/mysqld/mysqld.sock
。这些都是默认的MySQL值:
/srv/salt/mysql/files/etc/mysql/salt.cnf.jinja
[client]
host = localhost
user = root
socket = /var/run/mysqld/mysqld.sock
现在我们只需要添加密码。同样,我们将直接从支柱体系,我们必须在相同的方式完成这
debconf
我们的MySQL状态文件的部分。它看起来像这样:
/srv/salt/mysql/files/etc/mysql/salt.cnf.jinja
[client]
host = localhost
user = root
socket = /var/run/mysqld/mysqld.sock
password = {{ salt['pillar.get']('mysql:root_pw', '') }}
保存并在完成后关闭文件。
测试安装和良好检查
现在我们已经配置了基本的安装状态和支持文件,我们应该快速测试我们的设置,以确保它正常运行。 我们将开始通过我们典型的测试过程。使用state.show_sls
执行模块的功能,以确保它可以使你的状态文件:
sudo salt stage-db1 state.show_sls mysql
看看通过输出,以确保Salt没有问题解析您的
/srv/salt/mysql/init.sls
文件。 接下来,执行state应用的预演加入
test=True
到年底
state.apply
执行模块的功能:
sudo salt stage-db1 state.apply mysql test=True
此命令预期失败 。 因为我们文件中的一些状态函数直到安装了特定软件包后才可用,所以在干运行期间会出现故障。 在实际运行中,state将确保必备软件包的安装被称为是利用它们的状态
之前 。 所有的失败state的意见,应该表明,“一个或多个必需的失败”的除外
mysql_setup
状态,这应该会失败,由于
debconf.set
不是可用的(这只是一个前提条件失败)。使用此处的输出可确保不会出现其他无关的错误。 运行测试后,我们可以通过键入以下命令应用状态:
sudo salt stage-db1 state.apply mysql
这将导致成功的状态运行。 我们需要测试一下Salt能够连接和查询MySQL数据库。确保您可以键入以下列出默认数据库:
sudo salt stage-db1 mysql.db_list
您应该得到一个看起来像这样的列表:
Outputstage-db1:
- information_schema
- mysql
- performance_schema
这表明Salt是能够连接到使用在指定的信息MySQL实例
/etc/mysql/salt.cnf
文件。 现在我们已经验证了我们的基本的MySQL状态正常工作,我们可以删除
stage-db1
服务器:
sudo salt-cloud -d stage-db1
在后台重新创建服务器,以便我们稍后进行进一步测试。此外,
sm
是在这种情况下我们的Salt主服务器的名称:
sudo salt --async sm cloud.profile stage-db stage-db1
现在,我们的基本MySQL设置完成。
结论
你应该有状态,将MySQL安装在您的minion。这些也将salt-minion
对每台服务器的进程,使Salt可连接并管理涉及到的数据库。 虽然我们当前的状态安装MySQL和配置我们的minions来控制数据库系统,目前我们的数据库是完全独立的。在以后的指南中,我们将处理MySQL数据库复制,以便我们的数据在每个环境中的每个数据库中保持一致。