首页 > 解决方案 > 我可以使用 Chef 的 sensitive 属性执行多行 BASH 代码的哪个 Chef 资源?

问题描述

在运行带有模板的 BASH 代码和可能包含敏感数据变量的食谱时,我想防止向厨师客户端输出任何输出。

就我而言,我正在自动化创建的 MySQL 用户,该用户从加密的数据包中获取一个变量,以及手动保护/强化 MySQL 安装(通过命令行)。当我运行 chef-client 时,它会向用户显示变量输出,包括 MySQL 密码。

'execute' 允许敏感属性,但此问题涉及多次使用变量的 bash 脚本,而不仅仅是单行。我可以使用与符号“&&”的延续来做到这一点,但是脚本越长,这看起来就越混乱。

'script' 和 'bash' 不允许将 'sensitive' 用作属性,并返回 'uninitialized constant' 错误。这种很糟糕,因为这将是一个很棒的功能。

关于如何将脚本变量隐藏在厨师客户端输出中的想法?

dbag = data_bag_item('pass', 'mysql')
db_pass = dbag["mysqlpass"]

bash 'install_mysql' do
  sensitive True
  code <<-EOC
    systemctl start mysqld.service && systemctl enable mysqld.service
    mysqladmin -u root password #{db_pass}
    # automate secure mysql install
    mysql -u root -p#{db_pass} -e "UPDATE mysql.user SET Password=PASSWORD('#{db_pass}') WHERE User='root'"
    mysql -u root -p#{db_pass} -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1')"
    mysql -u root -p#{db_pass} -e "DELETE FROM mysql.user WHERE User=''"
    mysql -u root -p#{db_pass} -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%'"
    mysql -u root -p#{db_pass} -e "FLUSH PRIVILEGES"
    # create mysql user, and pass
    mysql -e "CREATE DATABASE mysqldb;" -u root -p#{db_pass}
    mysql -e "GRANT ALL PRIVILEGES ON mysqldb.* TO "mysqluser"@"localhost" IDENTIFIED BY '#{db_pass}';" -u root -p#{db_pass}
    mysql -e 'FLUSH PRIVILEGES;' -u root -p#{db_pass}
  EOC
end

我也试过:

script 'install_mysql' do
  sensitive True
  ...
end

cookbook_file '/tmp/install_mysql.sh'
  source install_mysql.sh
  ...
end

execute 'install_mysql' do
  sensitive True
  command "/tmp/install_mysql.sh"
end

标签: chef-infrachef-recipe

解决方案


在评论中回答,在 Rubytruefalse是小写的。UsingTrue使 Ruby 尝试查找不存在的 const。


推荐阅读