SaltStack

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SaltStack 相关的知识,希望对你有一定的参考价值。

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 }}即可。


本文出自 “Trying” 博客,请务必保留此出处http://tryingstuff.blog.51cto.com/4603492/1871589

以上是关于SaltStack 的主要内容,如果未能解决你的问题,请参考以下文章

首发分析 | SaltStack远程执行代码多个高危漏洞透析(CVE-2021-25281/25282/25283)

Python操作Saltstack

预警通报关于SaltStack多个高危漏洞的预警通报

漏洞告警SaltStack多个高危漏洞(CVE-2021-25281/25282/25283)

漏洞更新SaltStack 多个高危漏洞(含漏洞分析及深信服解决方案)

Saltstack