ruby - 对 Chef 变量有疑问,似乎无法让变量工作
问题描述
我正在尝试使用服务器角色将数据添加到模板中。我尝试了几种方法,但似乎无法使其正常工作。
这是角色代码块。
ruby_block 'get_main_role_attr' do
block do
require 'mixlib/shellout'
rolecmd = Mixlib::ShellOut.new("cat /var/chef/role | cut -d',' -f 1 | cut -c2-")
rolecmd.run_command
rolecmd.error!
node.normal['mainrole'] = rolecmd.stdout
end
end
template "/etc/ssh/sshd_config" do
source "ssh/sshd_config.erb"
owner "root"
group "root"
mode "0600"
action :create
variables(
:allowed_users_team1 => "AllowUsers user1 user2 user3",
) if node['mainrole'] == "role1"
notifies :restart, "service[sshd]", :immediately
variables(
:allowed_users_team2 => "AllowUsers user4 user5 user6",
) if node['mainrole'] == "role2" || node['mainrole'] == "role3" || node['mainrole'] == "role4"
notifies :restart, "service[sshd]", :immediately
end
方法一
variables(
:allowed_users => "AllowUsers user1 user2",
) if node['mainrole'] == "role1" || node['mainrole'] == "role2" || node['mainrole'] == "role3"
notifies :restart, "service[sshd]", :immediately
方法二
variables(
:allowed_users => "AllowUsers user1 user2",
) if node['mainrole'] == "role1" || "role2" || "role3"
notifies :restart, "service[sshd]", :immediately
方法三
variables(
:allowed_users_bidder => "AllowUsers user1 user2",
) if node['roles'].any? {|r| %w{role1 role2 role3}.include?(r)}
notifies :restart, "service[sshd]", :immediately
请让我知道我做错了什么......谢谢你的帮助
谢谢
解决方案
Chef 客户端运行分为 2 个部分:编译和收敛。在第一阶段,Chef 创建应在节点上应用的资源集合,在第二阶段应用更改。更多关于它的厨师文档
您node.normal['mainrole']
在收敛状态下分配,但您node['mainrole'] == "role1"
在编译阶段检查值(),这是在此之前。
您需要将分配移动到编译状态或将检查移动到收敛状态。如何将检查移动到收敛状态的示例之一是使用not_if
or only_if
。在这种情况下,您将需要 2 个模板资源:
template "/etc/ssh/sshd_config for 1,2,3" do
path "/etc/ssh/sshd_config"
source "ssh/sshd_config.erb"
owner "root"
group "root"
mode "0600"
action :create
variables(:allowed_users_team1 => "AllowUsers user1 user2 user3")
only_if { node['mainrole'] == "role1" }
notifies :restart, "service[sshd]", :immediately
end
template "/etc/ssh/sshd_config for 4,5,6" do
path "/etc/ssh/sshd_config"
source "ssh/sshd_config.erb"
owner "root"
group "root"
mode "0600"
action :create
variables(:allowed_users_team2 => "AllowUsers user4 user5 user6")
only_if { %w[role2 role3 role4].include? node['mainrole'] }
notifies :restart, "service[sshd]", :immediately
end
另一种方法是在模板本身内部移动逻辑并传递 2 个不同的变量:
variables(:allowed_users_team2 => "AllowUsers user4 user5 user6",
:allowed_users_team1 => "AllowUsers user1 user2 user3",
:mainrole => node['mainrole'])
推荐阅读
- javascript - 使用 Octokit js 将内容添加到 Github 中的现有文件
- python - config.yaml 文件不是由 deeplabcut 创建的
- java - 如何在 RecyclerView 中制作动态微调器?
- regex - 使用正则表达式验证付款响应 [成功/拒绝]
- python - 当驱动程序找不到元素的 xpath 时如何返回“N/A”?
- typescript - 了解 typescript 代码何时完成编译并准备好在浏览器中运行的实际工作流程是什么?
- css - 如何修复 TouchableOpacity 被 SafeAreaView 阻止
- in-app-purchase - 如何在 Spring Boot 项目中从 Apple 服务器通知接收数据
- python - Python解释器在PyCharm中没有显示任何东西
- neovim - 全新安装后找不到配置文件