Azure Key Vault Chef Cookbook Ruby代码各段含义咨询
Chef Azure Key Vault 密钥拉取Recipe逻辑说明
你疑惑的属性配置代码运行逻辑
你列出的3行代码核心作用是从Chef加密数据袋中拉取当前运行环境对应的Azure服务主体凭据,存入节点属性方便后续复用,拆分说明:
node.default['azurespn']['xxx']:Chef中node.default是节点属性的默认层级,存储的配置可以被同节点的其他Recipe、资源直接读取,优先级低于覆盖级属性azurespn:是前面从Chef Data Bag(数据袋,Chef用来存储全局共享敏感数据的组件,一般会加密保存凭据类内容)读取到的凭据集合对象node.environment:Chef节点的运行环境标签,一般会分为dev(开发)、test(测试)、prod(生产)等,用来隔离不同环境的配置- 整行逻辑:从凭据集合中,匹配当前节点的运行环境,取出对应环境的
client_id(服务主体ID)、tenant_id(Azure租户ID)、client_secret(服务主体密钥)三个参数,存入节点属性,避免后续重复读取数据袋
完整Recipe逐行解释
# retrieve the secret stored in azure key vault using this chef recipe
注释说明当前Recipe的作用:从Azure Key Vault拉取存储的密钥
include_recipe 'microsoft_azure'
引入微软官方提供的microsoft_azure Chef cookbook,依赖该封装库提供的Azure接口交互能力,才能调用后续的vault_secret方法
azurespn = data_bag_item('azurespn', 'azurespnenv')
读取名为azurespn的Data Bag(数据袋)中,键为azurespnenv的条目,该条目里存储了所有环境对应的Azure服务主体凭据
(你疑惑的3行代码,逻辑见上一节说明)
spn = { 'tenant_id' => "#{node['azurespn']['tenant_id']}", 'client_id' => "#{node['azurespn']['client_id']}", 'secret' => "#{node['azurespn']['client_secret']}" }
将存储在节点属性中的三个凭据参数,整理为vault_secret方法要求的哈希表格式,作为调用Azure接口的身份校验参数
secret = vault_secret("#{node['windowsnode']['vault_name']}", "#{node['windowsnode']['secret']}", spn)
调用microsoft_azure库提供的vault_secret方法,传入三个参数:
- 要访问的Azure Key Vault名称(从节点属性
node['windowsnode']['vault_name']读取) - 要拉取的密钥名称(从节点属性
node['windowsnode']['secret']读取) - 前面整理好的服务主体身份凭据
方法执行后会返回从Key Vault拉取到的明文密钥内容,赋值给secret变量
file 'c:/jenkins/secret' do action :create content "#{secret}" rights :full_control, 'Administrators', :one_level_deep => true end
调用Chef内置的file资源,在目标节点的c:/jenkins/路径下创建名为secret的文件:
- 动作为
create:文件不存在则创建,已存在则覆盖内容 - 文件内容为拉取到的密钥明文
- 权限配置为仅Administrators组拥有完全控制权限,权限不继承到子对象
Chef::Log.info("secret is '#{secret}' ")
将拉取到的密钥打印到Chef运行日志中,仅用于调试,生产环境建议删除该行避免敏感信息泄露
内容的提问来源于stack exchange,提问作者james chen
相关产品推荐
相关产品推荐

