官方网站:salt requisite系统是用来创建状态文件的关系。提供一个简单的方法定义状态文件之间的依赖性。

使用state文件的name或id属性指定代表的关系,requisite的整体格式是 <state name>:<names or ids>

通用示例:软件在确认运行时,需要优先安装软件。如下:

nginx:
  pkg.installed:
    - name: nginx-light
  service.running:
    - enable: True
    - require:
      - pkg: nginx

如果没有使用requisite,salt会尝试安装nginx,而后运行nginx,无论是否安装成功。

由上面介绍了整体格式<state name>: <names or ids>,就了解了有2个必须条件:

1. state module name

2. state 文件的id或name参数

image.pngimage.png

可以省略state module,但是会匹配所有id或name参数的。建议加入state module。

image.png


requisite所有的类型(所有类型都有另一种表示require_in或require-in,是一种被监控的语义):

1.require 执行前要匹配成功

2.onchanges:目标改变就执行

3.watch:与onchanges类似

4.listen:与onchanges类似

5.prereq :目标state改变,则执行

6.onfail:目标失败,才会执行

7.use:从另一个state复制参数

还有额外的附加类型:

require_any

watch_any

onchanges_any

onfail_any


1.require,建立一种关联 只有所需的state都执行成功才会执行当前state,如下示例:只有两个file都成功执行后才会启动服务

nginx:
  service.running:
    - require:
      - file: /etc/nginx/nginx.conf
      - file: /etc/nginx/conf.d/ssl.conf

require可以+sls文件

include:
  - foobar:
  pkg.installed:
    - require:
      - sls: foo

2.onchanges,若state文件发生改变且返回True,就会执行。

myservice:
  file.managed:
    - name: /etc/myservice/myservice.conf
    - source: salt://myservice/files/myservice.conf
  cmd.run:
    - name: /usr/local/sbin/run-build
    - onchanges:
      - file: /etc/myservice/myservice.conf

3.watch,增加一个附加条件来监控状态是否发生改变。watch常用语service.running

ntpd:
  service.running:
    - watch:
      - file: /etc/ntp.conf
  file.managed:
    - name: /etc/ntp.conf
    - source: salt://ntp/files/ntp.conf

或者平滑启动,常用

nginx:
  service.running:
    - reload: True
    - watch:
      - file: nginx
  file.managed:
    - name: /etc/nginx/conf.d/tls-settings.conf
    - source: salt://nginx/files/tls-settings.conf

4.listen

restart-apache2:
  service.running:
    - name: apache2
    - listen:
      - file: /etc/apache2/apache2.confconfigure-apache2:
  file.managed:
    - name: /etc/apache2/apache2.conf
    - source: salt://apache2/apache2.conf

5.prereq

graceful-down:
  cmd.run:
    - name: service apache graceful
    - prereq:
      - file: site-codesite-code:
  file.recurse:
    - name: /opt/site_code
    - source: salt://site/code

6.onfail

primary_mount:
  mount.mounted:
    - name: /mnt/share
    - device: 10.0.0.45:/share
    - fstype: nfsbackup_mount:
  mount.mounted:
    - name: /mnt/share
    - device: 192.168.40.34:/share
    - fstype: nfs
    - onfail:
      - mount: primary_mount

7.use

/etc/foo.conf:
  file.managed:
    - source: salt://foo.conf
    - template: jinja
    - mkdirs: True
    - user: apache
    - group: apache
    - mode: 755/etc/bar.conf:
  file.managed:
    - source: salt://bar.conf
    - use:
      - file: /etc/foo.conf


示例:

install-man:
  pkg.installed:
{% if grains['id'] == '136' %}
    - pkgs:
      - man
      - lrzsz
{% endif %}

service-running:
  service.running:
    - name: crond
    - enable: Ture
    - init_delay: 10
    - require:
      - pkg: install-man
    - watch:
      - file: /tmp/bb.log

/tmp/bb.log:
  file.managed:
    - source:
      - salt://files/test.j2
      - salt://files/hosts1
#    - name: /tmp/aa.log
    - user: root
    - group: root
    - mode: 644
#    - template: jinja