Oxidizedとは
ここを見て ytti/oxidized: configuration backup software (IOS, JunOS) - silly attempt at rancid
勘違い
環境変数 OXIDIZED_HOME
を設定した場合、 ${OXIDIZED_HOME}/config
をconfigファイルとして読み込んでくれると思っていたが、それは間違いだった。
正解
Oxidizedは次の2つのファイルを順番に読み込み、それらをマージしたものをconfigとして使用する。
/etc/oxidized/config
${HOME}/.config/oxidized/config
ちゃんとREADMEで説明されていた。
Oxidized configuration is in YAML format. Configuration files are subsequently sourced from /etc/oxidized/config then ~/.config/oxidized/config. The hashes will be merged, this might be useful for storing source information in a system wide file and user specific configuration in the home directory (to only include a staff specific username and password). Eg. if many users are using oxs, see Oxidized::Script. https://github.com/ytti/oxidized/blob/master/README.md#configuration
コードリーディング
configファイルは oxidized/lib/oxidized/config.rb
のこの部分で読み込んでいる。
def self.load(cmd_opts = {}) asetus = Asetus.new(name: 'oxidized', load: false, key_to_s: true) Oxidized.asetus = asetus
configの読み込みには、Oxidizedと同じ作者のAsetusモジュールを使用している。
このあたりを読むと、Asetusが /etc/oxidized/config
と ${HOME}/.config/oxidized/config
を読み込むことがわかる。
# @param [Hash] opts options for Asetus.new # @option opts [String] :name name to use for asetus (/etc/name/, ~/.config/name/) - autodetected if not defined # @option opts [String] :adapter adapter to use 'yaml', 'json' or 'toml' for now # @option opts [String] :usrdir directory for storing user config ~/.config/name/ by default # @option opts [String] :sysdir directory for storing system config /etc/name/ by default # @option opts [String] :cfgfile configuration filename, by default CONFIG_FILE # @option opts [Hash] :default default settings to use # @option opts [boolean] :load automatically load+merge system+user config with defaults in #cfg # @option opts [boolean] :key_to_s convert keys to string by calling #to_s for keys def initialize opts={} @name = (opts.delete(:name) or metaname) @adapter = (opts.delete(:adapter) or 'yaml') @usrdir = (opts.delete(:usrdir) or File.join(Dir.home, '.config', @name)) @sysdir = (opts.delete(:sysdir) or File.join('/etc', @name)) @cfgfile = (opts.delete(:cfgfile) or CONFIG_FILE) @default = ConfigStruct.new opts.delete(:default) @system = ConfigStruct.new @user = ConfigStruct.new @cfg = ConfigStruct.new @load = true @load = opts.delete(:load) if opts.has_key?(:load) @key_to_s = opts.delete(:key_to_s) raise UnknownOption, "option '#{opts}' not recognized" unless opts.empty? load :all if @load end
https://github.com/ytti/asetus/blob/master/lib/asetus.rb#L103