自动化VIM EDITOR并使用shell脚本更新值(类似于通过shell脚本编辑crontab)

时间:2013-02-18 16:52:21

标签: vim chef

我正在尝试通过Shell脚本自动执行类似于crontab编辑的命令的VI编辑,但到目前为止还没有为我工作。

这是管理员为真的最终json:

'{"name":"SQLSRVR","admin":"true","json_class":"Chef::ApiClient","chef_type":"client"}'

如您所见,必须将EDITOR环境变量设置或传递为命令行选项-e

[root@vrhost user]# knife client edit SQLSRVR
ERROR: RuntimeError: Please set EDITOR environment variable

[root@vrhost user]# knife client edit
USAGE: knife client edit CLIENT (options)
-s, --server-url URL             Chef Server URL
-k, --key KEY                    API Client Key
    --[no-]color                 Use colored output, defaults to enabled
-c, --config CONFIG              The configuration file to use
    --defaults                   Accept default values for all questions
-d, --disable-editing            Do not open EDITOR, just accept the data as is
-e, --editor EDITOR              Set the editor to use for interactive commands
-E, --environment ENVIRONMENT    Set the Chef environment
-F, --format FORMAT              Which format to use for output
-u, --user USER                  API Client Username
    --print-after                Show the data after a destructive operation
-V, --verbose                    More verbose output. Use twice for max verbosity
-v, --version                    Show chef version
-y, --yes                        Say yes to all prompts for confirmation
-h, --help                       Show this message
FATAL: You must specify a client name

以下命令打开一个vim编辑器进行编辑,以便从[“admin”:“false”]更改为[“admin”:“true”]:

[root@vrhost user]# knife client edit SQLSRVR -e vim 

{
  "name": "SQLSRVR",
  "admin": false,
  "json_class": "Chef::ApiClient",
  "chef_type": "client",
}

我正在尝试通过shell脚本执行此操作,并希望自动化它并尝试了许多选项,但到目前为止没有运气。

[root@vrhost ~]# (echo ^[:g/false/s/false/true/^[:wq!^M) | knife client edit SQLSRVR -e vim
Vim: Warning: Input is not from a terminal
Object unchanged, not saving

[root@vrhost user]# echo (^[echo     '{"name":"SQLSRVR","admin":"true","json_class":"Chef::ApiClient","chef_type":"client"}'^[:w    q!^M) | knife client edit SQLSRVR -e

[root@vrhost ~]# knife client show SQLSRVR
admin:       false
chef_type:   client
json_class:  Chef::ApiClient
name:        SQLSRVR

这与通过shell脚本自动编辑crontab非常相似,但这对我来说并不适用。

4 个答案:

答案 0 :(得分:1)

除非你真的需要特殊的Vim功能,否则最好使用非交互式工具,例如sedawk或Perl / Python / Ruby / 这里你最喜欢的脚本语言

也就是说,您可以使用静默批处理模式以非交互方式使用Vim。

vim -T dumb --noplugin -n -es -S "commands.ex" "filespec"

您可以直接通过-S "commands.ex"提供一些命令,而不是通过外部脚本来读取来自-c cmd1 -c cmd2的命令。有关详细信息,请参阅:help -s-ex

答案 1 :(得分:0)

结帐

$ knife client edit --help
[...]
-d, --disable-editing            Do not open EDITOR, just accept the data as is

所以我猜你可以在不修改vim的情况下更改值。只是:

  • 以json格式获取客户端数据。
  • 用sed。
  • 替换所需的值
  • 从文件上传数据。

代码:

$ knife client show -Fj SQLSRVR > SQLSRVR.json
$ sed -i.old "s/\"admin\": true,/\"admin\": false,/" SQLSRVR.json
$ knife client edit -d SQLSRVR < SQLSRVR.json

类似的东西。

答案 2 :(得分:0)

以下是一些参考链接:

i)http://mirror.hep.wisc.edu/stable/chef/chef-server-webui/app/controllers/clients_controller.rb

ii)http://www.rubydoc.info/github/opscode/chef/master/Shell/Extensions - 尝试但无法让它工作

最后做了以下事情(它确实给了409第二次电话,我不需要第二次这样做):

# call to below rb, CLIENTNAME is the name of the client and STATE is true/false
$ knife exec clienttransform.rb CLIENTNAME STATE

$ cat clienttransform.rb

Chef::Config[:solo] = false

class Company
  class TransformClient

    attr_accessor :clientname
    attr_accessor :isclientadmin

    def initialize(client_name, is_client_admin)
      @clientname = client_name
      @isclientadmin = is_client_admin
    end

    def transform
      client=Chef::ApiClient.load(@clientname)
      # puts "client.name : " + client.name
      # puts "client.admin : " + client.admin.to_s
      # puts "XX - clientname : " + @clientname
      # puts "XX - isclientadmin : " + @isclientadmin.to_s
      boolisclientadmin = !!@isclientadmin
      client.admin(boolisclientadmin)
      client.save()
    end

  end

end

client_name = ARGV[2].to_s()
is_client_admin = ARGV[3].to_s()

# puts "YY - client_name : " + client_name
# puts "YY - is_client_admin : " + is_client_admin

trc = Company::TransformClient.new(client_name, is_client_admin)
trc.transform

exit 0

答案 3 :(得分:0)

只需设置您的编辑器即可。在我的情况下,我使用vim编辑器,这就是为什么我的命令如下:

export EDITOR=vim