saltstack--狀態判斷unless與onlyif


saltstack狀態判斷unless與onlyif

很多時候我們在編寫 state 文件時候需要進行判斷,判斷該目錄或文件是否存在,判斷該配置是否已經已添加,然后根據判斷結果再決定命令或動作是否執行,這時候就需要用到了狀態判斷的unlessonlyif

unless

unless示例:需求創建/tmp/unless.txt文件,存在則不創建,不存在則創建

[root@salt-master ~]# cat /srv/salt/prod/unless.sls 
test-unless:
  cmd.run:
    - name: touch /tmp/unless.txt
    - unless: test -f /tmp/unless.txt


[root@salt-master ~]# salt 'salt-minion01' state.sls unless saltenv=prod
salt-minion01:
----------
          ID: test-unless
    Function: cmd.run
        Name: touch /tmp/unless.txt
      Result: True
     Comment: Command "touch /tmp/unless.txt" run
     Started: 15:10:51.522319
    Duration: 31.822 ms
     Changes:   
              ----------
              pid:
                  6538
              retcode:
                  0
              stderr:
              stdout:

Summary for salt-minion01
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time:  31.822 ms
#上面第一次執行,可以看到發生了一次更改,創建了 /tmp/unless.txt文件


[root@salt-master ~]# salt 'salt-minion01' state.sls unless saltenv=prod
salt-minion01:
----------
          ID: test-unless
    Function: cmd.run
        Name: touch /tmp/unless.txt
      Result: True
     Comment: unless condition is true
     Started: 15:11:40.819789
    Duration: 10.477 ms
     Changes:   

Summary for salt-minion01
------------
Succeeded: 1
Failed:    0
------------
Total states run:     1
Total run time:  10.477 ms
#第二次執行,可以看到該文件已經存在,並沒有再次創建

通過上面的小案例可以看出,unless返回為真則不執行,當unless返回為假才執行。

onlyif

onlyif正好和unless相反,當onlyif返回為真執行,當onlyif返回為假不執行

onlyif示例:需求,當/tmp/onlyif.txt文件存在,則創建/tmp/onlyif目錄,不存在,則不創建/tmp/onlyif目錄

[root@salt-master ~]# cat /srv/salt/prod/onlyif.sls 
test-onlyif:
  cmd.run:
    - name: mkdir /tmp/onlyif
    - onlyif: test -f /tmp/onlyif.txt


[root@salt-master ~]# salt 'salt-minion01' state.sls onlyif saltenv=prod
salt-minion01:
----------
          ID: test-onlyif
    Function: cmd.run
        Name: mkdir /tmp/onlyif
      Result: True
     Comment: onlyif condition is false
     Started: 15:34:56.460583
    Duration: 9.612 ms
     Changes:   

Summary for salt-minion01
------------
Succeeded: 1
Failed:    0
------------
Total states run:     1
Total run time:   9.612 ms

#通過上面可以看到,由於/tmp/onlyif.txt文件不存在,並沒有創建;手動創建一個/tmp/onlyif.txt文件再次執行
[root@salt-master ~]# salt 'salt-minion01' cmd.run "touch /tmp/onlyif.txt"
salt-minion01:
[root@salt-master ~]# salt 'salt-minion01' state.sls onlyif saltenv=prod
salt-minion01:
----------
          ID: test-onlyif
    Function: cmd.run
        Name: mkdir /tmp/onlyif
      Result: True
     Comment: Command "mkdir /tmp/onlyif" run
     Started: 15:38:07.712492
    Duration: 14.646 ms
     Changes:   
              ----------
              pid:
                  6871
              retcode:
                  0
              stderr:
              stdout:

Summary for salt-minion01
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time:  14.646 ms

#可以看到上面我們手動創建了一個/tmp/onlyif.txt文件后再次執行,則發生了改變,在/tmp/創建了onlyif目錄

Redis主從架構案例

說明:該案例在prod環境配置

1)環境准備,定義file_roots環境

[root@salt-master ~]# vim /etc/salt/master
file_roots:
  base:
    - /srv/salt/base
  dev:
    - /srv/salt/dev
  prod:
    - /srv/salt/prod

2)創建對應環境目錄

[root@salt-master ~]# mkdir -p /srv/salt/{base,dev,prod}
[root@salt-master ~]# mkdir -p /srv/salt/prod/redis/files/

3)編寫state sls狀態文件

#初始化redis(安裝和基本配置)
[root@salt-master ~]# cat /srv/salt/prod/redis/init.sls 
redis-install:
  pkg.installed:
    - name: redis

redis-config:
  file.managed:
    - name: /etc/redis.conf
    - source: salt://redis/files/redis.conf
    - user: root
    - group: root
    - mode: 644
    - template: jinja
    - defaults:
      BIND: {{ grains['fqdn_ip4'][0] }}
      PORT: 6379
      DAEMONIZA: 'yes'
    - require:
      - pkg: redis-install

redis-service:
  service.running:
    - name: redis
    - enable: True
    - watch:
      - file: redis-config


#master直接引入 init
[root@salt-master ~]# cat /srv/salt/prod/redis/master.sls 
include:
  - redis.init


#slave引入init 並配置主從信息
[root@salt-master ~]# cat /srv/salt/prod/redis/slave.sls 
include:
  - redis.init

#配置主從
slave-config:
  cmd.run:
    - name: redis-cli -h 192.168.1.34 slaveof 192.168.1.33 6379
    - unless: redis-cli -h 192.168.1.34 info |grep role:slave
    - require:
      - service: redis-service

說明:
unless:返回為真則不執行,反之為假則執行

4)配置文件准備

[root@salt-master ~]# grep "^[a-Z]" /etc/redis.conf  >>/srv/salt/prod/redis/files/redis.conf
[root@salt-master ~]# cat /srv/salt/prod/redis/files/redis.conf 
#這里使用jinja
bind {{ BIND }}
protected-mode yes
#這里使用jinja
port {{ PORT }}
tcp-backlog 511
timeout 0
tcp-keepalive 300
#這里使用jinja
daemonize {{ DAEMONIZA }}
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis.log
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/lib/redis
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

5)top file文件編寫

[root@salt-master ~]# cat /srv/salt/base/top.sls 
prod:
  'salt-minion02':
    - redis.master
  'salt-minion03':
    - redis.slave

6)整體state文件查看

[root@salt-master ~]# tree /srv/salt/prod/redis/
/srv/salt/prod/redis/
├── files
│   └── redis.conf
├── init.sls
├── master.sls
└── slave.sls

1 directory, 4 files

7)top file高級狀態執行

#先測試下看下狀態文件是否編寫正確,再正式執行
[root@salt-master ~]# salt '*' state.highstate test=True
[root@salt-master ~]# salt '*' state.highstate

 

saltstack快速入門

saltstack遠程執行

saltstack配置管理

saltstack數據系統

saltstack使用salt-ssh

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM