【问题标题】:Object unchanged when running knife client edit运行刀客户端编辑时对象不变
【发布时间】:2015-10-23 00:38:20
【问题描述】:

我正在运行 knife client edit 命令来编辑 Chef 中的节点以设置管理员权限。我想以编程方式执行此操作,因此我的目的是将此命令添加到 shell 脚本中,如果我可以使其工作的话。

节点之前的状态是(UPDATE):

$ knife client show -Fj my_node
{
  "name": "my_node",
  "public_key": "-----BEGIN PUBLIC KEY-----\n...key...\n-----END PUBLIC KEY-----\n",
  "validator": false,
  "admin": false,
  "json_class": "Chef::ApiClient",
  "chef_type": "client"
}

运行命令时,它说对象未更改,在使用knife client 检查节点后,我可以 验证是否仍将 admin 属性设置为 false:

$ knife client edit -d my_node < my_node.json
Object unchanged, not saving

my_node.json文件的内容是:

{
  "name": "my_node",
  "public_key": "-----BEGIN PUBLIC KEY-----\n...key...\n-----END PUBLIC KEY-----\n",
  "validator": false,
  "admin": true,
  "json_class": "Chef::ApiClient",
  "chef_type": "client"
}

我不知道如何使这件作品发挥作用。 对此的任何帮助将不胜感激。

注意: $刀--版本 厨师:12.2.1

更新:我在这个非常相似的thread 中找不到可接受的答案。

更新 2: 我也尝试了这些其他方法,但完全没有运气(使用相同的 json 文件):

$ cat my_node.json | knife client edit my_node -d
Object unchanged, not saving

$ knife client edit my_node -d < my_node.json
Object unchanged, not saving

【问题讨论】:

  • 我从手册页注意到的一件事是您的示例中的参数顺序不同。如果您改为尝试knife client edit my_node -d &lt; my_node.json 会怎样?此外,我不清楚用&lt; 提供数据是这样做的方法......你试过cat my_node.json | knife client edit my_node -d 吗?
  • 另外,看起来您实际上并没有在编辑任何内容。您正在批发更换;也许knife node from file my_node.json 会更好?
  • 运行那些你告诉我的命令我得到完全相同的输出:对象不变,不保存
  • 我现在只是想知道输入文件是否应该是 JSON 文件,手册页没有说明格式。
  • 输入文件的格式应与knife node show -Fjson &lt;node name&gt; 的输出相同。您确定该文件与服务器上已有的文件不同吗?

标签: bash shell chef-infra knife


【解决方案1】:

如果您已经获得了包含所需内容的文件,那么使用它有一个技巧。

knife client edit -e "cp my_node.json"

解释如何在应用程序上进行交互式编辑(在本例中为刀):

  1. 应用程序在前台启动 EDITOR 环境变量中的命令,将临时文件作为参数传递
  2. 命令结束时,应用打开临时文件并使用它

所以如果你只想改变一个词,你可以使用 sed 来代替:

knife client edit -e "sed -i  's/\"admin\":\s*false/\"admin\": true/'"

【讨论】:

    【解决方案2】:

    你的 my_node.json 和你的 my_node 设置没有区别。更改一个值,然后重试。

    【讨论】:

    • OP 已经在 cmets 中确认文件不同的。
    • 那有什么区别呢?查看他问题中的代码,它们是相同的,并且刀命令的行为与我一致。为了确认它们是相同的,我将第一个的内容复制/粘贴到 Atom 中,然后按 control-f 并将第二个的内容复制/粘贴到 find 参数中。如果实际案例与 OP 发布的内容不匹配,那么 OP 需要更新问题。如果是这样,那么 OP 就犯了一个错误,试图用自己更新文件,这把刀正确地忽略了,以符合幂等哲学。
    • 也许最有建设性的做法是询问 OP :)
    • 对不起,伙计们,我不得不更新我的问题,因为在一些测试期间使用编辑器手动将管理标志更改为 true 后,我复制了节点的先前状态。我可以找到一种不需要在节点中设置管理员权限的方法,但是如果其他用户正在运行相同的问题,问题仍然存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多