根据 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 脚本,正如我所需要的,都可以用来设置一个变量傀儡.