Ansible网络自动化:记录来自多个play的所有命令

48次阅读
没有评论

问题描述

正在尝试编写一个脚本,用于发布任何未来的新设备的基本配置,并验证生产设备的基本配置是否符合要求。用户希望能够收集在不同play中执行的所有命令行,这些play在一个中央play中被调用。用户希望将这些输出(Ansible将执行的命令)集中起来,并可能将其组合成一个文件。此外,用户希望以检查模式(check mode)收集命令,以便在执行之前进行确认。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

用户可以使用Ansible的一些模块和选项来实现这个目标。以下是一个可能的解决方案,该方案使用了blockinfilelineinfileassemble等模块来记录命令并将其汇总到一个文件中。

  1. 使用blockinfile模块,为每个主机创建一个独立的日志文件,并在其中记录要执行的命令。这个步骤会创建一个名为{{ inventory_hostname }}.txt的文件,将命令块写入其中。以下是示例任务:
- name: "create block in own file per host"
  blockinfile:
    path: "/dir/logs/{{ inventory_hostname }}.txt"
    create: true
    block: "some commands"
  1. 使用lineinfile模块,将更多的命令行添加到每个主机的命令块中。这个步骤会向已存在的文件中添加更多的命令行。以下是示例任务,它会将more_commands_1more_commands_2中的命令行逐一添加到文件中:
- name: "add more line in block (even if already executed on another host)"
  lineinfile:
    line: "{{ item }}"
  loop: "{{ more_commands_1 | default([]) + more_commands_2 | default([]) }}"
  1. 最后,使用assemble模块将所有主机的日志文件汇总到一个文件中。这个步骤会将所有主机的日志文件收集到一个名为all_hosts.txt的文件中。以下是示例任务:
- name: "assemble all files in one"
  assemble:
    src: "/dir/logs/"
    dest: "/dir/logs/all_hosts.txt"

请注意,为了实现检查模式,用户可以在任务中设置check_mode: true,以便在执行任务之前进行确认。此外,用户可能需要根据实际情况,调整和扩展这个解决方案,以满足特定的需求。

方案2

使用脚本或工具来管理日志文件和命令记录也是一种方法,但可能需要额外的脚本编写和管理。用户可以根据实际情况选择适合的方式。

另一种方法是编写自定义脚本或使用第三方工具来控制命令的记录和日志文件的管理。用户可以编写一个脚本,该脚本在执行每个命令时,将命令记录到指定的日志文件中。这个脚本可以与Ansible一起使用,通过delegate_to选项将命令发送到本地执行,然后记录命令到文件。

以下是一个示例的bash脚本,该脚本可以在每次执行命令时将命令记录到指定的日志文件中:

#!/bin/bash
# 启动记录命令的脚本

# 定义日志文件路径
log_file="/dir/logs/commands.log"

# 要执行的命令
command_to_execute="your_command_here"

# 执行命令
eval $command_to_execute

# 将命令记录到日志文件中
echo "$(date): $command_to_execute" >> $log_file

用户可以在每个Ansible任务中使用command模块或其他模块来执行命令,并在delegate_to选项中指定本地主机。然后,使用上述脚本在本地主机上记录执行的命令到日志文件中。

请注意,这种方法需要用户编写和管理额外的脚本,并确保命令的执行和日志记录是同步的。这可能会增加一些复杂性,但可以根据实际情况灵活调整。

以上是两种解决方案,用户可以根据自己的需求选择其中之一,或者根据实际情况结合使用。在实际使用中,用户应根据Ansible版本和具体要求进行调整和测试。

正文完