saltstack之state状态管理
1. 状态的概念及如何撰写一条状态
2. 状态配置文件的各个要素
3. 使用requisites对状态进行排序控制
一、状态的概念及如何撰写一条状态
远程执行模块的过程类似于一段shell脚本或python脚本,每次执行都会触发相同的功能。在大量minion运行远程命令非常重要,但是对minion的环境控制,建议还是用状态进行管理更为友好。
状态是对minion的一种描述和定义,管理人员不需要关系任务是如何完成的,只需要关心minion需要达到怎样的一个状态,具体的执行由salt的负责管理状态的模块来完成。
首先我们使用pkg执行模块来完成httpd服务的部署:
[[email protected] modules]# salt '*' pkg.install "httpd"
那么,如何使用state模块来完成httpd的部署呢?
1.修改master的配置文件,指定base环境路径,base环境是必须指定的
[[email protected] salt]# vi /etc/salt/master
file_roots:
base:
- /srv/salt/base
2. 高级状态的使用需要在master配置文件里面打开state_top: top.sls
[[email protected] salt]# grep -n ^state_top /etc/salt/master
329:state_top: top.sls
3. 重启salt-master服务
[[email protected] salt]# /bin/systemctl restart salt-master.service
4. 创建目录
[[email protected] salt]# mkdir -p /srv/salt/base/
5. 在base目录下创建top.sls文件,创建web目录及创建apache.sls文件
[[email protected] salt]# tree
.
└── base
├── top.sls
└── web
└── apache.sls
[[email protected] salt]# vi /srv/salt/base/top.sls
base:
'*':
- web.apache
[[email protected] salt]# vi /srv/salt/base/web/apache.sls
apache-install: #id,名字自己去,建议形象店
pkg.installed: #pkg是状态模块,installed是模块里面的方法
- name: httpd #httpd是方法里面的参数
apache-service:
service.running:
- name: httpd
- enable: True #设置开机启动
6. 执行状态模块部署服务,状态模块会到base目录下找到top.sls,文件编排告诉每个minion需要干什么
[[email protected] salt]# salt '*' state.highstate
[[email protected] base]# salt '*' cmd.run 'ss -tnulp | grep nginx'
izwz9f8xrvty50quc2gq50z:
tcp LISTEN 0 128 *:80 *:* users:(("nginx",pid=21446,fd=6),("nginx",pid=21445,fd=6))
tcp LISTEN 0 128 :::80 :::* users:(("nginx",pid=21446,fd=7),("nginx",pid=21445,fd=7))
iZbp150ikdomqe3b32qaubZ:
tcp LISTEN 0 128 *:80 *:* users:(("nginx",pid=21881,fd=6),("nginx",pid=21880,fd=6))
tcp LISTEN 0 128 :::80 :::* users:(("nginx",pid=21881,fd=7),("nginx
扩展:state.highstate与satte.sls的区别?
1.state.highstate会读取所有环境(包括base环境)的top.sls文件,并且执行top.sls文件内容里面定义的sls文件,不在top.sls文件里面记录的sls则不会被执行;
2.state.sls默认读取base环境,但是它并不会读取top.sls文件。你可以指定state.sls执行哪个sls文件,只要这个sls文件在base环境下存在;
3.state.sls也可以指定读取哪个环境:state.sls salt_env=’prod’xxxx.sls,这个xxxx.sls可以不在top.sls中记录。
二、状态配置文件的各个要素
通过上面的例子,我们理解了状态的概念,并制作了第一个状态文件,下面我们来看下状态文件的构成,以上面的apache.sls文件为例:
[[email protected] salt]# cat apache.sls
insatll_httpd:
pkg.installed:
- name: httpd
注:
1. YAML是一个强大的标记性语言
2. Salt使用一个YAML的小型子集,映射常用的数据结构,如列表和字典
3. YAML renderer是将YAML数据格式的结构变异成python数据结构给salt使用
三个规则:
1. 规则一:缩进
YAML使用了一个固定的缩进风格来表示数据层结构关系。salt需要每个缩进级别由两个空格组成。不要使用tabs。
2. 规则二:冒号
Python的字典理所当然是简单的键值对,其它语言的用户应该也知道这个数据类型叫哈希表或者关联数组。
3. 规则三:短横杠
用一个短横杠加一个空格来表示列表项。多个项使用同样的缩进级别作为同一列表的一部分。
三、使用requisites对状态进行排序控制
这里,我们用安装JDK+tomcat的例子来阐述saltstack使用requisites对状态是如何进行排序控制的?
requisites:中文意思为必要条件,在salt里面可以理解为依赖某一动作或行为才能出发下一步的操作。使用require可以让各ID之间产生依赖关系,避免无效执行。
ok,废话不多讲了,直接进入主题,我们用state状态模块安装jdk+tomcat来告诉大家其中的奥妙!
1. 修改master配置文件,指定base环境路径,重启salt-master服务
[[email protected] ~]# vi /etc/salt/master
file_roots:
base:
- /srv/salt/base
[[email protected] ~]# /bin/systemctl restart salt-master.service
2. 创建目录
[[email protected] ~]# mkdir /srv/salt/base
3. base目录结构
[[email protected] ~]# cd /srv/salt/base
[[email protected] base]# tree
├── jdk
│ ├── files
│ │ └── jdk1.7.0_79.tar.gz
│ └── install.sls
├── tomcat
│ ├── files
│ │ ├── apache-tomcat-7.0.88.tar.gz
│ │ └── catalina.sh
│ └── install.sls
└── top.sls
4.创建top.sls文件
[[email protected] base]# vi top.sls
base:
'*':
- jdk.install #jdk表示jdk目录,install表示files目录下的install.sls文件
- tomcat.install #同理
5.jdk目录下创建install.sls
[[email protected] jdk]# vi install.sls
jdk-installl:
file.managed:
- name: /usr/local/jdk1.7.0_79.tar.gz
- source: salt://jdk/files/jdk1.7.0_79.tar.gz
- user: root
- group: root
- mode: 755
cmd.run:
- name: cd /usr/local/ && tar axf jdk1.7.0_79.tar.gz && mv jdk1.7.0_79 /usr/local/jdk && chown -R root:root /usr/local/jdk
- unless: test -d /usr/local/jdk #unless: 判断是否为false,如果为false则执行cmd.run中的命令
- requrie:
- file: jdk-install
jdk-config:
file.append:
- name: /etc/profile
- text:
- export JAVA_HOME=/usr/local/jdk
- export JRE_HOME=$JAVA_HOME/jre
- export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib
- export PATH=$PATH:${JAVA_HOME}/bin:${JRE_HOME}/bin
6.tomcat目录下创建install.sls
[[email protected] tomcat]# vi install.sls
include:
- jdk.install
tomcat_install:
file.managed:
- name: /usr/local/apache-tomcat-7.0.88.tar.gz
- source: salt://tomcat/files/apache-tomcat-7.0.88.tar.gz
- user: root
- group: root
- mode: 755
cmd.run:
- name: cd /usr/local/ && tar axf apache-tomcat-7.0.88.tar.gz && mv apache-tomcat-7.0.88 /usr/local/tomcat && chown -R root:root /usr/local/tomcat
- unless: test -d /usr/local/tomcat
tomcat-config:
file.append:
- name: /etc/profile
- text:
- export TOMCAT_HOME=/usr/local/tomcat
- export PATH=${TOMCAT_HOME}/bin:$PATH
tomcat-catalina.sh:
file.managed:
- name: /usr/local/tomcat/bin/catalina.sh
- user: root
- mode: 755
- source: salt://tomcat/files/catalina.sh
- require:
- file: tomcat_install
6. 使用state状态模块进行部署
[[email protected] base]# salt '*' state.highstate
注:
1. catalina.sh以及没有添加到files目录下的server.xml文件,用户都可以自己定义其内容。生产环境中,这两个文件可能配置比较复杂,不可能一台台的配置,所以可以提前配置好文件内容。当然,这只是其中一种方法,也可以在salt-master端用file模块发送文件到客户端或者用命令也可以,具体操作自己去找答案吧。
2. 模块之间的依赖关系
watch: 关注某一事件变化
watch_in: 被关注自身事件变化
require: 依赖某一事件发生
require_in: 被依赖自身事件发生
unless: 判断是否为false,如果为false则执行。常用在cmd中name的命令。
onlyif: 判断是否为true,如果为true则执行。
3.在批量安装的时候,建议提前规划好目录结构以及模块之间的依赖关系。