通过带有命令行参数的Ansible剧本多次运行python脚本

时间:2018-06-24 13:30:00

标签: python ansible yaml command-line-arguments

我正在尝试使用我的Ansible剧本使用with_items多次运行Python脚本,以在每次迭代中采用不同的命令行参数,但是即使如此,它也会循环遍历以对生成的文件采用不同的名称,但文件的内容保持不变:即,它仅显示"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 }}"

vars / 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

script.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)

1 个答案:

答案 0 :(得分:0)

您正在遍历错误的内容。当你有...

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

...您正在查看commands变量。这意味着output始终指的是同一件事。看看using register in a loop上的文档:

  

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

您实际上是想遍历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指的是 first 中的循环值 循环(循环遍历commands变量)。我正在做一些 这里的假设;我实际上不知道每个的结构 output.results中的项目看起来像是因为您没有发布输出 debug任务中。我假装属性item.stdout 具有您感兴趣的值,但它可能名为 其他的东西。