很多時候我們在編寫 state
文件時候需要進行判斷,判斷該目錄或文件是否存在,判斷該配置是否已經已添加,然後根據判斷結果再決定命令或動作是否執行,這時候就需要用到了狀態判斷的unless
和onlyif
。
unless
unless
示例:需求創建/tmp/unless.txt
文件,存在則不創建,不存在則創建
[root@salt-master ~]# cat /home/salt/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 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 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 /home/salt/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 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 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目錄