Ansible:在Raspberry Pi上修改cmdline.txt

Ansible:在Raspberry Pi上修改cmdline.txt,ansible,Ansible,我正在修改/boot/cmdline.txt以将容器功能添加到Raspberry Pi,因此我需要在同一行中向文件中添加cgroup\u enable=cpuset cgroup\u memory=1 cgroup\u enable=memory 我尝试使用Lineinfle模块进行此操作,但没有取得多大成功: - hosts: mypi become: yes tasks: - name: Enable container features lineinfile:

我正在修改/boot/cmdline.txt以将容器功能添加到Raspberry Pi,因此我需要在同一行中向文件中添加cgroup\u enable=cpuset cgroup\u memory=1 cgroup\u enable=memory

我尝试使用Lineinfle模块进行此操作,但没有取得多大成功:

- hosts: mypi
  become: yes
  tasks:
  - name: Enable container features
    lineinfile:
      path: /boot/cmdline.txt
      regex: " cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory"
      line: " cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory"
      insertafter: EOF
      state: present
我一直在尝试将insertafter修改为BOF,也使用insertbefore,使用正则表达式匹配最后一个单词。。。但它最终添加了一个回车。我无法找到不添加新行的方法。

Q:Ansible lineinfle模块:不添加新行。找到一些不添加新行的方法

不可能。新行将始终由模块LINEINFLE添加。例如,见

b_行。插入索引[1],b_行+b_行sep 这就是添加新行的方式。此类添加将通过b_linesep终止。看看这个变量是怎样的

b_linesep=to_bytesos.linesep,errors='subrogate_或'u strict' 当您希望遍历文本文件的行时,将使用os.linesep。内部扫描仪识别os.linesep并将其替换为单个\n

看。 模块替换任务也不能解决此问题。它既不会创建没有换行符的行,也不会以这种方式修改现有行。除此之外,它不是幂等的

-名称:启用容器功能 替换: 路径:cmdline.txt regexp:“^[\w]?!”*\b{{item}}\b.*$' 替换:'\1{{item}}' 循环: -cgroup_enable=cpuset -cgroup_内存=1 -cgroup_enable=内存 如果文件为空,它将不起任何作用

TASK [Enable container features]
ok: [localhost] => (item=cgroup_enable=cpuset)
ok: [localhost] => (item=cgroup_memory=1)
ok: [localhost] => (item=cgroup_enable=memory)
如果文件中存在该行,此任务将更改该行

shell>cat cmdline.txt cgroup\u enable=cpuset cgroup\u memory=1 cgroup\u enable=memory 询问[启用容器功能]***************************************** 确定:[localhost]=>item=cgroup\u enable=cpuset --之前:cmdline.txt +++之后:cmdline.txt @@ -1 +1 @@ -cgroup\u memory=1 cgroup\u enable=memory cgroup\u enable=cpuset +cgroup\u memory=1 cgroup\u enable=memory cgroup\u enable=cpuset cgroup\u memory=1 Q:Ansible LINEINFLE模块:不添加新行。找到一些不添加新行的方法

不可能。新行将始终由模块LINEINFLE添加。例如,见

b_行。插入索引[1],b_行+b_行sep 这就是添加新行的方式。此类添加将通过b_linesep终止。看看这个变量是怎样的

b_linesep=to_bytesos.linesep,errors='subrogate_或'u strict' 当您希望遍历文本文件的行时,将使用os.linesep。内部扫描仪识别os.linesep并将其替换为单个\n

看。 模块替换任务也不能解决此问题。它既不会创建没有换行符的行,也不会以这种方式修改现有行。除此之外,它不是幂等的

-名称:启用容器功能 替换: 路径:cmdline.txt regexp:“^[\w]?!”*\b{{item}}\b.*$' 替换:'\1{{item}}' 循环: -cgroup_enable=cpuset -cgroup_内存=1 -cgroup_enable=内存 如果文件为空,它将不起任何作用

TASK [Enable container features]
ok: [localhost] => (item=cgroup_enable=cpuset)
ok: [localhost] => (item=cgroup_memory=1)
ok: [localhost] => (item=cgroup_enable=memory)
如果文件中存在该行,此任务将更改该行

shell>cat cmdline.txt cgroup\u enable=cpuset cgroup\u memory=1 cgroup\u enable=memory 询问[启用容器功能]***************************************** 确定:[localhost]=>item=cgroup\u enable=cpuset --之前:cmdline.txt +++之后:cmdline.txt @@ -1 +1 @@ -cgroup\u memory=1 cgroup\u enable=memory cgroup\u enable=cpuset +cgroup\u memory=1 cgroup\u enable=memory cgroup\u enable=cpuset cgroup\u memory=1
由于文件中只有一行,因此可以使用“替换”或“行填充”来执行此操作。以下是替换版本:


中窃取了答案,因为文件中只有一行,所以可以使用replace或lineinfle来完成。以下是替换版本:


中窃取答案正如弗拉基米尔指出的那样,不幸的是,杰克的答案不足以处理空文件,如果所需的参数在行首已经存在,那么答案也会失败。 以下建议的解决方案应解决这些问题。特别是,它应该

支持空文件, 支持字符串中任何位置的现有参数, 即使使用多行文件,也要保持健壮,以防万一。。。, 是幂等的,并且 (可选)使用所需值更新现有键。 cmdline.yml -名称:read cmdline.txt 变成:真的 slurp:src={{cmdline\u txt\u path} 寄存器:结果\u cmdline -名称:为现有参数生成正则表达式 设定事实: regex_existing:“{\b+key | string+=+[\w]*如果更新else值| string+\b}” 键值对:“{key | string+=+value | string}” -名称:为新参数生成正则表达式 设定事实: regex_add_missing:“{{^?!?:.|\n*+regex_existing+?:.|\n*$}” -名称:更新cmdline.txt 变成:真的 副本: 内容:'{result\u cmdline.content |b6 4编码 |正则表达式\u替换正则表达式\u现有,密钥\u值\u对 |正则表达式\u替换正则表达式\u添加\u缺失,键值\u对+\1 }}' 目标:{{cmdline\u txt\u path} 用法:

-设定事实: cmdline_txt_路径:/boot/cmdline.txt -包括任务:cmdline.yml 变量: 键:cgroup_enable 值:内存 更新:false 如果键值对不存在,将添加参数 -包括任务:cmdline.yml 变量: 键:cgroup_enable 值:cpu 更新:false -包括任务:cmdline.yml 变量: 键:cgroup\u内存 价值:1 更新:正确 如果找到,将替换第一个匹配键的值; 如果找不到,将添加它
但是,我可能遗漏了一些边缘案例-如果您发现任何问题,请告诉我。

正如Vladimir指出的,不幸的是,Jack的回答不足以处理空文件,如果所需的参数在行首已经存在,也会失败。 以下建议的解决方案应解决这些问题。特别是,它应该

支持空文件, 支持字符串中任何位置的现有参数, 即使使用多行文件,也要保持健壮,以防万一。。。, 是幂等的,并且 (可选)使用所需值更新现有键。 cmdline.yml -名称:read cmdline.txt 变成:真的 slurp:src={{cmdline\u txt\u path} 寄存器:结果\u cmdline -名称:为现有参数生成正则表达式 设定事实: regex_existing:“{\b+key | string+=+[\w]*如果更新else值| string+\b}” 键值对:“{key | string+=+value | string}” -名称:为新参数生成正则表达式 设定事实: regex_add_missing:“{{^?!?:.|\n*+regex_existing+?:.|\n*$}” -名称:更新cmdline.txt 变成:真的 副本: 内容:'{result\u cmdline.content |B64解码 |正则表达式\u替换正则表达式\u现有,密钥\u值\u对 |正则表达式\u替换正则表达式\u添加\u缺失,键值\u对+\1 }}' 目标:{{cmdline\u txt\u path} 用法:

-设定事实: cmdline_txt_路径:/boot/cmdline.txt -包括任务:cmdline.yml 变量: 键:cgroup_enable 值:内存 更新:false 如果键值对不存在,将添加参数 -包括任务:cmdline.yml 变量: 键:cgroup_enable 值:cpu 更新:false -包括任务:cmdline.yml 变量: 键:cgroup\u内存 价值:1 更新:正确 如果找到,将替换第一个匹配键的值; 如果找不到,将添加它
但是,我可能遗漏了一些边缘案例-如果您发现任何问题,请告诉我。

我不太理解。是否要将这三个值添加到文件第一行的开头?我不介意。如果您选中/boot/cmdline.txt,它只是在同一行中包含键值对,所以我不介意它们是在末尾还是在开头。唯一的要求是它们应该是空白的。这是我的Pi的一个例子:console=serial0115200 console=tty1 root=PARTUUID=ea7d04d6-02 rootfstype=ext4 lifter=deadline fsck.repair=yes rootwait文件中只有一行?我不太明白。是否要将这三个值添加到文件第一行的开头?我不介意。如果您选中/boot/cmdline.txt,它只是在同一行中包含键值对,所以我不介意它们是在末尾还是在开头。唯一的要求是它们应该是空白的。这是我的Pi的一个例子:console=serial0115200 console=tty1 root=PARTUUID=ea7d04d6-02 rootfstype=ext4 lifter=deadline fsck.repair=yes rootwait文件中只有一行?好的程序员写好代码,好的程序员偷好代码!好程序员写好代码,好程序员偷好代码!