Ansible blockinfile模块写入同一文件时覆盖问题咨询
解决Ansible blockinfile模块覆盖前序配置块的问题
这个问题我之前也碰到过!核心原因是blockinfile模块默认的标记块是重复的——两个任务都用了默认的# BEGIN ANSIBLE MANAGED BLOCK和# END ANSIBLE MANAGED BLOCK作为起止标记,第二个任务执行时会识别到已存在的默认标记,直接替换掉中间的内容,导致第一个配置块被覆盖。
解决方案:为每个配置块指定唯一的标记
你只需要给每个blockinfile任务添加marker参数,自定义专属的起止标记,这样两个配置块就会独立存在,不会互相覆盖。修改后的任务代码如下:
- name: Setup java environment blockinfile: dest: /home/{{ user }}/.bashrc block: | #Java path# JAVA_HOME={{ java_home }}/ marker: "# {mark} ANSIBLE MANAGED BLOCK - JAVA ENV" # 自定义Java块的标记 - name: Setup hadoop environment blockinfile: dest: /home/{{ user }}/.bashrc block: | #Hadoop path# HADOOP_HOME={{ hadoop_home }}/ marker: "# {mark} ANSIBLE MANAGED BLOCK - HADOOP ENV" # 自定义Hadoop块的标记
解释一下marker参数
{mark}是Ansible的占位符,会自动替换成BEGIN和END,所以最终生成的标记会是:
- Java块:
# BEGIN ANSIBLE MANAGED BLOCK - JAVA ENV和# END ANSIBLE MANAGED BLOCK - JAVA ENV - Hadoop块:
# BEGIN ANSIBLE MANAGED BLOCK - HADOOP ENV和# END ANSIBLE MANAGED BLOCK - HADOOP ENV
这样两个块的标记完全不同,Ansible就不会把它们当成同一个可替换的块处理了。
备选方案:合并成一个任务(如果允许的话)
如果你不需要分开维护两个配置任务,也可以把两个配置块合并到一个blockinfile任务里,这样自然也不会有覆盖问题:
- name: Setup java and hadoop environment blockinfile: dest: /home/{{ user }}/.bashrc block: | #Java path# JAVA_HOME={{ java_home }}/ #Hadoop path# HADOOP_HOME={{ hadoop_home }}/
两种方案都能解决你的问题,看你更倾向于哪种维护方式啦!
内容的提问来源于stack exchange,提问作者Asier Gomez




