我有一个返回1或0的bash命令。我想从puppet运行所述命令:
exec { 'Check if Thinkpad':
command => 'sudo dmidecode | grep -q ThinkPad && echo 1 || echo 0',
path => '/usr/bin/:/bin/bash/',
environment => "HOME=/root"
}
如果我的命令返回1,我是否可以使用puppet包含文件?
file { '/etc/i3/config':
source => 'puppet:///modules/i3/thinkpad',
owner => 'root',
group => 'root',
mode => '0644',
}
答案 0 :(得分:2)
您可以使用外部事实按原样使用bash脚本。在模块的facts.d
目录中,您可以放置脚本。
#!/bin/bash
if [ dmidecode | grep -q ThinkPad ]
echo 'is_thinkpad=true'
else
echo 'is_thinkpad=false'
fi
您还可以在模块的lib/facter
目录中使用自定义事实。
Facter.add(:is_thinkpad) do
confine kernel: linux
setcode do
`dmidecode | grep -q ThinkPad && echo true || echo false`
end
end
在这两种情况下,is_thinkpad
的事实名称遵循系统类型的布尔事实命名法的约定。然后,您可以更新清单中的代码以获取此布尔值。
if $facts['is_thinkpad'] == true {
file { '/etc/i3/config':
source => 'puppet:///modules/i3/thinkpad',
owner => 'root',
group => 'root',
mode => '0644',
}
}
这将为您提供所需的功能。
https://docs.puppet.com/facter/3.6/custom_facts.html#adding-custom-facts-to-facter https://docs.puppet.com/facter/3.6/custom_facts.html#external-facts
答案 1 :(得分:1)
您可能需要将自己的bash脚本变成一个"自定义事实" - 这是我一次只做过一次并且不完全了解你的方法。
我想说设置自定义事实的最简单方法是将您的脚本放在代理计算机上的echo "thinkpadcheck=1"
,并确保它以一行表示结尾
echo "thinkpadcheck=0"
或
root
您可以使用(注意:您必须是sudo facter -p | grep think
)
thinkpadcheck => 1
它应该返回
if $thinkpadcheck == 1
{
file { '/etc/i3/config':
source => 'puppet:///modules/i3/thinkpad',
owner => 'root',
group => 'root',
mode => '0644',
}
}
else
{
notify { "thinkpadcheck failed for $hostname" : }
}
但是一旦你这样做了,那么你的木偶剧本可以说
def process_emg(emg, times):
name = v.get()
with open('own_test.csv', 'a+', newline='') as file:
writing = csv.writer(file)
writing.writerow(emg+(name,))
答案 2 :(得分:0)
我想分享我在Puppet Cookbook 3rd edition(第118页)中找到的另一种方法:
<强> message.rb 强>
#!/usr/bin/env ruby
puts "This runs on the master if you are centralized"
使用以下命令使脚本可执行:
sudo chmod +x /usr/local/bin/message.rb
<强> message.pp 强>
$message = generate('/usr/local/bin/message.rb')
notify { $message: }
然后运行:
puppet apply message.pp
此示例使用ruby脚本,但在我的情况下,任何类型的脚本(包括基本shell脚本)都可用于在puppet中设置变量。