尝试输出到文件时出现 Ansible 标准输出脚本错误
Posted
技术标签:
【中文标题】尝试输出到文件时出现 Ansible 标准输出脚本错误【英文标题】:Ansible stdout script error when trying to output to file 【发布时间】: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、纯文本等
docs.ansible.com/ansible/latest/user_guide/…
非常感谢您的帮助。事实证明这非常有用。
【参考方案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)以上是关于尝试输出到文件时出现 Ansible 标准输出脚本错误的主要内容,如果未能解决你的问题,请参考以下文章
ORA-03113: 在 os_command.exec 被重定向到标准输出之后,通信通道上的文件结尾
在 IIS 7 中启动应用程序时出现“CS0016:无法写入输出文件”错误