【问题标题】:Chef - how to use a list of attributes in a scriptChef - 如何在脚本中使用属性列表
【发布时间】:2016-12-24 19:55:03
【问题描述】:

我是 Chef 的新手,我想执行一个脚本来在我的系统中添加用户。 我在厨师中有一本名为 usersinto 和属性的食谱:

node.default["usersinto"]["users"] = [ " user1 user2 user3 .... userN " ]

在配方中被调用:

bash "launch-add" do
    code <<-EOH
        sh /home/user/addusers.sh "#{node["usersinto"]["users"]}"
    EOH
end

我会尝试很多东西,如果我在属性中使用“[”,脚本会捕获“[”作为参数 $1,如果我不使用“[]”,脚本只会捕获第一个用户。 我怎么能这样做??

提前致谢:)

【问题讨论】:

  • 有两件事: 1. 要访问 bash 代码中的变量,它应该不带引号。例如#{node["usersinto"]["users"]}。如果您不进行字符串插值,那么使用单引号也是一种很好的做法。 2. 在您分享脚本之前,很难猜出错误。

标签: bash attributes chef-infra


【解决方案1】:

您的脚本似乎接受一个参数。我无法判断该参数是单个用户还是单个用户字符串。如果它只接受一个用户,您需要将您的 node["usersinto"]["users"] 属性设为一个数组(这看起来无论如何都应该是一个数组)。

node.default["usersinto"]["users"] = %w{user1 user2 user3} 

一旦你有了你的数组,迭代它,为每个用户执行 bash 脚本。

node["usersinto"]["users"].each do |user|
    bash "launch-add" do 
       code <<-EOH 
         sh /home/user/addusers.sh #{user}
       EOH 
    end
end

如果您的脚本接受多个参数(每个参数是不同的用户)

bash "launch-add" do 
   code <<-EOH 
     sh /home/user/addusers.sh #{node['usersinto']['users'].join(' ')}
   EOH 
end

【讨论】:

  • 我的脚本接受参数字符串,然后添加每个用户:for var in "$@" do bash addscript.sh $var done
  • 啊,然后丢掉你的外双引号。这使得它向所有用户发送一个参数。您希望每个用户都有自己的论据。
  • 我已经编辑了我的答案以显示传递多个参数
【解决方案2】:

按照您的方式,node["usersinto"]["users"] 的值是一个包含一个元素(即字符串)的数组。这可能不是您想要的,要么将其设为单个字符串,要么将其设为多个字符串的数组。在任何一种情况下,您都需要#{node["usersinto"]["users"].first}

【讨论】:

    【解决方案3】:

    如果您是 chef is 新手,那么您应该考虑使用一些社区食谱来解决常见问题,例如用户管理。例如,“用户”食谱非常适合管理用户帐户

    用户信息在数据包中指定,而不是在属性中。

    示例

    可以使用 chef 命令生成示例食谱

    chef generate cookbook demo
    

    创建一个名为“demo”的食谱,可以按如下方式展开:

    ├── Berksfile
    ├── Berksfile.lock
    ├── .kitchen.yml       <-- Test kitchen file
    ├── metadata.rb
    ├── README.md
    ├── recipes
    │   └── default.rb     <-- Recipe to be tested
    └── test
        └── integration
            ├── data_bags            <-- Test data
            │   └── users
            │       ├── user1.json
            │       └── user2.json
            ├── default
            │   └── serverspec
            │       └── default_spec.rb   <-- Test
            └── helpers
                └── serverspec
                    └── spec_helper.rb
    

    Test kitchen是chefdk绑定的工具,可以用来测试cookbook逻辑

    $ kitchen verify default-ubuntu-1404
    -----> Starting Kitchen (v1.4.2)
    ..
    ..
    ..
           User "user1"
             should exist
             should belong to group "admins"
             should have uid 2001
             should have authorized key "ssh-rsa I AM A DUMMY KEY 1"
    
           User "user2"
             should exist
             should belong to group "admins"
             should have uid 2002
             should have authorized key "ssh-rsa I AM A DUMMY KEY 2"
    
           Finished in 0.12919 seconds (files took 0.31869 seconds to load)
           8 examples, 0 failures
    
           Finished verifying <default-ubuntu-1404> (0m8.42s).
    -----> Kitchen is finished. (0m9.14s)
    

    元数据.rb

    “用户”食谱被添加为依赖项

    name 'demo'
    maintainer 'Mark O''Connor'
    maintainer_email 'me@demo.com'
    license 'all_rights'
    description 'Installs/Configures demo'
    long_description 'Installs/Configures demo'
    version '0.1.0'
    
    depends "users"
    

    食谱/default.rb

    #
    # Cookbook Name:: demo
    # Recipe:: default
    #
    # Copyright (c) 2016 The Authors, All Rights Reserved.
    
    users_manage "admins"
    

    test/integration/default/serverspec/default_spec.rb

    require 'spec_helper'
    
    describe user('user1') do
      it { should exist }
      it { should belong_to_group 'admins' }
      it { should have_uid 2001 }
      it { should have_authorized_key 'ssh-rsa I AM A DUMMY KEY 1' }
    end
    
    describe user('user2') do
      it { should exist }
      it { should belong_to_group 'admins' }
      it { should have_uid 2002 }
      it { should have_authorized_key 'ssh-rsa I AM A DUMMY KEY 2' }
    end
    

    测试/集成/data_bags/users/user1.json

    {
      "id": "user1",
      "ssh_keys": [
        "ssh-rsa I AM A DUMMY KEY 1"
      ],
      "groups": [
        "admins"
      ],
      "uid": 2001
    }
    

    测试/集成/data_bags/users/user2.json

    {
      "id": "user2",
      "ssh_keys": [
        "ssh-rsa I AM A DUMMY KEY 2"
      ],
      "groups": [
        "admins"
      ],
      "uid": 2002
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多