在Ansible中,我编写了一个Yaml playbook,其中包含主机名列表和每个主机的执行命令。我为这些任务注册了一个变量,在执行任务结束时,我将每个命令的输出附加到一个文件中。 但每次我尝试附加到我的输出文件时,只有最后一条记录会被持久化。
---
- hosts: list_of_hosts
become_user: some user
vars:
output: []
tasks:
- name: some name
command: some command
register: output
failed_when: "'FAILED' in output"
- debug: msg="{{output | to_nice_json}}"
- local_action: copy content='{{output | to_nice_json}}' dest="/path/to/my/local/file"
我甚至试图使用insertafter参数使用lineinfile追加但是没有成功。 我缺少什么?
答案 0 :(得分:3)
您可以尝试这样的事情:
- name: dummy
hosts: myhosts
serial: 1
tasks:
- name: create file
file:
dest: /tmp/foo
state: touch
delegate_to: localhost
- name: run cmd
shell: echo "{{ inventory_hostname }}"
register: op
- name: append
lineinfile:
dest: /tmp/foo
line: "{{ op }}"
insertafter: EOF
delegate_to: localhost
我使用serial: 1
因为我不确定并行运行的lineinfile
任务是否会使输出文件混乱。
答案 1 :(得分:1)
Ansible doc建议使用copy:
- name: get jstack
shell: "/usr/lib/jvm/java/bin/jstack -l {{PID_JAVA_APP}}"
args:
executable: /bin/bash
register: jstackOut
- name: write jstack
copy:
content: "{{jstackOut.stdout}}"
dest: "tmp/jstack.txt"
如果您想写本地文件,请添加:
delegate_to: localhost
答案 2 :(得分:0)
我认为这可能会帮助您... 该手册检查了LINUX系统的基本硬件信息,并将输出保存在单个文件中。
- name: LINUX CONFIGURATION CHECK
gather_facts: false
hosts: linux
tasks:
- name: Checking IP Address
shell: hostname -I
register: ip
- name: Checking Mac Address
shell: lshw -class network | grep -E 'serial:' | cut -d " " -f9
register: mac
- name: Checking OS Version
shell: cat /etc/*release | grep PR | cut -d "\"" -f2
register: os
- local_action: copy content={{ip.stdout}} dest=/etc/ansible/output.txt
- name: Append
lineinfile:
dest: /etc/ansible/finalout.txt
line: "{{mac.stdout}}{{os.stdout}}"
insertafter: EOF
delegate_to: localhost
本地操作将答案复制并保存到文件中。 将插入插入内容输出到 EOF-文件末尾。