厨师:如何使厨师仅在一个命令中将指令应用于特定节点

时间:2019-01-18 07:44:01

标签: ansible chef

我的情况:

  • 有:运行ec2实例的集群
  • 要:使用配置管理工具来设置运行中的Kubernetes集群

有Ansible:

  • 所有内容都已检查到源代码管理中,包括:
    • 我应该针对某些节点执行的操作规范(例如角色/剧本...)
    • 将角色映射到节点(例如playbook.yaml文件)
  • 下次我想引导另一个k8s集群时,我只需要更改库存并调用ansible-playbook master-playbook.yaml之类的单个命令

与厨师一起:

  • 仅说明我应针对某些节点(角色,配方,食谱...)执行的操作,而不是针对具有某些特定节点的映射
  • 下次我要引导另一个k8s集群(假设我已经在这些节点上引导chef-client时),我必须在集群中的每个节点上调用knife ssh <node-pattern> chef-client

问题:如何仅通过一条命令(例如ansible-playbook master-playbook.yaml)使Chef对特定节点应用指令

注意:

  • 编写Bash脚本来调用knife-ssh命令对我来说似乎是一种解决方法,我更喜欢使用Chef这样的方式。

更新:

  • 我希望命令是通用的,例如ansible-playbook master-playbook.yaml,而不是像knife ssh <node-pattern> chef-client这样的特定命令。原因是我有大量的Chef项目,其中许多项目我可能要几个月才能接触完。当我想重新引导其中的一些时,我不记得每个节点的特定knife ssh <node-pattern> chef-client命令。我只想记住所有项目的通用Chef命令(例如ansible-playbook master-playbook.yaml-您可以将其应用于所有项目,并且它可以引导所有不同类型的节点)。

1 个答案:

答案 0 :(得分:1)

将搜索查询字符串与knife ssh结合使用,请参见knife search documentation中的最后一个示例:

  

要测试将在knife ssh子命令中使用的搜索查询:

$ knife search node "role:web NOT name:web03"
     

上例中的查询将搜索所有具有web角色的服务器,但不搜索名为web03的服务器。

     

搜索查询由两部分组成:keysearch pattern。其中key是在Chef服务器上的可索引对象(角色,节点,客户端,环境或数据包)的JSON描述中找到的字段名称,而search_pattern定义了将搜索的内容例如,使用以下搜索模式之一:精确,通配符,范围或模糊匹配。 key和search_pattern都区分大小写;键对使用星号(“ *”)的多字符通配符匹配的支持有限(只要它不是第一个字符)。

因此您可以在ssh刀中使用搜索查询字符串:

$ knife ssh "role:web NOT name:web03" "sudo chef-client" -a fqdn