将命令输出重定向到文件(现有命令)

时间:2015-02-28 02:09:33

标签: bash ansible

要将命令的stdout(在本例中为echo hi)写入文件,您可以执行以下操作:

echo hi > outfile

我想要一个命令而不是重定向或管道,这样我就不需要调用shell了。这最终用于Ansible,后者调用python的subprocess.POpen

我正在寻找:

stdout-to-file outfile echo hi

tee使stdout很容易复制到文件中,但它接受stdin,而不是单独的命令。

是否有一个通用的便携式命令可以执行此操作?当然,编写一个很容易,但这不是问题。最后,在Ansible,我想做:

command: to-file /opt/binary_data base64 -d {{ base64_secret }}

而不是:

shell: base64 -d {{ base64_secret }} > /opt/binary_data

编辑:寻找RHEL 7,Fedora 21上可用的命令

2 个答案:

答案 0 :(得分:7)

你实际需要的是一个Ansible模块,它有两个参数,

  1. 实际命令
  2. 用于重定向上述命令
  3. 输出的文件

    在这种情况下,您可以使用shell模块而不是command模块,这样可以进行重定向。

    e.g。

    - shell: /usr/bin/your_command >> output.log
    

    您可以查看source and example documentation here.

    这是最简单的。我相信你知道这一点。我只是为了读取这个线程的shell /命令模块的新手来解决这个问题。

    如果您不喜欢这样做,您仍然可以编写一个包装模块,该模块接受"文件名"作为一个论点,将作为,

    运行
    - custommodule: output.log /usr/bin/your_command
    

    您可能需要做的就是分叉回购,查看现有模块,并相应地自定义您的模块。

答案 1 :(得分:2)

不确定这是否是您想要的,但在Ansible - Save registered variable to file我找到了我需要的东西:

- name: "Gather lsof"
  command: lsof
  register: lsof_command
- name: "Save lsof log"
  local_command:
    copy content="{{ lsof_command.stdout }}" dest="/root/lsof.log"

或者,在我的具体情况下(也可能对你有用)playbook在系统A上运行,但我需要从B的日志并将其保存到localhost(因为A系统正在击中B而我想要记录B的状态):

- name: "Gather lsof on B"
  delegate_to: B
  command: lsof
  register: lsof_command
  run_once: true
- name: "Save lsof log"
  local_action:
    copy content="{{ lsof_command.stdout }}" dest="/root/lsof.log"
  run_once: true

IMO run_once: true在我的情况下是必需的,因为我希望每个playbook运行只收集一次日志(如果playbook在10个系统上运行,则不会说10次)。

改进的空间是保存stderr,或者当它不为空时可能会失败“Save lsof log”任务。