要将命令的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上可用的命令
答案 0 :(得分:7)
你实际需要的是一个Ansible模块,它有两个参数,
在这种情况下,您可以使用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”任务。