Ansible使用剧本替换ip的最后一位

Ansible使用剧本替换ip的最后一位,ansible,Ansible,我写了一本剧本,目的是更改inventory.ini中所有主机的默认网关ip的最后一位 到目前为止,我可以通过以下命令更改最后一位: cat/etc/network/interfaces | grep-i default | awk-F'.-vOFS='.{$NF=6}1;'>/etc/网络/接口 但问题是,我仍然无法找出如何在不覆盖文件全部内容的情况下仅替换接口文件的最后一行 我的剧本是这样的: --- -名称:测试连接性 主持人:全部 任务: -姓名:平 发出砰的声响: -名称:更改默认网

我写了一本剧本,目的是更改inventory.ini中所有主机的默认网关ip的最后一位

到目前为止,我可以通过以下命令更改最后一位:


cat/etc/network/interfaces | grep-i default | awk-F'.-vOFS='.{$NF=6}1;'>/etc/网络/接口
但问题是,我仍然无法找出如何在不覆盖文件全部内容的情况下仅替换接口文件的最后一行

我的剧本是这样的:

---
-名称:测试连接性
主持人:全部
任务:
-姓名:平
发出砰的声响:
-名称:更改默认网关地址
命令:cat/etc/network/interfaces | grep-i default | awk-F'.-vOFS='.''.{$NF=6}1;'>/etc/网络/接口
-名称:重新启动网络服务
命令:systemctl重新启动网络
-名称:检查ip配置
命令:netstat-rn
...

所有提示和提示都非常受欢迎。

用这种方式编写Ansible的剧本。这完全基于您展示的样品。我无法测试它,因为我没有Ansible,尽管命令应该可以工作

---
-名称:测试连接性
主持人:全部
任务:
-姓名:平
发出砰的声响:
-名称:更改默认网关地址
命令:tac/etc/network/interfaces | awk-F'.-v IGNORECASE=“1”-v OFS=“.”“/default/{if(FNR==1){$NF=6};print}'| tac>temp&&mv temp/etc/network/interfaces
-名称:重新启动网络服务
命令:systemctl重新启动网络
-名称:检查ip配置
命令:netstat-rn
# ...
OP尝试中完成的修复:

  • 我还解决了您的覆盖问题,即您在不使用就地选项或不使用临时输出文件的情况下覆盖相同的输入文件。因为如果在
    awk
    程序读取输入_文件时尝试更新该文件,它将变为空,因为我们没有使用inplace选项执行相同的操作(这将在后端创建临时文件并将输出保存到其中,然后将该文件重命名为输入_文件)

  • 删除了
    grep
    命令,因为
    awk
    可以自己处理,所以将grep的逻辑附加到
    awk
    代码本身中

Q:“Ansible替换文件的最后一行”

A:给我一份文件

shell>cat test.txt
l1
l2
l3
剧本

-hosts:localhost
变量:
更换\行:最后一行的更换
任务:
-命令:cat test.txt
寄存器:结果
-副本:
dest:test.txt
内容:|
{%用于结果中的行。标准输出行[:-1]}
{{line}}
{%endfor%}
{{replace_line}}
给予

shell>cat test.txt
l1
l2
最后一行替换

剧本是幂等的。

经过多次尝试,在考虑使用ansible模块的建议后,我想出了这本帮助我实现目标的剧本:

---
-名称:测试连接性
主持人:全部
任务:
-姓名:平
发出砰的声响:
-名称:更改默认网关地址
替换:
路径:/etc/网络/接口
regexp:'(上行路由添加默认gw[\d]*\.[\d]*.[\d]*)\.[\d]*$'
替换:'\1.6'
备份:是的
时间:(ansible_事实['distribution']==“Debian”)
-名称:重新启动网络服务
服务:
名称:网络
状态:重新启动
时间:(ansible_事实['distribution']==“Debian”)
-名称:更改Redhat上的默认网关地址
替换:
路径:/etc/sysconfig/networkscripts/ifcfg-eth0
regexp:'(网关=[\d]*\.[\d]*.[\d]*)\.[\d]*$'
替换:'\1.6'
备份:是的
时间:(ansible_事实['distribution']==“RedHat”)
-名称:重新启动Redhat的网络服务
服务:
名称:网络
状态:重新启动
时间:(ansible_事实['distribution']==“RedHat”)
...

它的工作正如预期的那样,当然,它可以在其他环境中得到增强。感谢大家的建议和帮助

cat/etc/network/interfaces….>/etc/网络/接口
使用临时文件。你很幸运,文件不是空的。对不起,我不明白?你能解释一下你说的是什么吗我很幸运文件不是空的看起来很好
command:systemctl restart networking
使用
service:name=networking state=restarted
。要添加到@KamilCuk,Ansible有一个
replace
模块。如果你想用shell命令填充剧本,老实说,也许最好还是使用纯ssh。@Jinja_dude,
tac
不是打字错误,
tac
是一个从底线打印文件的命令(作为第一行,正好与
cat
相反),所以这是代码中有意的(这样,
awk
可以将最后一行作为第一行,一旦awk再次使用tac进行处理,将打印实际内容序列),干杯。感谢您花时间阅读和回复,是的,您对tac的看法是正确的。我刚刚签出。我尝试了您的解决方案,现在出现了这个错误。我正在试图理解它背后的原因致命:[test vipgw debian]:失败!=>{“changed”:true,“cmd”:[“tac”、“/etc/network/interfaces”、“|”、“awk”、“-F.、“-v”、“IGNORECASE=1”,“-v”、“OFS=。”、“/default/{if(FNR==1){$NF=254};print}”、“|”、“tac”、“>”、“temp”、“&&&-”、“mv”、“temp”、“/etc/network/interfaces”]、“delta:“0:00:00.011036”、“end:“2021-02-03 20:46.687298”、“msg:“非零返回码”、“rc”:1、“开始”:“2021-02-03-03 20:46:52.676262”、“stderr选项无效”:“tac”以获取更多帮助信息。“,”stderr_行“:[“tac:invalid option--'F'”,请尝试“tac--help”以了解更多信息。“]:[]}````@Jinja_dude,我不确定是否有可能,但看起来(看到您的错误)F通过了