watch - 如何在 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
- watch_service 是一种盐态
- watch 是一个 systemd 服务,它在 /tmp 中创建一个空文件夹(不需要)
目前我在 new.conf 上使用 watch,我希望它在我对 new.conf 进行一些更改时重新启动服务。
我也使用了 onchanges 而不是 watch,但似乎没有任何效果。我可以在 bash 脚本中执行此操作,这将有一个无限的 while 循环来监听 GPIO 引脚上的任何更改,但我认为这会降低 Pi 的稳定性。如果我错了,请纠正我。有没有其他方法可以在没有循环的情况下做到这一点?
解决方案
该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 命令的输出。
推荐阅读
- sqlite - SQLite Epoch 时间查询
- algorithm - 二和及其时间复杂度
- node.js - mongodb db没有出现
- apache-spark - 将列组合成键、值对列表(无 UDF)
- reactjs - React Hooks 和 React 生命周期方法
- matlab - 使用 QR 分解 (MATLAB) 求解线性回归模型
- html - 在 Github Flavored Markdown 中水平居中表格
- python-3.x - DHCP嗅探python3
- angular - MatDialog 的背景在 Angular 中显示为灰色板
- c# - 如何在 ResourceDictionary 的 CombinedGeometry-tag 中使用从 InkScape 导出的 Xaml 多边形