写在前面的话
当我们需要进行一系列可重复且复杂的操作的时候,如果还继续用传统的 cmd.run 来执行显然难以满足我们的需求。这时候就会在想一个问题,我们能不能把这些操作编辑成一个类似脚本的操作,我们只需要运行这个脚本,达到在指定目标机器上执行的意义。而且通过 saltsatck 帮我们自动兼容多种 linux 系统。这里我们就来谈一下解决思路之一的 saltstack sls 配置管理。
YUM 安装示例
我们可以查看一下 apache 安装配置格式:
apache-install: pkg.installed: - name: - httpd - httpd-devel apache-service: service.running: - name: httpd - enable: True
apache-install:相当于我们给接下来的配置取了一个名字(ID),这个名字最好是唯一且具有意义。
pkg.installed:使用 saltstack 的安装模块。每个模块在同一 ID 上只能使用一次。
name:指定我们需要安装的包的名字。
下面的 service 则是指定服务安装完成后的启动状态声明。
注意,当我们没有定义 name 的时候,系统会自动将 ID 作为 name,所以如果你想偷懒不写 name,那么你 ID 则必须写成服务的名称。
对于 pkg 模块,常用的方法有以下几个:
pkg.installed:安装
pkg.latest:确保安装的是最新版本
pkg.remove:卸载
pkg.purge:卸载并删除配置文件
具体可以参考文档:
https://www.unixhot.com/docs/saltstack/ref/states/all/salt.states.pkg.html#module-salt.states.pkg
再看下完整的 LAMP 配置示例:
lamp-install: pkg.installed: - httpd - httpd-devel - mariadb - mariadb-server - php - php-mysql - php-cli - php-mbstring apache-config: file.managed: - name: /etc/httpd/conf/httpd.conf - source: salt://lamp/conf/httpd.conf - user: root - group: root - mode: 644 mysql-config: file.managed: - name: /etc/my.cnf - source: salt://lamp/conf/my.cnf - user: root - group: root - mode: 644 php-config: file.managed: - name: /etc/php.ini - source: salt://lamp/conf/php.ini - user: root - group: root - mode: 644 apache-service: service.running: - name: httpd - enable: True - reload: True - require: - pkg: lamp-install - file: apache-config - watch: - file: apache-config mysql-service: service.running: - name: mariadb - enable: True
file.managed:可以对配置文件进行替换管理。
source:正确的配置文件路径,该路径相对于 master 配置文件中的 file_root 路径。
require:定义该操作依赖于哪个操作。
reload:定义重载规则,结合 watch 使用。
watch:监控,如果监控项发生改变则执行 reload 定义。
如果觉得这样写一个文件内容太多,我们可以单独的抽离某些配置出来,做成单独的 sls 文件,然后在主文件中使用类似方法:
include: - lamp.service - lamp.config
其中 lamp 是因为我们在 file_root 定义的路径中建立了 lamp 目录来存放这些配置,后面 service,config 其实就是文件名。类似 Python 中模块。
单独执行某个 sls 配置的方法:
salt 'saltstack-node-03' state.sls lamp.lamp
state.sls:执行单个文件
lamp.lamp:是 lamp 目录下 lamp.sls 文件
在这些配置文件中都可以使用 jinja 模板语言来编写逻辑处理,非常简单,详细的 jinja 基础用法可以看文档:
http://docs.jinkan.org/docs/jinja2/
简单的使用方法:
apache-config: file.managed: - name: /etc/httpd/conf/httpd.conf - source: salt://lamp/conf/httpd.conf - user: root - group: root - mode: 644 - template: jinja - defaults: PORT: 8888
使用 jinja 模板,需要加入 template 声明,然后通过 defaults 传递一个字典到配置文件。
在模板中使用 {{ PORT }} 即可引用该变量。
同样,在模板中我们可以使用 grains 等方法获取 IP,如:{{ grains['fqdn_ip4'][0] }}。同理 pillar 也可以。
使用 {{ salt['network.hw_addr']('eth0') }} 来执行 salt 的方法并传参。
小结
这里只是简单的提了一下 sls 配置的应用,接下来我们会用大量的示例来说明,saltstack 在生产中到底如何使用。