Chef:从文件中读取变量并在一个汇聚中使用它

时间:2016-02-26 17:36:15

标签: ruby chef chef-recipe

我有以下代码下载文件,然后将文件内容读入变量。使用该变量,它执行一个命令。此配方不会收敛,因为在编译阶段/ root / foo不存在。

我可以解决多个收敛和if File.exist的问题,但我想用一个收敛来做。关于如何做的任何想法?

execute 'download_joiner' do
  command "aws s3 cp s3://bucket/foo /root/foo"
  not_if { ::File.exist?('/root/foo') }
end

password = ::File.read('/root/foo').chomp

execute 'join_domain' do
  command "net ads join -U joiner%#{password}"
end

3 个答案:

答案 0 :(得分:6)

正确的解决方案是使用惰性属性:

execute 'download_joiner' do
  command "aws s3 cp s3://bucket/foo /root/foo"
  creates '/root/foo'
  sensitive true
end


execute 'join_domain' do
  command lazy {
    password = IO.read('/root/foo').strip
    "net ads join -U joiner%#{password}"
  }
  sensitive true
end

将文件读取延迟到写入之后。此外,我还包含sensitive属性,因此不会显示密码。

答案 1 :(得分:4)

您可以在编译时使用run_action下载文件,并将第二部分包装在将在运行时执行的条件块中。

execute 'download_joiner' do
  command "aws s3 cp s3://bucket/foo /root/foo"
  not_if { ::File.exist?('/root/foo') }
end.run_action(:run)

if File.exist?('/root/foo')
  password = ::File.read('/root/foo').chomp

  execute 'join_domain' do
    command "net ads join -U joiner%#{password}"
  end
end

答案 2 :(得分:0)

您应该从第二个命令中读取文件,以便在收敛期间进行读取:

execute 'download_joiner' do
  command "aws s3 cp s3://bucket/foo /root/foo"
  not_if { ::File.exist?('/root/foo') }
end

execute 'join_domain' do
  command "net ads join -U joiner%`cat /root/foo`"
end

请注意,如果密码包含有趣的字符,您的方法和我的方法都会中断。如果net允许您在stdin或env var上提供密码,我会这样做。