【问题标题】:Ansible stdout script error when trying to output to file尝试输出到文件时出现 Ansible 标准输出脚本错误
【发布时间】:2021-06-25 13:18:46
【问题描述】:

我在尝试部署以下 Ansible 脚本时收到以下错误。它与将 yum 输出复制到 .txt 文件有关,并且在语法上似乎是微不足道的。任何帮助解码错误将不胜感激。

TASK [将输出复制到本地文件]****************************************** ****

致命:[Dev-01]:失败! => {"msg": "该任务包含一个带有未定义变量的选项。错误是:'dict object' has no attribute 'stdout'\n\n错误似乎在 '/tmp/awx_728_j8h4pd86/project/linux -patch-script-1.yml':第 26 行,第 5 列,但可能\n位于文件中的其他位置,具体取决于确切的语法问题。\n\n违规行似乎是:\n\n\n - 名称:将输出复制到本地文件\n ^ here\n"}**

致命:[Prod-01]:失败! => {"msg": "该任务包含一个带有未定义变量的选项。错误是:'dict object' has no attribute 'stdout'\n\n错误似乎在 '/tmp/awx_728_j8h4pd86/project/linux -patch-script-1.yml':第 26 行,第 5 列,但可能\n位于文件中的其他位置,具体取决于确切的语法问题。\n\n违规行似乎是:\n\n\n - 名称:将输出复制到本地文件\n ^ here\n"}****

---
- hosts: all
  become: yes
  tasks:
  - name: yum-clean-metadata
    command: yum clean metadata
    args:
      warn: no
    
  - name: Old CF output file for same of handover
    shell: rpm -qa --queryformat "%{NAME};%{VERSION}-%{RELEASE}\n" | sort -t\; -k 1 > /tmp/yum-Installed-pre.txt
    
  - name: Set variable to number of installed packages and available updates
    shell: "{{ item }}"
    with_items: 
      - export pre_pkg_inst=$(yum list installed | grep '^[a-Z0-9]' | wc -l)
      - export pre_pkg_avail=$(yum check-update --quiet | grep '^[a-Z0-9]' | wc -l)
      - echo -n "${HOSTNAME};${pre_pkg_inst};${pre_pkg_avail};" > /tmp/$HOSTNAME-yum-install.txt
    
  - name: Run yum update and output details
    yum:
      name: '*'
      state: latest
    register: yumoutput
    
  - name: copy the output to a local file
    copy:
      content: "{{ yumoutput.stdout }}"
      dest: "/tmp/yum-update.txt"
    
  - name: Reboot machine after update
    reboot:
      msg: Reboot initiated by Ansible after patching
      post_reboot_delay: 30
      reboot_timeout: 600

【问题讨论】:

  • 'dict object' has no attribute 'stdout' => 调试yumoutput 的内容,你会发现它不包含任何stdout 键。为方便起见,选择要在文件中显示的正确键,或整个 varialb,以 yaml 格式显示 => content: "{{ yumoutput | to_nice_yaml(indent=2) }}"
  • 谢谢。有用!我怀疑必须有其他格式可以输出,例如。 json、纯文本等
  • 非常感谢您的帮助。事实证明这非常有用。

标签: ansible yaml ansible-template


【解决方案1】:

您收到此错误是因为- name: Run yum update and output details 任务的返回不包含任何属性stdout。这个错误是不言自明的。如果你调试yumoutput,你会看到一个 json 并且没有 stdout 键,因为所有 ansible 模块在注册到一个变量时都必须返回一个 json。

请注意检查您正在使用的每个模块的 json 响应结构,以确保在调用之前是否缺少某些键。

最简单、最快捷的方法就是使用debug 模块显示已注册的变量。

例如

- name: Show registered var contents and structure
  debug:
    var: yumoutput

【讨论】:

  • 非常感谢您提供的信息。这是一个很大的帮助:o)
猜你喜欢
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多