根据 bash 脚本有条件地包含文件
Include file conditionally based on a bash script
我有一个 bash 命令,它将 return 1 或 0。我想 运行 来自木偶的命令:
exec { 'Check if Thinkpad':
command => 'sudo dmidecode | grep -q ThinkPad && echo 1 || echo 0',
path => '/usr/bin/:/bin/bash/',
environment => "HOME=/root"
}
有没有一种方法可以仅在我的命令 returned 1 时使用 puppet 包含文件?
file { '/etc/i3/config':
source => 'puppet:///modules/i3/thinkpad',
owner => 'root',
group => 'root',
mode => '0644',
}
您可能需要将您的 bash 脚本转换为 "custom fact" -- 这是我只做过一次的事情,还没有完全理解,无法教您如何操作。
我想说的是,设置自定义事实最简单的方法是将脚本放入 agent 机器上的 /etc/facter/facts.d/
,并确保它结束有一行说
echo "thinkpadcheck=1"
或
echo "thinkpadcheck=0"
您可以使用(注意:您必须 root
)
进行测试
sudo facter -p | grep think
应该return
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" : }
}
您可以使用外部事实按原样使用 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
我想分享我在 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 脚本,正如我所需要的,都可以用来设置一个变量傀儡.
我有一个 bash 命令,它将 return 1 或 0。我想 运行 来自木偶的命令:
exec { 'Check if Thinkpad':
command => 'sudo dmidecode | grep -q ThinkPad && echo 1 || echo 0',
path => '/usr/bin/:/bin/bash/',
environment => "HOME=/root"
}
有没有一种方法可以仅在我的命令 returned 1 时使用 puppet 包含文件?
file { '/etc/i3/config':
source => 'puppet:///modules/i3/thinkpad',
owner => 'root',
group => 'root',
mode => '0644',
}
您可能需要将您的 bash 脚本转换为 "custom fact" -- 这是我只做过一次的事情,还没有完全理解,无法教您如何操作。
我想说的是,设置自定义事实最简单的方法是将脚本放入 agent 机器上的 /etc/facter/facts.d/
,并确保它结束有一行说
echo "thinkpadcheck=1"
或
echo "thinkpadcheck=0"
您可以使用(注意:您必须 root
)
sudo facter -p | grep think
应该return
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" : }
}
您可以使用外部事实按原样使用 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
我想分享我在 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 脚本,正如我所需要的,都可以用来设置一个变量傀儡.