首页 > 解决方案 > 如何在 saltstack 中查看特定文件并在文件发生任何更改时执行任何操作?

问题描述

我正在使用 Raspberry Pi 进行此设置。背景是我在 Pi 上附加了一个按钮,用于切换 GPIO 引脚值。按下此按钮时,Pi 应恢复为特定 IP。我在 Pi 中设置了一个 salt-state(master-less minion),它将查看 /sys/class/gpio/gpio4/value 中的一个文件。此文件中的值为“0”或“1”,具体取决于提供给该 GPIO 引脚的电压。我的最终结果应该是执行 bash 脚本或替换接口文件,以便可以在该特定 IP 上访问 Pi。

我已经制作了一个与 /etc/network/interfaces 完全相同的文件并将其放在我的 salt 目录中。我使用 file.managed 来替换文件并且它工作,但是当我按下按钮时我需要这个状态来运行。我已经在 salt-stack 中尝试过 watch 但我没有成功。谁能给我一些关于如何做到这一点的示例代码?过去一周我被困住了。

watching_service:
    service.running:
        - name: watching
        - enable: True
        - restart: True
        - watch:
            - file: /home/pi/new.conf
    file.managed:
        - source: salt://watch/new.conf
        - name: /home/pi/new.conf

目前我在 new.conf 上使用 watch,我希望它在我对 new.conf 进行一些更改时重新启动服务。

我也使用了 onchanges 而不是 watch,但似乎没有任何效果。我可以在 bash 脚本中执行此操作,这将有一个无限的 while 循环来监听 GPIO 引脚上的任何更改,但我认为这会降低 Pi 的稳定性。如果我错了,请纠正我。有没有其他方法可以在没有循环的情况下做到这一点?

标签: watchsalt-stack

解决方案


watch语句告诉一个状态在另一个状态发生更改时运行。

假设,你有这个 SLS 文件在你的file_roots

cat >/srv/salt/state/example.sls <<_EOF_

manage_the_file:
  file.managed:
    - name: /tmp/the_file.txt
    - contents: 'the_content'

run_on_changes:
  cmd.wait:
    - name: echo "I was triggered because manage_the_file was executed"
    - watch:
      - file: manage_the_file

_EOF_              

现在,如果您运行命令..

sudo salt-call state.apply example --state_output changes

..您将看到run_on_changes状态正在运行,但前提是manage_the_file状态也已运行(由于检测到更改)。换句话说:run_on_changes如果状态/tmp/the_file.txt不变,Salt 会跳过该状态,但您仍然需要手动调用 Salt。

我认为您想在更改文件时触发 Salt Highstate。那是另一回事。在 Linux中, Inotify是监视文件系统事件的工具。

使用 Inotify的“ Salt way ”是定义一个Beacon。每当文件更改时,它将在 Salt 中触发一个事件。此外,当事件到达 Salt Master 时,您需要一个触发 Highstate的Reactor 。

但是我认为您的用例不能证明这样的复杂配置是合理的。为什么不使用incrond?这是使用 Inotify 的一种非常方便的方式。

# Install it
sudo apt-get install incrond  (or the equivalent yum call)

# Make sure at least user root may edit the incrontab
echo "root" |sudo tee -a /etc/incron.allow

# Make sure the watched file exists
sudo mkdir -p /home/pi
sudo touch /home/pi/new.conf

# Add an incrond entry
sudo incrontab -e 
/home/pi/new.conf IN_MODIFY echo "I could have called the restart command for the 'watching' service here!"

# Trigger changes
echo "new content" |sudo tee /home/pi/new.conf

您应该在 Syslog 文件(/var/log/syslog在 Debian 上)中看到 Echo 命令的输出。


推荐阅读