這周我開始學習 Puppet 并努力實作用戶的/etc/ssh/sudo_authorized_keys.
我有一個用戶字典,其中有以下鍵sudo_users.yaml:
core::sudo_users_keys:
kate:
keys:
key1:
type: "ssh-ed25519"
key: "AAAAC3N..."
john:
keys:
key1:
type: "ssh-ed25519"
key: "AAAAC..."
marvin:
keys:
key1:
type: "ssh-ed25519"
key: "AAAAC3Nza..."
然后我在sudokeys.pp檔案中創建它:
class core::sudokeys {
file { "/etc/ssh/sudo_authorized_keys":
ensure => file,
mode => "0440",
content => template("core/sudo_authorized_keys.erb"),
}
如您所見,我想用迭代來實作模板。這是我當前的模板:
<%- scope['core::sudo_users_keys'].each | user | -%>
{
<%- if user[1] -%>
<%- $user[1]['keys'].each do | key | -%>
<%= $key[1]['type'] $key[1]['key'] -%>
<%- end end -%>
}
<%- end -%>
我有與 id_rsa 鍵相同的字典來 ssh 并使用如下互動。它非常適用于 ssh_authorized_key,但在這種情況下,我可以通過將密鑰添加到/etc/ssh/sudo_authorized_keys. 這就是為什么我決定使用模板并且只在sudo_authorized_keys檔案中注入密鑰。
class core::sshkeys {
lookup("core::sudo_users_keys").each | $user | {
if $user[1] {
$user[1]["keys"].each | $key | {
ssh_authorized_key { "${user[0]}-${key[0]}":
ensure => present,
user => $user[0],
type => $key[1]["type"],
key => $key[1]["key"],
}
}
}
}
}
Puppet 檔案不包含這種更復雜的迭代,我感覺就像在迷霧中徘徊。
目前,我在部署模板時遇到了這個錯誤,但我覺得我準備它的方式不會像我想要的那樣作業。
Internal Server Error: org.jruby.exceptions.SyntaxError: (SyntaxError) /etc/puppetlabs/code/environments/test/modules/core/templates/sudo_authorized_keys.erb:2: syntax error, unexpected tSTRING_BEG
_erbout.<< " {\n".freeze
^
我將不勝感激有關模板構建的任何建議。我應該改變什么才能使其作業并僅提取type和key值?
uj5u.com熱心網友回復:
您的方法是可行的,但是您的代碼存在多個問題,其中
模板中的
scope物件提供對 Puppet 變數的訪問,而不是對 Hiera 資料的訪問。解決這個問題的最簡單方法可能是- 給你的
core::sudokeys類一個類引數以與資料相關聯($userkeys例如), - 更改資料的 Hiera 鍵,使其自動系結到新的類引數,以及
- 在模板中,通過類引數訪問資料(在這種情況下甚至不需要使用
scope物件)。
- 給你的
在模板中,您似乎假設您的資料結構與 Hiera 中的實際結構不同。您的資料是散列的散列,但是您正在訪問其中的一部分,就好像某處涉及陣列(
user[1],key[1])。此外,如果有一個或多個陣列,請注意 Ruby 陣列索引從 0 開始,而不是從 1 開始。ERB 模板中的 Scriptlet 代碼(僅)是 Ruby。您的 scriptlet 代碼似乎混合了 Ruby 和 Puppet 語法。特別是,Ruby 變數名稱不以 a 為前綴
$,并且 Ruby 塊引數出現在塊內,而不是塊外。<%= ... %>標簽 a 用于分別輸出一個Ruby 運算式的值。您似乎試圖發出具有相同標簽的多個運算式。
此外,值得注意的是,scriptlet 代碼可以跨越多行。這樣可以更清楚。此外,您可能需要注意模板中的空格和換行符以獲得所需的輸出。如果需要,ERB 可以選擇在 scriptlet 標記周圍使用不需要的空白,但有時它至少可以很容易地避免放入您不想要的空白。另一方面,一定不要抑制你真正想要的空白。
因此,這是上述所有可能采用的一種形式:
sudo_users.yaml
core::sudokeys::users_keys:
kate:
keys:
key1:
type: "ssh-ed25519"
key: "AAAAC3N..."
john:
keys:
key1:
type: "ssh-ed25519"
key: "AAAAC..."
marvin:
keys:
key1:
type: "ssh-ed25519"
key: "AAAAC3Nza..."
sudokeys.pp
class core::sudokeys($users_keys) {
file { "/etc/ssh/sudo_authorized_keys":
ensure => file,
mode => "0440",
content => template("core/sudo_authorized_keys.erb"),
}
}
sudo_authorized_keys.erb
<% @users_keys.each do | user |
if user.has_key?('keys') do
user['keys'].each do |key|
%><%= key['type'] %> <%= key['key'] %>
<% # don't consume preceding whitespace here
end
end
end
%>
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/510045.html
