一、state和之前执行模块的区别
执行模块是过程式的,而状态模块是描述式的。当连续几次调用同一个执行模块时,实际上是执行相同的逻辑和指令。状态模块则恰恰相反,它们只执行必要的工作,在目标minion上创建根据描述文件指定的状态。
连续执行 pkg.install 连续执行 state配置# /srv/salt/vsftpd.sls
install_vsftpd:
pkg.installed:
- name: vsftpd
从上面的例子上可以看到 pkg.install 只是运行了 yum install vsftpd -y 的命令,而 state 模块会先判断 vsftpd 软件是否已经安装了,如果没有安装就进行安装操作,如果已经安装过了就什么都不做。所有的状态描述都会遵循这个原则,只有在检测到真实状态和所需状态不同的时候才会执行功能。
二、state模块的语法
SLS配置文件使用YAML语言描述,主要有以下规则:
- 1、缩进:YAML使用了固定的缩进风格来表示数据层级的关系(和Python用缩进来进行流程控制一样),每个缩进级别可以使用2个或者4个空格(不要用制表符)
- 2、冒号:字典中的keys在YAML中的表现形式是一个以冒号结尾的字符串,value的表现形式是冒号后面空一格然后写value
key: value
在python中,上面的将映射为下面的字典
{'key': 'value'}
- 3、短横杠:用一个短横杠加一个空格来表示列表项,多个项使用同一个缩进级别作为同一列表的一部分。
my_list:
- value_one
- value_two
- vlaue_three
在python中,上面的将映射为下面的结构
{'my_list':['value_one','value_two','value_three']}
三、常用状态模块的语法
先介绍两个命令
salt '*' sys.list_state_functions #查看可用的状态模块
salt '*' sys.list_state_functions pkg #查看状态模块中可用的函数
- cmd 和 archive 状态模块常用函数
extract_myapp:
archive.extracted:
- name: /usr/src #解压文件在minion上的位置
# 解压zip文件
# - use_cmd_unzip: True
# - source: salt://src/nginx-1.12.1.zip #要解压的文件的位置
- source: salt://src/nginx-1.12.2.tar.gz #要解压的文件的位置
- user: root
- group: root
- if_missing: /usr/src/nginx-1.12.2
cmd_test:
cmd.run:
- cwd: /usr/src #执行命令的目录
- name: pwd && date #多条命令一定要用&&,不要一条一条执行
- file 状态模块的常用函数
# file.managed: 下发文件到指定minion,确保文件存在
/usr/src/vsftpd.sls: # 发送到minion上的位置
file.managed:
- source:
- salt://vsftpd.sls
- user: root
- group: root
- mode: 644
# file.directory: 在指定minion上创建文件夹
/tmp/mk_salt:
file.directory:
- user: root
- group: root
- mode: 755
- makedirs: True
# file.recurse: 下发整个目录
/root/httpd: #发送到minion上的目录位置
file.recurse:
- source: salt://service/httpd
- include_empty: True
# file.symlink: 建立软连接
/tmp/test: # 链接文件位置
file.symlink:
- target: /root/httpd/test # 源文件位置
- pkg 状态模块的常用函数
install_vsftpd:
pkg.installed: # yum安装软件
- pkgs:
- vsftpd
- ftp
- lftp
- sources: #指定rpm包的位置
- httpd: salt://rpm/httpd.rpm
- service 状态模块常用函数
run_vsftpd:
service.running:
- name: vsftpd #启动的服务名
- enable: True #是否开机自启
- reload: True
- cron 状态模块常用函数
netdate times.aliyun.com &>/dev/null:
cron.present:
- user: root
- minute: '6'
- hour: '5'
- daymonth: '6'
- month: '12'
- dayweek: 5
- user 状态模块常用函数
add_user:
user.present:
- name: hong #要添加的用户名
- fullname: This is test user #用户说明信息
- shell: /bin/zsh
- createhome: True # 创建家目录,False时不创建
- password: $1$f7Mff5j4$H/10mh4IkqgY9y39EKHTj1 # 用户密码,用 openssl passwd -l '密码' 命令来生成
- groups: # 用户附加组
- root
- daemon
- 使用 require 和 watch 进行排序控制
require:只有以来的步骤操作成功后才开始进行本步骤
watch:一旦检测到 vsftpd.conf 文件发生变化,就重新加载 vsftpd 服务
install_vsftpd:
pkg.installed:
- pkgs:
- vsftpd
- ftp
- lftp
run_vsftpd:
service.running:
- name: vsftpd #启动的服务名
- enable: True #是否开机自启
- reload: True
- require:
- pkg: install_vsftpd
- watch:
- file: vsftpd_conf
vsftpd_conf:
file.managed:
- name: /etc/vsftpd/vsftpd.conf
- source: salt://vsftpd.conf
- user: root
- group: root
- mode: 600
四、使用状态模块yum安装 LAMP 环境
apache_install:
pkg.installed:
- name: httpd
mysql_install:
pkg.installed:
- pkgs:
- mysql-server
- mysql
- mysql-devel
php_install:
pkg.installed:
- pkgs:
- php
- php-common
- php-gd
- php-mbstring
- php-mcrypt
- php-devel
- php-xml
- php-soap
- require:
- pkg: apache_install
httpd_conf:
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://httpd.conf
- user: root
- group: root
- mode: 644
- require:
- pkg: apache_install
php_conf:
file.managed:
- name: /etc/php.ini
- source: salt://php.ini
- user: root
- group: root
- mode: 644
- require:
- pkg: php_install
mysql_conf:
file.managed:
- name: /etc/my.cnf
- source: salt://my.cnf
- user: root
- group: root
- mode: 644
- require:
- pkg: mysql_install
apache_run:
service.running:
- name: httpd
- enable: True
- reload: True
- require:
- pkg: apache_install
- watch:
- file: httpd_conf
- file: php_conf
mysql_run:
service.running:
- name: mysqld
- enable: True
- reload: True
- require:
- pkg: mysql_install
- watch:
- file: mysql_conf
LAMP状态模块部署结果
网友评论