例如,在编辑配置文件时,/etc/sysctl.conf
以幂等方式进行更新通常很有用,这意味着如果多次执行脚本,您不会为所做的配置更改获得多个条目。
作为我遇到这种情况的真实实例,我需要在多阶段ansible
剧本中编辑上述文件。但问题是,如果后期失败,则需要重新运行playbook,这意味着更新命令可能会运行多次,如果更新不是幂等的,则会导致重复。
那么问题是如何以幂等方式更新此类配置文件?
一个例子非-幂等更新为:
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
或在 ansible 中:
- name: Set swappiness setting
shell: echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
理想情况下,如果最初设置了变量的值,则应将其替换为新值。
答案1
不要运行 shell 命令,而是使用sysctl
模块。
如果可能,请避免使用shell
.
- ansible.posix.sysctl:
name: vm.swappiness
value: '10'
state: present
答案2
我刚刚找到了另一个答案,https://stackoverflow.com/a/31632883/376258, 指向http://augeas.net/感谢您的问题引发的一些好奇的谷歌搜索。这是我在 ubuntu 20.04 中如何使其工作的:
sudo apt install libaugeas-dev
virtualenv -p /usr/bin/python3.10 venv; . venv/bin/activate.fish
pip install git+https://github.com/hercules-team/python-augeas
sudo venv/bin/python3 -c """
import augeas
aug = augeas.Augeas()
aug.set('/files/etc/sysctl.conf/fs.inotify.max_inotify_watches', '44194306')
aug.set('/files/etc/sysctl.conf/fs.inotify.max_user_watches', '44194306')
aug.save()
"""
并验证:
cat /etc/sysctl.conf | grep inotify