2

シェルスクリプトを介したcrontab編集と同様のコマンドのVI編集を自動化しようとしていますが、今のところ機能していません。

これが、adminがtrueである最後の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",
}

私はシェルスクリプトを介してこれを実行しようとしています。自動化して多くのオプションを試しましたが、今のところうまくいきませんでした。

[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

これは、シェルスクリプトを介したcrontab編集の自動化と非常に似ていますが、私にとってはうまくいきませんでした。

4

4 に答える 4

1

Unless you really need special Vim capabilities, you're probably better off using non-interactive tools like sed, awk, or Perl / Python / Ruby / your favorite scripting language here.

That said, you can use Vim non-interactively, using silent batch mode.

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

Instead of the external script to read the commands from via -S "commands.ex", you can also give a few commands directly via -c cmd1 -c cmd2. See :help -s-ex for more information.

于 2013-02-18T17:27:49.300 に答える
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

そんな感じ。

于 2013-02-20T09:05:01.007 に答える
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に2回目の呼び出しがあり、2回目に行う必要はありませんでした):

# 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
于 2013-02-24T19:12:15.127 に答える
0

エディターを設定するだけで機能します。私の場合、vimエディターを使用しているため、コマンドは次のようになりました。

export EDITOR=vim
于 2013-03-25T09:38:36.167 に答える