Chef属性中换行符未解析为实际换行的解决方法咨询
解决Chef Recipe中属性换行符未解析的问题
这个问题我之前也碰到过,核心原因是Ruby对字符串转义的处理规则,以及属性定义方式的问题。下面给你几个靠谱的解决办法:
方法一:确保使用双引号定义属性
如果你的属性是用单引号包裹的,Ruby会把\n当作普通的文本字符而不是换行符。所以首先检查你的属性定义,确保用双引号:
default['ssh_private_key'] = "-----BEGIN RSA PRIVATE KEY-----\nline1\nline2\n-----END RSA PRIVATE KEY-----"
不过这种方式对于长字符串(比如完整的SSH密钥)来说,手动加\n容易出错,可读性也差,更推荐下面的方法。
方法二:使用Ruby Here文档(推荐)
Here文档可以让你直接编写多行文本,不需要手动添加转义符,Ruby会自动保留所有换行和格式,非常适合定义SSH密钥这类多行内容:
default['ssh_private_key'] = <<-SSH_KEY -----BEGIN RSA PRIVATE KEY----- line1 line2 -----END RSA PRIVATE KEY----- SSH_KEY
注意最后一行的SSH_KEY要顶格写,而且要和开头的标识符完全一致(大小写敏感),这样中间的内容会被原样解析为带换行的字符串。
方法三:处理外部来源的字面量换行符
如果你的SSH密钥属性是从数据袋、环境变量或者其他外部来源获取的,其中的\n是字面量(也就是实际存储的是\\n),可以在File资源里手动替换:
File '/tmp/private_ssh_key' do action :create owner 'root' group 'root' mode '0640' sensitive true content node['ssh_private_key'].gsub('\n', "\n") end
这个gsub方法会把字符串中所有的字面量\n替换成实际的换行符。
试试上面的方法,应该就能生成你预期的多行格式密钥文件了。
内容的提问来源于stack exchange,提问作者Angelo SR
相关产品推荐
相关产品推荐

