(三)、通过state模块定义主机状态

96
w也不知道
2017.10.24 21:05* 字数 595

一、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 #查看状态模块中可用的函数
  1. 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 #多条命令一定要用&&,不要一条一条执行
  1. 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 # 源文件位置
  1. pkg 状态模块的常用函数
install_vsftpd:
    pkg.installed: # yum安装软件
        - pkgs:
            - vsftpd
            - ftp
            - lftp
        - sources: #指定rpm包的位置
            - httpd: salt://rpm/httpd.rpm
  1. service 状态模块常用函数
run_vsftpd:
    service.running:
        - name: vsftpd #启动的服务名
        - enable: True #是否开机自启
        - reload: True
  1. cron 状态模块常用函数
netdate times.aliyun.com &>/dev/null:
    cron.present:
        - user: root
        - minute: '6'
        - hour: '5'
        - daymonth: '6'
        - month: '12'
        - dayweek: 5
  1. 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
  1. 使用 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状态模块部署结果
saltstack