saltstack学习笔记
targeting minion
glob
salt '*' test.ping
salt \* test.ping
perl语言兼容正则表达式:
短选项: -E
长选项: --pcre
salt -E '^[mM]in.[eou]n' test.ping
list
短选项:-L
长选项:--list
salt -L web1,web2,db1,proxy1 test.ping
Subnet
短选项:-S
长选项: --ipcidr
匹配整个网段的
salt -S 192.168.0.42 test.ping
salt -S 192.168.0.0/16 test.ping
Grain
短选项:-G
长选项:--grain
salt可以通过操作系统、CPU架构以及自定义的信息等机器特征进行target Minion。
Grain是键值对的方式,所以需要制定键值,通过冒号分隔
salt -G 'os:Ubuntu' test.ping
salt -G 'os_family:Debian' test.ping
一些Grain是多级字典,可以通过冒号进行分隔字典中的每一级键名
salt -G 'ip_interface:eth0:192.168.1.11'
Grain PCRE
长选项:--grain-pcre
基于grain的pcre匹配
salt --grain-pcre 'os:red(hat|flag)' test.ping
Pillar
短选项:-I
长选项: --pillar
salt支持通过pillar数据进行匹配
salt -I 'my_var:my_val' test.ping
混合(Compound)
短选项:-C
长选项:--compound
混合target允许用户在一个shell命令中指定多种target类型。默认使用glob,想指定其他target类型,则需要再前面追加上类型简写和@符号。
如想匹配的系统是ubuntu,pillar中role的设置是web,且属于192.168.100.0/24子网的Minion。
salt -C 'G@os:Ubuntu,I@role:web,S@192.168.100.0/24' test.ping
布尔符号中的与(and)、或(or)及非(not)也可以在target类型中使用,如:
salt -C 'min* or *ion' test.ping
salt -C 'web* or *qa,G@os:Arch' test.ping
节点组(Nodegroup)
短选项:-N
长选项:--nodegroup
节点组是在salt内部使用的(所有的targeting终将创建一个动态节点组),从命令行中显式地指定节点组十分常用。在命令行使用前必须先再salt master的配置文件中以target列表进行定义(使用混合匹配语法),如在配置文件中进行如下定义:
nodegroups:
webdev: 'I@role:web,G@cluster:dev'
webqa: 'I@role:web,G@cluster:qa'
webprod: 'I@role:web,G@cluster:prod'
节点组定义完毕并重载master配置文件后,可以通过salt进行target:
salt -N webdev test.ping
运行模块方法
pkg.install 安装软件包
pkg.remove 卸载软件包
file.replace 类似于sed的功能
SLS文件树
top文件
base:
'*':
- common
- vim
qa:
'*_qa':
- jenkins
web:
'web_*':
- apache2
声明了三个环境,分别是base、qa和web,base环境指定所有minion执行common和vim State,qa环境指定所有以_qa结尾的ID的Minion执行jenkins State。web环境指定所有以web_开头的ID的Minion执行apache2 State。
SLS目录组织
apache2.sls写法对应两种格式:
- apache2/sls/init.sls
- apache2.sls
执行时会先找apache2.sls如果不存在,再找apache2/sls/init.sls,SLS文件可以有多层深度,每一层中间用句点表示.,最好是目录少一些,方便SLS快速查找。
使用State进行配置管理
/srv/salt目录下的文件用于定义Salt State。这是配置管理格式,用来强制Minion处于某一状态(State):X软件包(package)需要安装,文件(file)Y格式正确,服务(service)Z开机自启并处于运行状态等。如下
apache2:
pkg:
- installed
service:
- running
file:
- managed
- name: /etc/apache2/apache2.conf
include块:
通过include可以在一个SLS文件引用其他SLS文件:
include:
- base
- emacs
这个例子中,SLS文件将会把include块内容替换为base.sls(或base/init.sls)和emacs.sls(emacs/init.sls)
SLS文件中不能包含已经存在于include的SLS文件中的ID。
include本身作为一个顶级声明,只能在一个文件中出现一次。
require:
webservice:
service.running:
- name: apache2
- require:
- pkg: web_package
web_package:
pkg.installed:
- name: apache2
正常情况,State SLS都是按顺序从前到后执行的,除非在声明时指定了require,如果指定了require,则会首先执行require指定的内容,再执行这个。
reuire:
require是最基本的requisite,它表示state会等待列表中定义的每一项state都成功执行后才会执行。
apache2:
pkg:
- installed
- require
- file: apache2
service:
- running
- require:
- pkg: apache2
file:
- managed
- name: /etc/apache2/apache2.conf
- source: salt://apache2/apache2.conf
在上边例子中,文件会首先复制到minion上,然后进行软件包的安装,之后再进行服务的启动。
watch
当配置文件发生了变更,apache2服务需要重启才行,这时需要watch,强制State在发现它watch的项目发生了变更时执行一个指定的动作。
apache2:
..SNIP...
service:
- running
- require:
- pkg: apache2
- watch:
- file: apache2
...SNIP...
当一个服务通过watch触发时,如果服务此时是关闭的,则Salt会尝试启动它。如果服务已经在运行中,则Salt会根据情况尝试service.reload,service.full_restart service.restart
use:
salt中是可以在一个State中声明一些默认值的,然后其他的State可以继承(inherit)这些默认值。最常见的就是一个State文件通过include去引用其它文件。如果State中使用的项已经被重新声明了,那么就会被新值覆盖。否则该项在使用时并不会进行任何修改。use类似于include,也是从其他SLS文件中继承过来,但是不会继承requisite部分。
apache2_conf:
file:
- managed
- name: /etc/apache2/apache2.conf
- user: root
- group: root
- mode: 755
- watch_in:
- service: apache2
mysql_conf:
file:
- managed
- name: /etc/mysql/my.cnf
- use:
- file: apache2_conf
- watch_in:
- service: mysql
mysql_conf State会安全地从apache2_conf State中继承user、group及mode,并且不会触发apache重启。
prereq
在某些情况下,有可能State并不需要运行,只有在另一个State预计会变更时才需要运行。例如一个web应用使用apache来提供服务,当产品服务器上的代码库需要变更时,Apache应该先关闭,以免代码没部署完时会有错误。
prereq requisite,就是针对这样的需求设计的。当一个State使用prereq时,Salt会先对prereq中指定关联的项目运行test模式来预计是否会进行变更。如果预计有变更,则Salt会用prereg标记该State需要执行。
apache2:
service:
- running
- watch:
- file: codebase
codebase:
file:
- recurse
...SNIP...
shutdown_apache:
service:
- dead
- name: apache2
- prereq:
- file: codebase
扩展SLS文件
除了include块之外,State SLS文件还可以使用extend块来修改include块引入的SLS文件的内容。使用extend代码块和使用requisite类似,但是还有一些明显的不同。use或use_in requisite会复制默认值到另外的State中或从其他State上复制默认值到本State中,extend块则只能对引入的State进行修改。
# cat /srv/generic_apache/init.sls
apache2_conf:
file:
- managed:
- name: /etc/apache2/apache2.conf
- source: salt://apache2/apache2.conf
另一个文件中:
include:
- generic_apache
extend:
apache2_conf:
- file:
- source: salt://django/apache2.conf
另一个文件:
include:
- generic_apache
extend:
apache2_conf:
- file:
- source: salt://django/apache2.conf
Grain、Pillar及模板
Grain定义在指定的Minion上,Pillar定义在Master上。Grain常用于提供静态数据,Pillar更倾向于动态数据。
Pillar
pillar的top.sls文件在配置和功能上和State的top.sls文件一致,首先声明一个环境,然后是一个target,最后target需要使用的SLS文件列表。
base:
'*':
- bash
pillar只存储一些静态数据,因此文件内容相对简单一些。
例:
skel_dir: /etc/skel/
role: web
web_content:
images:
- jpg
- png
- gif
scripts:
- css
- js
模板
默认先用jinja渲染,再使用yaml。如果想改变渲染方式,可以在模板文件首行指定#!py #!mako|json先用mako渲染,在用json渲染
/etc/salt/master中默认配置 renderer: yaml_jinja,如果想修改默认配置,可以在此修改。
也可以在State中使用模板时指定渲染引擎:
apache2_conf:
file:
- managed
- name: /etc/apache2/apache2.conf
- source: salt://apache2/apache2.conf
- template: jinja
Jinja快速入门
变量可以通过闭合的双大括号来引用。如有一个叫做user的Grain:
```shell
The user {{ grains['user'] }} is referred to here.
Pillar也可以用这种方式:
```shell
The user {{ pillar['user'] }} is referred to here.
以上例子如果user没有被定义,模板则无法正确渲染。更安全的办法是使用内置的salt交叉调用执行模块:
The user {{ salt['grains.get']('user', 'larry') }} is referred to here.
The user {{ salt['pillar.get']('user', 'larry') }} is referred to here.
如果user没有定义,则默认会使用larry这个值。
通过set设置模板中的局部变量:
{% set myvar = 'My Value' %}
由于jinja基于Python,因此大多数Python的数据类型都是支持的,比如列表和字典
{% set mylist = ['apples', 'oranges', 'bananas'] %}
{% set mydict = {'favorite pie': 'key lime', 'favorite cake': 'saccher torte'} %}
逻辑判断:
{% if grains['os_family'] == 'Debian' %}
apache2:
{% elif grains['os_family'] == 'RedHat' %}
httpd:
{% endif %}
pkg:
- installed
service:
- running
根据不同的系统,定义apache软件包的名叫做apache2还是httpd。state的其他部分则是相同的。
循环:
{% set berries = ['blue', 'rasp', 'straw'] %}
{% for berry in berries %}
{{ berry }} berry
{% endfor %}