首页 > 解决方案 > 使用命令行参数通过 Ansible playbook 多次运行 python 脚本

问题描述

我试图通过我的Ansible剧本多次运行 Python 脚本,使用 with_items 以在每次迭代中采用不同的命令行参数,但即使它遍历循环以为生成的文件采用不同的名称,但文件的内容仍然存在同:即只显示命令输出的内容"show version" NX-OS

我如何迭代上{{ output }}一个任务的结果?

背景:Cisco Nexus 3k 交换机上的 NX-OS CLI 命令

任务/main.yml

---
- name: Run basic CLI commands on nexus 3k switch
  nxos_command: 
      provider: "{{ nxos_provider }}"
      commands: "{{ item.cmd1 }}"
  with_items: "{{ commands }}"
  register: output
- debug: var=output

- name: Run python script and store command output
  command: python /users/aastha/play/script.py  {{ item.name1 }}  {{ output }}
  with_items: "{{ commands }}"

变量/main.yml

---
nxos_provider:
   host: "{{ inventory_hostname }}"
   username: "{{ un }}"
   password: "{{ pwd }}"
   transport: nxapi
   timeout: 500

commands:
   - cmd1: show version
     name1: pre-show-version

   - cmd1: show interface brief
     name1: pre-interface

脚本.py

import json
import sys

arg = sys.argv[2:]
print(arg)
aas='\n'.join(map(str, arg))
print aas
with open(sys.argv[1], 'w') as outfile:
     outfile.write(aas)

标签: pythonansibleyamlcommand-line-arguments

解决方案


你在循环错误的事情。当你有...

- name: Run python script and store command output
  command: python /users/aastha/play/script.py  {{ item.name1 }}  {{ output }}
  with_items: "{{ commands }}"

...您正在查看commands变量。这意味着output总是指的是同一件事。查看有关在循环中使用register的文档:

使用带有循环的寄存器后,放置在变量中的数据结构将包含一个结果属性,该属性是来自模块的所有响应的列表。

您实际上想要循环output.results,例如:

- name: Run python script and store command output
  command: python /users/aastha/play/script.py  {{ item.item.name1 }}  {{ item.stdout }}
  with_items: "{{ output.results }}"

在上面,item.item指的是第一个循环中的循环值 (循环commands变量)。我在这里做一些假设;我实际上不知道每个项目的结构是什么样的,output.results因为您没有发布debug任务的输出。我假装该属性item.stdout 具有您感兴趣的值,但它可能被命名为其他名称。


推荐阅读