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

一、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状态模块部署结果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,915评论 18 139
  • 学习地址[http://tech.mainwise.cn/?p=438] 更新于 3.25 23:16 salt简...
    J书越来越垃圾了阅读 30,912评论 9 36
  • 什么是state模块? 远程执行是salt的核心所在。 管理员可与通过执行远程执行模块,达到对minion的控制(...
    风逍H阅读 909评论 0 0
  • 步入18的我 有些许不一样了 爸妈口中的我已经长大了 别人眼中的我是一个大姑娘了 而我眼中的自己要开始另一种人生了...
    北港时遇阅读 274评论 0 0
  • 人们过往总结出来的经验教训很多时候都值得我们去学习,因为“经验有一个结构,别人能,我也能”。“教条主义”和...
    玄奇阅读 509评论 0 0