根据bash脚本有条件地包含文件

时间:2017-04-17 13:26:15

标签: bash puppet

我有一个返回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',
}

3 个答案:

答案 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中设置变量。