我有一台Ansible 2.6剧本,试图在一系列Cisco Nexus交换机上运行几个命令(希望在问题解决时添加更多命令),并将输出写入文件(每个交换机一个文件)。该剧本可以成功运行,但我似乎无法将输出格式转换为可读格式。预先感谢您尝试尝试!
示例输出:
模块1:v1.0 \ n模块1:v1.0 \ n模块2:v1.0 \ n模块7:v2.0 \ n模块8:v2.0 \ n Fabric Power Sequencer固件:模块0 :版本v3.0 \ n微控制器固件:版本v1.2.2.0 \ n QSFP微控制器固件:\ n模块1:v1.7.0.0 \ n模块2:v1.7.0.0 \ n SFP微控制器固件:\ n
- hosts: NX-API
gather_facts: false
connection: network_cli
order: sorted
tasks:
- name: run show version on remote devices
nxos_command:
commands:
- show version
- show interface status
register: pre_check
- name: save output to /home/ansible/PRECHECK/
copy:
content:
with_items:
- "{{ pre_check.stdout[0] }}"
- "{{ pre_check.stdout[1] }}"
dest: "/home/PRECHECK/pre_check_{{ inventory_hostname }}.txt"
答案 0 :(得分:0)
您说剧本有效,但是我发现了几个问题:
with_item
放在这里。正如您在剧本中所写的那样,您应该得到的是一个填充了json数据的文件(例如 {"with_items": ["whatever {{ pre_check.stdout[0] }} expands to", "whatever {{ pre_check.stdout[1] }} expands to"]}
; with_items
,则每次开关都要执行两次任务。然后那将不做任何n-1次迭代,因为最后一个迭代将覆盖目标文件的内容,而后者不会改变; nxos_command模块没有定义pre_check.stdout_lines
变量吗? (Doc说是),它与stdout相同,但作为一行列表,而不是控制台输出的全部内容。会是这样的:
- name: save output to /home/ansible/PRECHECK/
copy:
content: "{{ (pre_check.stdout_lines[0] + pre_check.stdout_lines[1]) | join('\n') }}"
dest: "/home/PRECHECK/pre_check_{{ inventory_hostname }}.txt"
工作。假设stdout_lines
是列表的列表。但我相信:
- name: save output to /home/ansible/PRECHECK/
copy:
content: "{{ (pre_check.stdout[0] + pre_check.stdout[1] }}"
dest: "/home/PRECHECK/pre_check_{{ inventory_hostname }}.txt"
假设\n
末尾有一个pre_check.stdout[0]
,否则也应该工作,否则您需要自己添加它。