如何让knife ssh根据Chef节点平台自动指定SSH用户
实现Knife SSH根据节点平台自动选择SSH用户名
这个问题我之前帮同事处理过,确实Knife的命令行参数本身不支持直接解析Chef节点属性的条件表达式,但有几个实用的方案能满足你的需求:
方案1:无需修改节点属性的Shell脚本动态处理
这种方法适合不想改动现有节点配置的场景,通过knife search获取节点的平台信息,再结合Shell条件判断自动选择SSH用户:
方法A(使用jq解析JSON输出)
如果你的系统安装了jq(JSON处理工具),可以用这个更简洁的版本:
# 替换your_command为实际要执行的命令 knife search node "name:*" -a ipaddress -a platform --format json | jq -r '.rows[] | "\(.ipaddress) \(.platform)"' | while read ip platform; do ssh_user=$([ "$platform" = "centos" ] && echo "userX" || echo "userY") knife ssh "ipaddress:$ip" "your_command" -x "$ssh_user" done
- 第一步:
knife search获取所有节点的IP地址和平台信息,并输出为JSON格式 - 第二步:用
jq解析出每行的IP和平台名称 - 第三步:循环判断平台类型,自动分配对应的SSH用户,执行
knife ssh命令
方法B(无jq,用awk处理表格输出)
如果没有jq,可以用awk处理Knife默认的表格输出:
# 替换your_command为实际要执行的命令 knife search node "name:*" -a ipaddress -a platform | grep -E "^node" | awk '{print $2, $4}' | while read ip platform; do ssh_user=$([ "$platform" = "centos" ] && echo "userX" || echo "userY") knife ssh "ipaddress:$ip" "your_command" -x "$ssh_user" done
- 用
grep过滤出节点行,awk提取IP和平台字段,后续逻辑和方法A一致
方案2:预先设置节点SSH用户属性(长期推荐)
如果需要长期复用这个逻辑,可以给每个节点添加自定义属性,让Knife直接引用:
为CentOS节点设置
node['ssh_user'] = 'userX',为Ubuntu节点设置node['ssh_user'] = 'userY'- 可以通过Cookbook的属性文件(比如
attributes/default.rb)根据平台自动设置:case node['platform'] when 'centos' default['ssh_user'] = 'userX' when 'ubuntu' default['ssh_user'] = 'userY' end - 将该Cookbook添加到所有节点的run_list并执行
chef-client
- 可以通过Cookbook的属性文件(比如
之后就可以用一条命令完成跨平台的SSH操作:
knife ssh "name:*" "your_command" -x '#{node[:ssh_user]}'
这个方案更简洁,也更符合Chef的配置即管理理念,适合长期维护的场景。
内容的提问来源于stack exchange,提问作者osexp2000
相关产品推荐
相关产品推荐

