You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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的占位符,会自动替换成BEGINEND,所以最终生成的标记会是:

  • 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

火山引擎 最新活动