从puppet中的文件访问密码以便在exec中使用

时间:2018-02-02 06:48:00

标签: puppet

我想在开源木偶中运行一个命令来激活Unity3D许可证,但我不想在我的git repo中输入序列号或密码:

exec { 'license-unity': 
  command => '/opt/Unity/Editor/Unity -batchmode -nographics -serial A1-ABCD-1234-ETC -username my.user@a.b.ca -password myPassword -quit'
  subscribe   => Package['UnityEditor'],
  refreshonly => true,
}

如何从文件中读取序列号和密码(在puppetserver或节点上)并将其替换为命令?

例如,如果我在puppet服务器上有一个名为.secret的文件,由root和perms 400拥有。如何将内容读入变量以便在puppet清单中使用?

1 个答案:

答案 0 :(得分:2)

根据您喜欢的路线,有两种标准方法可以实现这一目标:

  1. 使用file功能。这适用于无主的Puppet或文件托管在Puppet Master上。

    # using the module path instead of the absolute path would end up storing your secret in git, which is what you are trying to avoid
    $password = file('/absolute/path/to/.secret')
    
    exec { 'license-unity': 
      command     => "/opt/Unity/Editor/Unity -batchmode -nographics -serial A1-ABCD-1234-ETC -username my.user@a.b.ca -password $password -quit"
      subscribe   => Package['UnityEditor'],
      refreshonly => true,
    }
    

    Doc:https://puppet.com/docs/puppet/5.3/function.html#file

    推论:如果你需要对文件进行某种解析,例如,如果它不仅仅是一个带有密码的文本文件,那么你可以使用现代Ruby API的自定义函数。 https://puppet.com/docs/puppet/5.3/functions_ruby_overview.html。如果是这种情况,请告诉我。

  2. 使用自定义事实。这用于在主/客户端设置中将文件存储在客户端上。使用外部事实也最终将秘密存储在git中,这会出现您试图避免的问题。

    # module/lib/facter/password.rb
    Facter.add(:password) do
      setcode do
        File.read('/absolute/path/to/.secret')
      end
    end
    
    # manifest.pp
    exec { 'license-unity': 
      command     => "/opt/Unity/Editor/Unity -batchmode -nographics -serial A1-ABCD-1234-ETC -username my.user@a.b.ca -password $password -quit"
      subscribe   => Package['UnityEditor'],
      refreshonly => true,
    }
    

    Doc:https://puppet.com/docs/facter/3.9/custom_facts.html#configuring-facts

    推论:如果你需要对文件进行某种解析,例如,如果它不仅仅是一个带有密码的文本文件,那么你可以使用本机Ruby类和方法(即{{1} }或JSON.parse如果文件采用这些格式。)

  3. 您正在寻求的方法的显着替代方法包括使用Puppet从秘密管理软件(如Vault)检索,或使用加密/解密算法(如AES-256)将加密文件存储在SCM中然后解密它在目录编译期间。