在ansible中,如何在文件末尾添加一个文本块,标记前有一个空行?

在ansible中,如何在文件末尾添加一个文本块,标记前有一个空行?,ansible,ansible-2.x,Ansible,Ansible 2.x,我有一个剧本,如下所示: - hosts: localhost tasks: - name: update a file blockinfile: dest: /tmp/test block: | line 1 line 2 运行剧本时,文件/tmp/test变为: a # this is the end line of the original file # BEGIN ANSIBLE MANAG

我有一个剧本,如下所示:

- hosts: localhost
  tasks:
    - name: update a file
      blockinfile:
        dest: /tmp/test
        block: |
          line 1
          line 2
运行剧本时,文件
/tmp/test
变为:

a # this is the end line of the original file
# BEGIN ANSIBLE MANAGED BLOCK
line 1
line 2
# END ANSIBLE MANAGED BLOCK

我想在标记“
#BEGIN ANSIBLE MANAGED BLOCK
”之前添加一个空行(换行符),以获得视觉效果,最简单的方法是什么?最好在任务范围内,但欢迎任何想法。如果我重新定义标记,它将同时影响“开始”和“结束”标记。

如果您使用的是Ansible 2.5或更高版本,则可以更改和

以下是一个示例剧本:

-主机:所有
收集事实:不
任务:
-区块填充:
目的地:/tmp/测试
标记:“{mark}ANSIBLE托管块”
标记开始:'\n#开始'
标记_end:“#end”
区块:|
第1行
第2行
这就产生了重述:

播放[全部]********************************************************************************************************
任务[块填充]************************************************************************************************
已更改:[localhost]
重演********************************************************************************************************
localhost:确定=1更改=1不可访问=0失败=0跳过=0获救=0忽略=0
文件/tmp/test最终是:

a
#开始管理块
第1行
第2行
#端可交换管理块
使用lineinfle。比如说

-hosts:localhost
任务:
-名称:更新文件
区块填充:
目的地:/tmp/测试
区块:|
第1行
第2行
-名称:在标记前插入空行
线条填充:
目的地:/tmp/测试
insertbefore:“^#开始ANSIBLE托管块$”
行:“”

不幸的是,insertbefore不能处理更多的块。如果您坚持在块之间使用空行,则可能需要模板模块

试试下面的剧本。不幸的是,EOF并没有像预期的那样工作

shell>cat manage-block.yml
-名称:“在{my_dest}中插入{{my_marker}}”
区块填充:
目标:{{my_dest}}”
标记:“#{mark}ANSIBLE托管块{{my_marker}”
块:{{my_block}}”
-名称:“在{{my_marker}}之前插入空行”
线条填充:
目标:{{my_dest}}”
insertbefore:“^#开始ANSIBLE托管块{{my#u marker}”
行:“空行”
时间:ansible_loop.first
-名称:“在EOF后插入空行”
线条填充:
目标:{{my_dest}}”
插入者:EOF
行:“空行”
-hosts:localhost
变量:
my_区块:
/tmp/测试:
-我的记号笔:block001
我的街区:|
第1行
第2行
-我的记号笔:block002
我的街区:|
第3行
第4行
任务:
-包括任务:manage-block.yml
带_子元素:
-“{{my_blocks}dict2items}”
-价值观
回路控制:
扩展:正确
变量:
我的目标:{{item.0.key}”
my_marker:“{{item.1.my_marker}”
my_block:“{{item.1.my_block}”

下面的代码在模式前添加了一个空行,它是幂等的,当模式不存在时,不会添加到文件末尾

- hosts: localhost
  gather_facts: no
  tasks:
    - name: update a file
      replace:
        dest: /tmp/foobar
        regexp: '(?smx) (?<!\n\n) ^ (foobar)$'
        replace: "\n\\1"
-hosts:localhost
收集事实:不
任务:
-名称:更新文件
替换:
目的地:/tmp/foobar

regexp:'(?smx)(?它第一次工作,但不是幂等的,即每次运行时都会添加5行(包括新行)。这可以工作99%。唯一的问题是,当标记不存在时(例如,上一步由于某种原因失败),它会在文件末尾添加空行。理想的做法是仅当标记存在时才在标记前添加空行。为什么ansible应该有这种记录行为(如果模式不存在,则在文件末尾添加),我还没有找到它的用例。IMHO,这不值得努力。Ansible核心团队没有维护该模块。有很多。不幸的是,这对多个块不起作用。只有第一个块会被分开。不清楚这是否是一个bug。insertbefore只会添加一行。参见示例和移除when条件以进行测试。