SaltStack配置管理
saltstack配置管理又称为状态管理,saltstack无法对状态进行回滚。在我们编写sls文件时,要支持多次执行,如:编写了软件的安装模块,每次执行这个状态时,都会去检查这个软件是否安装。
在saltstack中编写的sls描述文件实质是salt stack的缩写,使用的是YAML的描述语法。
sls文件说明
# cat /srv/salt/web/apache.sls apache-install: #ID声明,ID必须唯一 pkg.installed: #state声明,状态声明,执行什么操作 - names: #选项声明,具体行为参数 - httpd - httpd-devel
sls文件格式有多种写法,一般都包含这三部分,多个参数会使用‘-‘ 列表,使用层级递进关系。
使用SaltStack安装LAMP
在安装LAMP环境时,使用不同的配置文件来完成整改环境的安装和部署。整个过程可以分为三步:
1、使用pkg 模块安装软件包
2、使用file 模块修改配置文件
3、使用service 模块启动服务
PKG模块
https://docs.saltstack.com/en/latest/ref/states/all/salt.states.pkg.html#module-salt.states.pkg
使用pkg.installed 可以同时安装多个软件包:
common_packages: pkg.installed: - pkgs: #指定多个包 - unzip - dos2unix - salt-minion: 2015.8.5-1.el6 #末尾指定版本
pkg中其他的一些常用方法:
pkg.installed # 安装 pkg.latest # 确保最新版本 pkg.remove # 卸载 pkg.purge # 卸载并删除配置文件
lamp中对于apache,mysql,php的安装,先创建目录和sls文件:
mkdir /srv/salt/lamp vim /srv/salt/lamp/lamp.sls
安装LAMP环境编写的配置:
lamp-pkg: pkg.installed: - pkgs: - httpd - php - mariadb - mariadb-server - php-mysql - php-cli - php-mbstring
File模块
https://docs.saltstack.com/en/latest/ref/states/all/salt.states.file.html#module-salt.states.file
当需要对安装的服务修改配置时,通过file模块来分发对应的配置文件,对于不同的服务必须要使用不同的ID,在同一个ID下不能有两个及以上的模块方法行为。如在下面的lamp.sls的文件中,一个ID下面只能有一个file.managed的方法调用。
lamp中对于apache,mysql,php的文件配置,增加如下内容到lamp.sls:
apache-config: file.managed: - name: /etc/httpd/conf/httpd.conf - source: salt://lamp/files/httpd.conf - user: root - group: root - mode: 644 php-config: file.managed: - name: /etc/php.ini - source: salt://lamp/files/php.ini #此处表示当前环境的根目录(当前环境分为base、dev、pro) - user: root - group: root - mode: 644 mysql-config: file.managed: - name: /etc/my.cnf - source: salt://lamp/files/my.cnf - user: root - group: root - mode: 644
对于source中指定的路径,必须要是当前环境的根目录为起始路径,如在master的配置文件中,指定了base环境则为/srv/salt. dev环境和pro环境在master配置文件中分别指定了对应的起始路径。
将各个服务需要的配置文件放入指定的路径中,如果没有这些配置文件,可以在一台机上安装对应的软件,然后将配置文件拷贝到指定路径(这里对应文件中source指定的/srv/salt/files):
cp /etc/httpd/http.conf /srv/salt/lamp/files/ cp /etc/php.ini /srv/salt/lamp/files/ cp /etc/my.cnf /srv/salt/lamp/files/
这样当执行file.managed模块时,会自动将配置好的配置文件分发到对应的目录中。
Service模块
service模块用来启用服务,在lamp.sls文件最后,添加如下内容:
apache-service: service.running: #启动服务模块 - name: httpd #需要指定服务名称,否则会将ID名称当做服务名称而出错 - enable: True #开机自启动 - reload: True #重载 mysql-service: service.running: - name: mariadb - enable: True - reload: True
在master上执行部署命令:
# salt ‘node2‘ state.sls lamp.lamp
在node2上,这些服务会自动安装,替换文件,并且启动。
由于同一个ID和同一个状态模块只能使用一次,所以上面的配置文件也可以按照单个服务的部署流程来写,在一个ID下对一个服务定义一系列动作:
apache-service: pkg.installed: - pkgs: - httpd file.managed: - name: /etc/httpd/conf/httpd.conf - source: salt://lamp/files/httpd.conf - user: root - group: root - mode: 644 service.running: - name: httpd - enable: True - reload: True
注意:sls文件的解析模式是从上往下,按顺序解析,在编写模块时,要注意顺序,比如要安装完才能配置、启动服务。
状态间关系
在各个模块相互调用的时候,就涉及到一个先后顺序的问题,如当我们需要启动某项服务的时候,必须确保先安装这个服务,配置完成才能启动。对于模块之间复杂的调用,需要有一个定义它的方式来指定状态间的关系。
各个状态之间存在一些相互作用的关系,主要有下面几种关系:
1、依赖谁 require,如运行启动服务的模块必须先运行安装模块 ,也依赖于配置模块
2、被谁依赖 require_in,安装模块被启动模块依赖
3、监控谁 watch, 如果监控的模块状态变化就reload,如果没有reload参数,则会重启。
4、被谁监控 watch_in,和watch功能相同,模块的对象和位置是对应的。
5、引用谁 include 直接导入执行其他的文件并执行,可以指定多个文件去运行。
6、扩展谁
如上面的实例:
lamp-pkg: pkg.installed: - pkgs: - httpd - php - mariadb-server - php-mysql - php-cli - php-mbstring apache-config: file.managed: - name: /etc/httpd/conf/httpd.conf - source: salt://lamp/files/httpd.conf - user: root - group: root - mode: 644 - require: #依赖于安装模块 - pkg: lamp-pkg #状态模块: ID php-config: file.managed: - name: /etc/php.ini - source: salt://lamp/files/php.ini - user: root - group: root - mode: 644 - require: #依赖于安装模块 - pkg: lamp-pkg #状态模块:ID mysql-config: file.managed: - name: /etc/my.cnf - source: salt://lamp/files/my.cnf - user: root - group: root - mode: 644 - require: #依赖于安装模块 - pkg: lamp-pkg apache-service: service.running: - name: httpd - enable: True - reload: True - require: #依赖于安装和配置模块 - pkg: lamp-pkg - file: apache-config - watch: # 当监控的apache-config状态(文件)发生变化就执行reload - file: apache-config #注意:如果此状态模块中没有- enable: True参数,状态变化时则会重启服务。 mysql-service: service.running: - name: mariadb - enable: True - reload: True - require: #此模块执行时,依赖于lamp-pkg和mysql-config模块 - pkg: lamp-pkg - file: mysql-config
include使用,可以将上面的内容分别写在不同的sls文件中,在主配置文件中使用include来是这些不同的文件依次运行:
# cat init.sls include: - lamp.pkg - lamp.config - lamp.service
在当前目录中分别有pkg.sls, concfig.sls, service.sls 文件。
执行salt命令时直接执行init.sls模块即可:
salt ‘node2‘ state.sls lamp.init
如果将所有没有互相依赖的单个服务的安装配置启动写到一个sls文件中,在编写主配置的时候灵活性就会大大提高,可以选择需要服务的对应文sls件include。
通过状态间的关系,可以将各个服务单独模块化,可以重复被其他模块调用,方便管理和配置。
编写sls的技巧:
1、安装状态分类。单独使用会很清晰。
2、按服务分类,可以被其它的SLS include。
Jinja模板
Jinja2是python的模板语言。模板仅仅是文本文件,可以生成任何基于文本的格式。
模板包含表达式和变量,分别用{%...%} 和{{...}} 表示。使用jinja模板时一般有三个步骤:
- 在使用Jinja模板时,需要在sls文件中声明使用jinja
- template: jinja
- 列出参数列表,
- defaults: PORT: 88 # 表示PORT变量的值为88
- 模板的引用,
在分发的配置文件中,可以将PORT变量的值赋予配置文件的参数:
Listen {{ PORT }} # PORT变量的值会自动添加到变量中 Listen 88
Jinja中使用Grains
在使用变量修改minion端修改某些minion自身的参数时,可以使用salt,grains和pillar来获取minion本身的参数,如本机的IP地址。
先在sls的配置文件中添加Jinja模板
- template: jinja
如上例,修改httpd.conf文件监听端口:
Listen {{ grains[‘fqdn_ip4‘][0]}}:{{ PORT }}
这里的fqdn_ip4是获取的 grains中 fqdn_ip4对应的输出:
# salt ‘*‘ grains.item fqdn_ip4 node2: ---------- fqdn_ip4: - 172.16.10.61 node1: ---------- fqdn_ip4: - 172.16.10.60
由于是一个列表,[0] 表示列表中的第一个值,也就是IP地址。对应到node2上的配置文件格式为:
Listen 172.16.10.61:88
Jinja中使用salt
可以使用salt本身的模块获取主机参数,如获取本机eth0的mac地址:
# salt ‘*‘ network.hw_addr eth0 node2: 00:0c:29:04:73:9d node1: 00:0c:29:e8:97:67
可以在某个需要填入本机mac地址配置的区域添加如下参数:
{{ salt[‘network.hw_addr‘](‘eth0‘) }}
需要在sls中指定Jinja模板。
Jinja中使用Pillar
Jinja中也可以使用Pillar,如果有自定义的Pillar值,可以直接通过Jinja模板获取,当然首先必须添加了Jinja模板。
# salt ‘*‘ pillar.items node1: ---------- node2: ---------- apache: httpd
在配置文件中使用如下参数来获取pillar:
{{ pillar[‘apache‘] }}
这样,在分发给node2上的配置文件就会 添加一个httpd的参数。
这个用法可以用来配置文件中涉及到的账户密码等敏感信息。
在SLS模板中定义
也可以将需要配置写在SLS里面的Defaults,变量列表中。
- template: jinja - defaults: IPARRD: {{ grains[‘fqdn_ip4‘][0] }} PORT: 88
然后在文件中直接引用变量{{ IPADDR }}即可。