Ansible中为什么会跳过insertafter中的条目?

32次阅读
没有评论

问题描述

在运行Ansible playbook时遇到了一个问题。他有大约10个主机,使用serial:1的方式运行一个playbook。在这个playbook中,有一段代码用于将所有命令的输出附加到一个文件中。然而,对于第一个主机,这段代码总是有效的,但对于其他主机,它只会插入第二行和第三行,而跳过第一行和最后一行。输出文件的内容看起来像这样:

########################################################
###############HOSTNAME:12.15.1.1################
(some output here)
########################END#############################
###############HOSTNAME:12.15.2.2################
(some output here)
###############HOSTNAME:12.15.3.3################
(some output here)
.
.

用户想知道为什么会出现这种情况,以及如何防止这种情况发生。

解决方案

以下解决方案可能涉及到Ansible版本差异,请根据您的情况进行调整。

方案1

问题可能与delegate_tolineinfile(或blockinfile)一起使用时出现的问题有关。这可能会导致冗余行没有像预期的那样被写入。下面我们来尝试使用blockinfile来解决这个问题,不使用标记来指示块的位置。

- name: 将输出附加到本地文件
  blockinfile:
    dest: "{{ myshell_output4.stdout }}"
    marker: false
    block: |
      ########################################################
      ###############HOSTNAME:{{ inventory_hostname }}################
      {{ myshell_output3.stdout }}
      ########################END#############################
  delegate_to: localhost

在上面的示例中,我们使用blockinfile模块代替了之前的lineinfile。我们将marker设置为false,以避免在插入块时使用标记。这应该能够解决插入问题。

方案2

另一种方法是先将输出写入不同的文件,然后在所有任务运行后将这些文件合并起来。这可以通过使用copyassemble模块来实现。
首先,将输出写入临时文件:

- name: 将输出写入本地文件
  copy:
    content: |
      ########################################################
      ###############HOSTNAME:{{ inventory_hostname }}################
      {{ myshell_output3.stdout }}
      ########################END#############################
    dest: tmp/{{ inventory_hostname }}
  delegate_to: localhost

然后,使用assemble模块将文件合并:

- name: 合并文件
  assemble:
    src: tmp/
    dest: "{{ myshell_output4.stdout }}"
  delegate_to: localhost
  run_once: true

请注意,上面的解决方案假设您的本地文件myshell_output4.stdout尚不存在,或者您希望将输出追加到现有文件。如果要将输出追加到现有文件,您需要将tmp/*中的文件合并到tmp/assembled中,然后使用lineinfile模块追加到文件中。

方案3

如果问题仍然存在,您可能需要考虑升级或更改Ansible版本,以解决可能存在的Bug。如果有任何相关的GitHub问题报告或讨论,您也可以查阅以获取更多信息和解决方案。
以上是解决您问题的一些建议,根据您的实际情况进行选择和调整。希望能够帮助您解决这个问题!

正文完