【问题标题】:issue with ansible register: copy: and stdoutansible寄存器问题:复制:和标准输出
【发布时间】:2018-07-19 19:33:45
【问题描述】:

我有一个 Ansible 2.6 playbook,它试图在一系列 Cisco Nexus 交换机上运行几个(希望在解决问题后添加更多)命令并将输出写入文件(每个交换机一个文件)。该剧本成功运行,但我似乎无法将输出转换为可读格式。提前感谢您的任何尝试!

示例输出:

模块 1:v1.0\n 模块 1:v1.0\n 模块 2:v1.0\n 模块 7:v2.0\n 模块 8:v2.0\n 结构电源排序器固件:模块 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"

【问题讨论】:

    标签: ansible stdout nexus


    【解决方案1】:

    你说剧本有效,但我发现了几个问题:

    • 复制任务中的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"
    

    应该也可以,假设在pre_check.stdout[0] 的末尾有一个最终的\n,否则你需要自己添加它。

    【讨论】:

    • 是的 'stdout_lines' 是代替 'stdout' 的有效选项,但无论哪种方式,它都不能正确格式化(或者至少是我想要的方式)。所以看起来它正在获取每个命令,然后将每个命令的输出变成一个列表元素,这样“sh version”命令输出是“[0]”,“sh int status”命令输出是“[ 1]"。
    • @RobertCampbell 彻底改变了我的回答。希望这会更有帮助。
    • 谢谢!是的,可以肯定的是,我的“with_items”构思不当。内容:"{{ (pre_check.stdout[0] + pre_check.stdout[1] }}" 行获胜。再次感谢!
    • 现在完美格式化:原因:CLI 命令重新加载请求重置系统版本:7.3(2)N1(1) 服务:插件核心插件、以太网插件、Fc 插件活动包--- -------------------------------------------------- --------------------------------------- 端口名称状态 Vlan 双工速度类型 ---------------- -------------------------------------------------- -------------- Eth1/1 S60G3SP001-e1/1 已连接 f-path 全 40G WSP-Q40GLR4 Eth1/2 UPLINK FEX111 已连接 1 全 40G WSP-Q40GLR4
    猜你喜欢
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 2010-12-01
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多