Ruby MCollective清单脚本-有条件地替换某些事实

Ruby MCollective清单脚本-有条件地替换某些事实,ruby,mcollective,Ruby,Mcollective,我正在尝试更新现有的mcollective清单脚本。该脚本当前收集有关可用更新的信息。我想用标记替换某些“true”值,该标记将在复制到我的wiki时生成一个复选框。这是我当前脚本的简化版本(更少的字段) # patching_inventory.mc inventory do puts "||Server||Update Needed||Package Count||Kernel Release||" format "|%s|%s|%s|%s|" fields { [ id

我正在尝试更新现有的mcollective清单脚本。该脚本当前收集有关可用更新的信息。我想用标记替换某些“true”值,该标记将在复制到我的wiki时生成一个复选框。这是我当前脚本的简化版本(更少的字段)

# patching_inventory.mc
inventory do
  puts "||Server||Update Needed||Package Count||Kernel Release||"
  format "|%s|%s|%s|%s|"
  fields { [
    identity,
    facts["apt_has_updates"],
    facts["apt_updates"],
    facts["kernelrelease"]
  ] }
end

我想用
{checkbox}{checkbox}
替换
updateneeded
列中的值,但仅当updateneeded为true时。否则,占位符(如“-”)将起作用。输出如下所示:

||Server||Update Needed||Package Count||Kernel Release||
|host1|true|26|3.20.96|
|host2|false|0|4.18.120|
|host3|true|109|3.21.17|
 ...
|host197|true|26|3.20.96|
||Server||Update Needed||Package Count||Kernel Release||
|host1|{checbox}done{checkbox}|26|3.20.96|
|host2|-|0|4.18.120|
|host3|{checbox}done{checkbox}|109|3.21.17|
 ...
|host197|{checbox}done{checkbox}|26|3.20.96|
我希望它看起来像这样:

||Server||Update Needed||Package Count||Kernel Release||
|host1|true|26|3.20.96|
|host2|false|0|4.18.120|
|host3|true|109|3.21.17|
 ...
|host197|true|26|3.20.96|
||Server||Update Needed||Package Count||Kernel Release||
|host1|{checbox}done{checkbox}|26|3.20.96|
|host2|-|0|4.18.120|
|host3|{checbox}done{checkbox}|109|3.21.17|
 ...
|host197|{checbox}done{checkbox}|26|3.20.96|
我最初的尝试是这样做:

inventory do
  updates = (facts["apt_has_updates"] == 'true') ? "{checkbox}done{checkbox}" : '-'

  puts "||Server||Update Needed||Package Count||Kernel Release||"
  format "|%s|%s|%s|%s|"
  fields { [
    identity,
    updates,
    facts["apt_updates"],
    facts["kernelrelease"]
  ] }
end
但是我突然想到,
清单do
可能并不像我的非ruby头脑假设的那样迭代。然而,在某个地方,一定会发生迭代,因为格式字符串被多次用于不同的事实。是否有一种方法可以告诉格式化程序用值替换我在上面尝试过的每个事实


你们有谁能给我指出正确的方向吗?

经过更多的探索,我发现我只是把三值转换放错了地方。如果将该值放置在字段列表中,则效果良好。这是我的工作代码:

# patching_inventory.mc
inventory do
  puts "||Server||Update Needed||Package Count||Kernel Release||"
  format "|%s|%s|%s|%s|"
  fields { [
    identity,
    facts["apt_has_updates"],
    facts["apt_updates"] == "true" ? "{checkbox}done{checkbox}" : "-",
    facts["kernelrelease"]
  ] }
end

老实说,我不知道为什么会这样。。。必须有某种迭代器来计算清单中每个主机的字段。如果有人有其他见解,请随意发布另一个答案。

经过进一步探索,我发现我只是把三值转换放在了错误的地方。如果将该值放置在字段列表中,则效果良好。这是我的工作代码:

# patching_inventory.mc
inventory do
  puts "||Server||Update Needed||Package Count||Kernel Release||"
  format "|%s|%s|%s|%s|"
  fields { [
    identity,
    facts["apt_has_updates"],
    facts["apt_updates"] == "true" ? "{checkbox}done{checkbox}" : "-",
    facts["kernelrelease"]
  ] }
end

老实说,我不知道为什么会这样。。。必须有某种迭代器来计算清单中每个主机的字段。如果有人有其他见解,请随意发布另一个答案。

“我想用{checkbox}done{checkbox}替换“需要更新”列中的值,但仅当“需要更新”为true时才替换。”看起来您真正想做的是用
-
替换这些值,但仅当事实为false时。你的描述是你的意图还是你的代码是你的意图?@MattSchuchard这行
updates=(条件)?“{checkbox}完成{checkbox}”:“-”
使用三元运算符。它会根据所述条件将
updates
设置为等于复选框宏或连字符。有了这些信息,我可以告诉您,您的
do
并没有迭代任何内容,只是将
inventory
指定为一个代码块,这样您就可以详细说明它的功能了。这里真正有用的是,如果你展示了你想要的输出,这样我们就不必猜测了。@MattSchuchard啊,对不起。使用所需的输出进行编辑。希望澄清。酷,看起来你已经明白了。您可能遇到了一个可变范围问题,并且似乎已经成功地调试了它。MCo清单脚本是一个罕见而有趣的问题,所以请投票支持它。“我想用{checkbox}done{checkbox}替换Update Needed列中的值,但仅当Update Needed为true时才替换。”看起来,您真正想做的是用
-
替换值,但只有当事实为false时。你的描述是你的意图还是你的代码是你的意图?@MattSchuchard这行
updates=(条件)?“{checkbox}完成{checkbox}”:“-”
使用三元运算符。它会根据所述条件将
updates
设置为等于复选框宏或连字符。有了这些信息,我可以告诉您,您的
do
并没有迭代任何内容,只是将
inventory
指定为一个代码块,这样您就可以详细说明它的功能了。这里真正有用的是,如果你展示了你想要的输出,这样我们就不必猜测了。@MattSchuchard啊,对不起。使用所需的输出进行编辑。希望澄清。酷,看起来你已经明白了。您可能遇到了一个可变范围问题,并且似乎已经成功地调试了它。MCo清单脚本是一个罕见而有趣的问题,所以请投赞成票。