问题描述
在运行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_to
和lineinfile
(或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
另一种方法是先将输出写入不同的文件,然后在所有任务运行后将这些文件合并起来。这可以通过使用copy
和assemble
模块来实现。
首先,将输出写入临时文件:
- 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问题报告或讨论,您也可以查阅以获取更多信息和解决方案。
以上是解决您问题的一些建议,根据您的实际情况进行选择和调整。希望能够帮助您解决这个问题!