Chef infra 如何从食谱中找到具有特定角色的节点?

Chef infra 如何从食谱中找到具有特定角色的节点?,chef-infra,chef-recipe,Chef Infra,Chef Recipe,我正在写一个设置负载平衡器的方法。我需要知道具有“角色[wp_wasya]”的节点的IP,或者具有/具有特定角色的其他节点的IP。我在网上看到有按名称获取节点的方法,有没有通过搜索其角色获取节点的方法?此搜索将仅返回结果集中的第一个节点 app_nodes = search( :node, "role:#{ whatever_role }" ) app_node = app_nodes[0] app_nodes = search( :node, "role:#{ whatever_role }

我正在写一个设置负载平衡器的方法。我需要知道具有“角色[wp_wasya]”的节点的IP,或者具有/具有特定角色的其他节点的IP。我在网上看到有按名称获取节点的方法,有没有通过搜索其角色获取节点的方法?

此搜索将仅返回结果集中的第一个节点

app_nodes = search( :node, "role:#{ whatever_role }" )
app_node = app_nodes[0]
app_nodes = search( :node, "role:#{ whatever_role }" )
app_node = app_nodes[0]
它还将使用Ruby字符串插值(
{}
),因此如果指定特定角色(
wp#u wasya
),您可能不需要这样做。不过最好使用
roles
属性进行搜索,因为这将返回嵌套了角色的节点

如果要查找多个节点,并且只想返回IP地址:

app_servers = search(:node, "roles:wp_wasya").map {|n| n['ipaddress']}
这将是一个IP地址字符串数组。例如,我们可以在chef shell中测试这一点:

chef > app_servers = search(:node, "roles:wp_wasya").map {|n| n['ipaddress']}
 => ["10.13.37.20", "10.13.37.21"]

我们可以使用
#map
,因为这个
#搜索
将返回
Chef::Node
对象的
数组
,其行为类似于
散列
(虽然不是真正的
散列
)。

正确。如果还希望在展开的跑步列表中搜索(其他角色中包含的角色/食谱),则搜索
角色:{whatever_role}