SaltStack基础设施:建立Salt States的MySQL数据库服务器

在本指南中,我们将改变我们的重点打造,将在每一个我们的环境中安装和管理我们的MySQL数据库服务器的状态。本文将介绍MySQL的基本安装和设置。在以后的指导,我们将处理设置复制的更复杂的任务。

介绍

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的部分。它应该看起来像这样:
. . .

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_passwordmysql-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
因为它目前存在的一个文件复制.origStapling,这样我们就可以在必要时还原更改:
sudo cp my.cnf my.cnf.orig
接下来,重命名my.cnf文件有一个.jinjaStapling。这将向我们显示,这个文件是一个模板,而不是一个可以放到主机上而不渲染的文件:
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
您应该得到一个看起来像这样的列表:
stage-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数据库复制,以便我们的数据在每个环境中的每个数据库中保持一致。