salt_state

state:声明或命令表示一个系统的配置。
saltstack state的核心文件是SLS文件,或者叫salt state文件,SLS文件采用的数据格式是YAML。SLS描述了系统的目标状态,也就是想到达到的状态,而且是以一种简单的方式来包含这些数据,也就是配置管理。

SLS实际上是一个数据结构:字典,列表,字符串,数字等。通过这些方法,使salt更加灵活。
states存储在master端的文本文件中,通过master的文件服务(salt File Server) 按需传输到minion端,这些state文件组成了state树。
查看stat模块支持的列表:

salt ginkgo sys.list_state_modules
ginkgo:
    - acl
    - alias    
    - elasticsearch_index
    - elasticsearch_index_template
    - environ
    - pagerduty_user
    - pecl
    - pip
    - pkg
    - salt .....

查看state模块列表支持的函数:

# salt '*' sys.list_state_functions pkg
ginkgo:
    - pkg.downloaded
    - pkg.group_installed
    - pkg.installed
    - pkg.latest
    - pkg.mod_aggregate
    - pkg.mod_init
    - pkg.mod_watch
    - pkg.patch_downloaded
    - pkg.patch_installed
    - pkg.purged
    - pkg.removed
    - pkg.uptodate
  • 启用salt state 即salt 文件服务器。

修改master的配置文件,打开file_roots环境

file_roots:
   base:
     - /srv/salt/

这里表示开启salt file server ,salt state的sls文件也是写在file_roots所定义的目录下。

- 编辑sls文件
sls文件位于/srv/salt目录下,以安装httpd为例:
1.准备top文件。

/srv/salt/top.sls
base:
  "*":
    - httpd

base:
  'os:CentOS':
    - match: grain          
    - httpd

 - top.sls负责minion和sls文件的绑定,即那些Minion执行什么样的sls文件,是配置管理的入口文件,一切都是从这里开始的,在master主机上,默认存放在/srv/salt下,top.sls默认从base标签向下执行,下一级是操作目标。
     base:表示使用环境是base.
 - top.sls默认从base标签开始解析,下一级是要操作的目标即minion,minion可以通过正则去匹配,也可以通
 - 过grain模块,分组名进行匹配,下一级执行的是state文件
 - "*"表示匹配所有minion
 - httpd 表示要执行httpd.sls文件,因此,我们还要在/srv/salt/目录下编辑httpd.sls文件
 - 使用grain匹配minion
 - 使用grains匹配Minion.
 - os是grain的属性,centos是os的属性,这里通过grains 去匹配minion。
 - 查看grain的属性:salt ginkgo grains.items

- 编辑/srv/salt/httpd.sls

httpd:
  pkg:
    - installed
  service:
    - running
    - require:
      - pkg: httpd

httpd:
  pkg.installed: 
  service.running:
    - require:
      - pkg: httpd

httpd.sls的数据是YAML格式
第一行,ID声明,该组数据的ID,这个ID设置了需要被维护的东西的名字,如命令,软件,或者包名,将要操作的文件或者其他。 这个名字可以是任意的,但是要在state modules下指明需要维护的事物,使用- name指定。
如果ID声明下边没有name 声明,那么,ID声明就默认为name声明。
第二行:state声明,即定义使用那个state modules
第三行:函数声明,定义使用那个state modules,此处使用的是state模块,state模块有个function是installed,该功能是用来安装,函数声明就是用来调用函数。
第四行:使用一个state的service函数
第五行:service的函数
第六,七行: require函数,执行这个操作需要require函数后的条件去达成,这里表示如果要运行httpd服务,需要确保httpd包已经安装。

- 执行SLS文件
salt ginkgo state.highstate
执行单个文件:
salt ‘*’ state.sls httpd,state.sls默认的运行环境是base,state.sls并不读取top.sls,所以state.sls需要单独执行哪些sls的话,需要自定义.
salt “*”state.sls saltenv=’prod’ nginx

- 多个SLS 文件

/srv/salt/httpd/init.sls
httpd:
  pkg:
    - installed
  service:
    - running
    - require:
      - pkg: httpd


/var/www/html/index.html:
  file.managed:
    - source: salt://httpd/index.html
    - require:
      - pkg: httpd
在声明ID的时候,实际上就是指定了minion下载文件后的存放路径

常用的state模块为pkg和file模块

sls文件命名空间
规则:


 - sls文件的扩展名.sls被省略
 - 子目录可以更好的组织,麦克格子目录都由一个点来表示。 例如: httpd/httpd.sls可以简称为httpd.httpd
 - 如果子目录创建一个Init.sls的文件,引用的时候,仅指定该目录即可,即:httpd/init.sls,可以简称为httpd
 - 如果一个目录下同时存在init.sls和httpd.sls,那么init.sls将被忽略。

state的逻辑关系
1.state的逻辑关系列表:


 - match :匹配某个模块,比如:match:grain match: nodegroup
 - require: 依赖某个state,在运行此state之前,先运行依赖的state,依赖可以有多个
 - watch: 在某个state变化时运行此模块
   salt can only watch other states that are specified, so it will only watch files that are managed by salt itsef
   也就是说,salt只能监控他自己管理的文件,如果该functions下边没有管理文件的话,就会报
   The following requisites were not found 错误。
   可以使用全局匹配:

            ```
            fail2ban:
              pkg:
                - installed

              file.directory:
                - name: /etc/fail2ban/jail.d/
                - source: salt://safety_tools/fail2ban/jail.d/
                - name: /etc/fail2ban/jail.d/
                - source: salt://safety_tools/fail2ban/jail.d/
                - name: /etc/fail2ban/
                - sorce: salt://safety_tools/fail2ban/conf/
              service.running:
                - enable: True
                - require:
                  - pkg: fail2ban
              watch:
                  - file: /etc/fail2ban/jail.d/*
            <注意:此时的watch 不属于service functions ,而是属于全局匹配,和service并列>
            ```



 - order: 优先级比require和watch低,有order指定的state比没有order指定的优先级高
 - onlyif:此属性指定一个命令,此命令正常(退出码为0)运行时,当前command才会运行
 - unless:此属性指定一个命令,此命令非正常(退出码为非0)运行时,当前command才会运行
cat apache.sls 
apache: 
  pkg.installed:
    - name: {{pillar['pkgs']['apache']}}
  service.running:
    - name: {{pillar['pkgs']['apache']}}
    - require:
      - pkg: {{pillar['pkgs']['apache']}}

watch语句和require很相似,都能保证被监视或需要的state在自己之前执行,但是watch还有其他作用。在被监视的state发生变化时,定义watch语句的state会执行自己的watcher函数。也就是说,更新软件包,修改配置文件,用户的uid发生变化都会触发service state的watcher函数,从而重启服务。示例如下:

    - require:
      - cmd: extract_python
      - pkg: python_pkg
    - unless: test -d /usr/local/python27
    - unless: python -V 2>&1 | grep "^Python 2.7.12$"
    - unless: sed -n '1p' /usr/bin/yum | grep -e "^#\!/usr/bin/python2.4$"

2.state逻辑关系实例:

httpd:                                  # maps to "name"
  pkg:
    - installed
  file:                                # maps to State module filename
    - managed:                          # maps to the managed function in the file State module
    - name: /etc/httpd/conf/httpd.conf  # one of many options passed to the manage function
    - source: salt://httpd/httpd.conf
    - require:
      - pkg: httpd
redis:
  pkg:
    - latest
  file.managed:
    - source: salt://redis/redis.conf
    - name: /etc/redis.conf
    - require:
      - pkg: redis
  service.running:
    - enable: True
    - watch:
      - file: /etc/redis.conf
      - pkg: redis

一旦配置文件发生变化,或软件包发生变化,都会进行服务重启。
3. include和extend

调用

对单个文件的调用:
salt "*" state.sls  saltenv='prod' nginx.stock  
执行prod环境下nginx目录下的stock.sls文件。以可以使用下面的方法调用:
salt-call  state.sls webserver saltenv=dev test=True
对top.sls的调用
salt '*' state.highstate
salt '*' state.highstate top
salt '*' state.highstate -v test=True
这里绝对不能像使用单个sls文件那样,使用state.apply或state.sls加被被执行的top.sls文件名,这里必须使用highstate(高水平的state)

高级SLS模版语法

include 语句

使用include语句进行多个文件中的state之间的依赖,例如:

python/python-libs.sls:
python-dateutil:
  pkg.installed

python/django.sls:
include:
  - python.python-libs
django:
  pkg.installed:
    - require:
      - pkg: python-dateutil

extend 语句:
使用extend 语句修改之前的例子,extend 语句只是起追加作用,而不是取代任何必要的组件。例如当apache的vhosts文件发生了改变也重启apache

apache/apache.sls:
apache:
  pkg.installed

apache/mywebsite.sls:
include:
  - apache.apache
extend:
  apache:
    service:
      - running
      - watch:
        - file: /etc/httpd/extra/httpd-vhosts.conf
/etc/httpd/extra/httpd-vhosts.conf:
  file.managed:
    - source: salt://apache/httpd-vhosts.conf

names语句:
可以使用names语句一次性声明多个states来覆盖ID语句,这经常用在模版中利用循环来实现。

stooges:
  user.present:
    - names:
      - moe
      - larry
      - curly
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值