2017-04-17 27 views
1

我有一个bash命令文件,将返回1或0。我想运行表示,从木偶命令:包括有条件的基于bash脚本

exec { 'Check if Thinkpad': 
    command  => 'sudo dmidecode | grep -q ThinkPad && echo 1 || echo 0', 
    path  => '/usr/bin/:/bin/bash/', 
    environment => "HOME=/root" 
} 

有没有一种方法,我可以使用包括文件傀儡只有当我的命令返回1?

file { '/etc/i3/config': 
    source => 'puppet:///modules/i3/thinkpad', 
    owner => 'root', 
    group => 'root', 
    mode => '0644', 
} 

回答

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事实name遵循布尔事实的类型的系统命名法的惯例。然后,您可以更新清单中的代码来查找此布尔值。

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

你可能需要把你的bash脚本变成了“自定义事实” - 这是我只是做了一次不完全了解不够,教你如何。

我想说的是,建立一个自定义其实最简单的方法是把你的脚本到/etc/facter/facts.d/代理机器上,并确保它有这样一行

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" : } 
} 
+0

更正:这是一个外部事实,它们应该放置在模块内部的facts.d中,事实查找应该是$ facts ['thinkpadcheck']',并且facter lookup应该是'sudo facter -p thinkpadcheck'。另外,您应该将文档添加到您的答案中:https://docs.puppet.com/facter/3.6/custom_facts.html#external-facts。有了这些修复,这是一个很好的答案。 –

+0

@MattSchuchard我有点困惑 - 你提到的文档列出了'/ etc/facter/facts.d /'作为放置我的facter脚本的地方之一。为什么我想把它们放在模块中?就此而言,我为什么要将我的自定义事实“附加”到只有一个模块? – hymie

+0

@MattSchuchard您可能会使用比我更新的puppet/facter版本,因为您的大部分更改都不适用于我。 – hymie

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 

消息。PP

$message = generate('/usr/local/bin/message.rb') 
notify { $message: } 

然后运行:

puppet apply message.pp 

此示例使用红宝石脚本,但任何类型的脚本包括一个基本的外壳脚本,如在我的情况下需要,可以使用在傀儡中设置一个变量。