SaltStack | 如何将cmd.run的shell输出分配给Jinjavariables?

问题

无法在我的Salt状态中分配cmd.run的输出。 即使load_avg中的load_avg不是真的相等或超出threshold ,条件总是返回true。 我还在configuration中包含了我尝试过的东西。

组态

 # {% set load_avg = salt['cmd.run']('uptime | sed "s/.*load average: //" | cut -d " " -f2 | cut -d . -f1') %} # Not working # {% set load_avg = salt['cmd.run']('/bin/sh -c "uptime | sed \"s/.*load average: //\" | cut -d \" \" -f2 | cut -d . -f1"') %} # Not working # {% set load_avg = salt['cmd.run']('echo 0') %} # Not working # {% set load_avg = salt['cmd.shell']('uptime | sed "s/.*load average: //" | cut -d " " -f2 | cut -d . -f1') %} # Not working # {% set load_avg = 0 %} # Working. Output: Load average is normal message {% set load_avg = 6 %} # Working: Output: Load average is HIGH message {% set threshold = 5 %} check_load_avg: cmd.run: {% if load_avg >= threshold %} - name: echo 'Load average is HIGH. load_avg={{ load_avg }}, threshold={{ threshold }}' {% else %} - name: echo 'Load average is normal. load_avg={{ load_avg }}, threshold={{ threshold }}' {% endif %} 

在CLI中运行cmd.run

 [ec2-user@ip-10-0-1-48 hello]$ sudo salt '*' cmd.run 'uptime | sed "s/.*load average: //" | cut -d " " -f1 | cut -d . -f1' ip-10-0-1-48.ec2.internal: 0 [ec2-user@ip-10-0-1-48 hello]$ sudo salt '*' cmd.run 'uptime | sed "s/.*load average: //" | cut -d " " -f1 | cut -d . -f1' ip-10-0-1-48.ec2.internal: 4 [ec2-user@ip-10-0-1-48 hello]$ 

盐和操作系统版本

 [ec2-user@ip-10-0-1-48 hello]$ salt --version salt 2017.7.2 (Nitrogen) [ec2-user@ip-10-0-1-48 hello]$ uname -a Linux ip-10-0-1-48 4.9.51-10.52.amzn1.x86_64 #1 SMP Fri Sep 29 01:16:19 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux [ec2-user@ip-10-0-1-48 hello]$ 

我认为主要的问题是来自cmd的load_avg不是一个数字,而是一个string,你必须将其转换。 使用load_avg|float (或甚至load_avg|int )就像这样工作:

 {% set load_avg = salt['cmd.shell']('uptime | sed "s/.*load average: //" | cut -d " " -f2 | cut -d . -f1') %} {% set threshold = 1 %} check_load_avg: cmd.run: {% if load_avg|float >= threshold %} - name: echo 'Load average is HIGH. load_avg={{ load_avg }}, threshold={{ threshold }}' {% else %} - name: echo 'Load average is normal. load_avg={{ load_avg }}, threshold={{ threshold }}' {% endif %} 

输出:

 ---------- ID: check_load_avg Function: cmd.run Name: echo 'Load average is HIGH. load_avg=1, threshold=1' Result: True Comment: Command "echo 'Load average is HIGH. load_avg=1, threshold=1'" run Started: 10:19:42.238409 Duration: 9.731 ms Changes: ---------- pid: 5976 retcode: 0 stderr: stdout: Load average is HIGH. load_avg=1, threshold=1 

threshold=5

 ---------- ID: check_load_avg Function: cmd.run Name: echo 'Load average is normal. load_avg=1, threshold=5' Result: True Comment: Command "echo 'Load average is normal. load_avg=1, threshold=5'" run Started: 10:20:31.846864 Duration: 9.361 ms Changes: ---------- pid: 6184 retcode: 0 stderr: stdout: Load average is normal. load_avg=1, threshold=5 

编辑:您可以直接使用盐模块status.loadavg获得平均负载:

 # salt-call status.loadavg local: ---------- 1-min: 0.12 15-min: 0.31 5-min: 0.25 

在jinja: {% set load_avg = salt['status.loadavg']()['1-min'] %}