You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Python打印的主机域输出在YAML结果顶部而非对应节点组内

问题成因
  • 你在循环中使用的 print(f"{host}.example.com") 是直接向标准输出流写入字符串,并未将该域名内容存入你构建的 data 字典结构。
  • 代码执行固定顺序:
    1. 逐行读取输入的主机名列表,每读一行就立即把拼接的域名通过print写到控制台
    2. 全部行读取完成后,才执行 yaml.dump(data, sys.stdout) 把整个字典结构序列化为YAML格式输出
      这就导致所有域名输出被推到控制台最顶部,完全没有和对应主机的YAML分组绑定。
  • 你之前尝试把域名存为变量不生效,是因为变量的值没有作为字段写入对应主机的子字典,自然不会被包含到最终的YAML结构里。
实现预期效果的方案

你需要把域名内容作为字典的字段值存到对应主机的子节点中,删除循环内的print语句,调整YAML序列化参数保证输出顺序符合预期。

调整后的可运行代码

from io import StringIO
import yaml
import sys

raw_data = '''\
hLKJH3019
aaa
dDASJKLH3
CNBAhsa32
ddkLJASCNjdaskA
bbb
BNKASDL32
dDASJKLH3
CNBAhsa32
ccc
hLKJH3019
BNKASDL32
dDASJKLH3
ddd
ddkLJASCNjdaskA
'''

fh = StringIO(raw_data)
host_group = {}

for line in fh:
    host = line.strip()
    # 仅在主机首次出现时初始化子字典,避免重复赋值覆盖已有结构
    if host not in host_group:
        host_group[host] = {}
    # 按期望的顺序为字段赋值,保证输出顺序和插入顺序一致
    host_group[host]["nodename"] = host
    # 把拼接的域名作为字段存入结构,不再直接print
    host_group[host]["fqdn"] = f"{host}.example.com"
    host_group[host]["username"] = "rundeck"

# 关闭PyYAML默认的按键名排序,严格按字典插入顺序输出
yaml.dump(host_group, sys.stdout, sort_keys=False)

代码调整说明

  • 移除循环内的print语句,所有需要输出的内容全部存入结构化字典,最后统一通过YAML序列化输出,不会再出现内容跳转到顶部的问题。
  • 增加主机存在性判断,避免原代码重复遍历到同一主机名时无意义重建空字典的逻辑冗余。
  • 为域名配置独立的fqdn(完全限定域名)字段:原你写的期望结构中单独放置域名字符串的写法不符合YAML语法规范,必须搭配键名才能生成可被正常解析的有效YAML文件。
  • 序列化时设置sort_keys=False,避免PyYAML默认按字母顺序重排字段,严格按照你定义的字段顺序(nodename → fqdn → username)在每个主机分组下展示,和你预期的结构完全匹配。

对应输出示例

hLKJH3019:
  nodename: hLKJH3019
  fqdn: hLKJH3019.example.com
  username: rundeck
aaa:
  nodename: aaa
  fqdn: aaa.example.com
  username: rundeck
# 其余主机结构以此类推

内容的提问来源于stack exchange,提问作者user15638707

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 09:36:03