2017-04-17 60 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 

此示例使用紅寶石腳本,但任何類型的腳本包括一個基本的外殼腳本,如在我的情況下需要,可以使用在傀儡中設置一個變量。