为何Python打印的主机域输出在YAML结果顶部而非对应节点组内
问题成因
- 你在循环中使用的
print(f"{host}.example.com")是直接向标准输出流写入字符串,并未将该域名内容存入你构建的data字典结构。 - 代码执行固定顺序:
- 逐行读取输入的主机名列表,每读一行就立即把拼接的域名通过print写到控制台
- 全部行读取完成后,才执行
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
相关产品推荐
相关产品推荐

