【发布时间】:2021-02-07 04:28:50
【问题描述】:
我正在学习 ansible,但无法用简单的 asnible 来解决这个问题。
我有一个文件包含:
net.ifnames=0 dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=LABEL=writable rootfstype=ext4 elevator=deadline rootwait fixrtc cgroup_memory=1 cgroup_enable=memory
这是一行,例如,我想检查 cgroup_memory 是否设置为 1,如果不设置为 1,以及是否缺少整个设置,请将其附加到行尾。
我知道如何用 bash 和 sed 来做这件事的非常简单的方法,但是我不能用 ansible “正确”的方式来解决问题,而不使用 lineinfile 并替换整行...如前所述 lineinfile 正在使用整个行,所以我认为这不是理想的..我研究的下一个模块是替换它可能会起作用,但我不能只寻找“cgroup_memory = 1”,因为它会查看“cgroup_memory = 0”并评估为不是“cgroup_memory=1”,我最终在一个文件中得到 cgroup_memory=1 cgroup_memory=0 ......不知何故,我需要提取值,比较和替换值(保持整行不变),如果它不存在附加到行尾……
这是我想要的 bash 版本: https://pastebin.com/1TCz30Nq
这是我最接近我需要的地方:
- name: "Check for cgroup_memory"
shell: grep -v '^[[:space:]]*#' /tmp/cmdline.txt_old | grep -icP "cgroup_memory=-?\d+[[:space:]]" || true
register: grep_value
changed_when: False
- debug:
var: grep_value
- name: "Variable Missing: Add cgroup_memory=1 to end of line"
become: true
replace: dest=/tmp/cmdline.txt_old regexp='(\s+)$' replace=' cgroup_memory=1'
when: grep_value.stdout == "0"
- name: "Variable Exist: Set cgroup_memory=1"
become: true
replace: dest=/tmp/cmdline.txt_old regexp='cgroup_memory=\d+' replace='cgroup_memory=1'
when: grep_value.stdout == "1"
这不会忽略 # 行,因此替换将愉快地更改 cmets 中的值,这是不好的。这也没有评估价值,但我想我可以在确定它在那里之后进行 grep 和拆分。我不想抱怨,但我认为 ansible 是配置管理的完美选择,也是我做的第一件简单的事情很多通过 shell 脚本并不是那么简单......(如果我不想使用 shell 模块)
【问题讨论】:
标签: ansible