我想使用Ansible的lineinfile或replace模块,以便将单词splash
添加到GRUB中的cmdline。
它应该适用于以下所有示例:
例一:
- 之前:
GRUB_CMDLINE_DEFAULT=""
- 之后:
GRUB_CMDLINE_DEFAULT="splash"
例二:
- 之前:
GRUB_CMDLINE_DEFAULT="quiet"
- 之后:
GRUB_CMDLINE_DEFAULT="quiet splash"
例三:
- 之前:
GRUB_CMDLINE_DEFAULT="quiet nomodeset"
- 之后:
GRUB_CMDLINE_DEFAULT="quiet nomodeset splash"
帖子Ansible: insert a single word on an existing line in a file很好地解释了如何在没有引号的情况下完成这个操作。但是,我无法让它在引号中插入这个词。
要将单词splash
添加到所示的cmdline,Ansible角色或行动手册中需要什么条目?
5条答案
按热度按时间hec6srdp1#
您可以在没有
shell
输出的情况下使用2个lineinfiles
模块完成此操作。在示例中,您要搜索
splash
:诀窍是如果我们能在某处找到
splash
,就尝试删除该行,但只检查check_mode: true
。如果找到了项(found
〉0),那么我们不需要更新该行。如果没有找到,这意味着我们需要插入它。我们将它与backrefs一起附加在末尾。iih3973s2#
可能的解决方案是定义两个条目,如下所示:
说明:我们首先使用grep检查所需行中是否存在splash关键字。由于grep在未找到字符串时给出负返回代码,因此我们使用
failed_when: false
隐藏错误。grep的输出保存到grub_cfg_grep
变量中。接下来,我们将replace模块绑定到grep的标准输出中包含关键字splash的条件,正则表达式将旧的内容放在引号中,并在其后添加splash关键字。
注意:如果在执行前为空字符串,则结果为
" splash"
(前面有一个空格),但它仍然是一个有效的cmdline。avwztpqn3#
受Adam答案的启发,我使用下面的答案来启用IOMMU:
请注意,我必须将
backrefs
设置为true
,以便\1
引用工作,否则捕获的组不会被替换。幂等性也能很好地工作。
编辑:请注意,此代码片段仅适用于英特尔CPU,可能需要更新以适应您的平台。
f45qwnt84#
难点在于替换模块页面中的这一行:“通过确保相同的模式永远不会匹配所做的任何替换,由用户来维护幂等性。”https://docs.ansible.com/ansible/latest/modules/replace_module.html#id4插入项目很容易,但实际上使其幂等相当棘手,因此每次运行任务时目标文件不会增长。
我找到了一种方法,用替换模块一次完成。你应该能够适应这个。我的任务检查GRUB_CMDLINE_LINUX_DEFAULT行中是否有“vt.default_red”,如果没有,就插入一些颜色代码。
我的方法是复制并粘贴各种接近那里的例子到regex测试网站上,直到它工作为止。我仍然不知道结果,但它在我的https://www.regextester.com/测试中工作,在我的剧本中工作。
我遇到的一个问题是Ansible的regex实现显然不支持条件语句,这给了我一段时间奇怪的错误。
正则表达式匹配开头的文字字符串(“GRUB_CMDLINE_LINUX_DEFAULT=”和一个双引号)和结尾的双引号。
ipakzgxi5#