只测试hiera,我希望能够查看给定节点的层次结构中的所有可用数据(变量=值对).
我的Hiera层次结构配置为:
---
:backends:
- yaml
- json
:yaml:
:datadir: C:\Puppet\hieradata
:hierarchy:
- "Env/%{::env}"
- common
Run Code Online (Sandbox Code Playgroud)
我可以运行以下命令来返回'some-common'变量的node1值:
>hiera some-common ::env=node1
data
Run Code Online (Sandbox Code Playgroud)
我希望能够看到的是层次结构中node1可用的所有变量=值对,这可能吗?谢谢
我正在构建一个自定义类型,我无法从defaultto块访问hiera范围
module Puppet
require 'puppet/parser/functions/hiera'
newtype(:my_type) do
ensurable
newparam(:myparam) do
defaultto { Puppet::Parser::Functions.hiera('myparam') }
end
newproperty(:value) do
desc "Value of the item."
end
end
end
Run Code Online (Sandbox Code Playgroud)
但我明白了
Error: undefined method `hiera' for Puppet::Parser::Functions:Module
Run Code Online (Sandbox Code Playgroud)
我实际上正在使用Puppet 3.8和未来的解析器
作为一种解决方法,我们使用
$my_vals = hiera_hash('mytype_vals')
create_resource(my_type, $myvals, {myparam => hiera('myparam')})
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作,但是my_type
期望在目录中的任何地方实例化对象,并且预期myparam
所有实例中的对象都是相同的.因此,不需要多个默认值声明.
另一种方法是放置
My_type{
myparam => hiera('myparam')
}
Run Code Online (Sandbox Code Playgroud)
在节点清单中.这也可以解决问题,但我们正在开发一个模块,主要清单超出了我们的范围
我正在使用hiera 为我的节点分配类webserver
或类dbserver
.该webserver
班仅包括了Apache和设置它的一些配置(如端口).显然我不想为每个节点复制这个配置,所以我把它放在common.yaml中.但是,我的common.yaml变大了,所以我想把它分开.我想有一个文件包含webserver
角色的配置,另一个文件包含dbserver
角色等.我想我的hiera.yaml看起来像这样:
:hierarchy:
- "fqdn/%{::fqdn}"
- "role/%{ROLE}"
- common
Run Code Online (Sandbox Code Playgroud)
当role
文件夹将包含类似的文件webserver.yaml
,appserver.yaml
,dbserver.yaml
.我已经看到各种博客帖子说解决方案是创建一个自定义的"角色"事实,但大多数人通过从代理节点上的文件(例如从/etc/role
)加载该事实来实现这一点,这对我来说似乎打败了木偶点(我特意使用木偶,所以每次我希望它有一些新角色时我都不必登录每个节点并更改一些配置).
为了清楚起见,我不想编辑代理上的文件以使其工作,我希望使用主服务器上的配置完成所有操作.
我想我可能会有类似下面的内容并详尽地列出每个角色作为层次结构中的元素,但这似乎不可管理.
:hierarchy:
- "fqdn/%{::fqdn}"
- "webserver"
- "appserver"
- "dbserver"
- common
Run Code Online (Sandbox Code Playgroud)
有什么方法可以解决这个问题吗?
hiera.yaml
---
:hierarchy:
- node/%{host_fqdn}
- site_config/%{host_site_name}
- site_config/perf_%{host_performance_class}
- site_config/%{host_type}_v%{host_type_version}
- site/%{host_site_name}
- environments/%{site_environment}
- types/%{host_type}_v%{host_type_version}
- hosts
- sites
- users
- common
# options are native, deep, deeper
:merge_behavior: deeper
Run Code Online (Sandbox Code Playgroud)
我们目前有这个hiera配置.因此,配置按以下顺序合并:common.yaml> users.yaml> sites.yaml> hosts.yaml> types/xxx_vxxx.yaml>等.对于变量顶层次结构,仅当该文件存在时才会被覆盖.
例如:common.yaml
server:
instance_type: m3.medium
Run Code Online (Sandbox Code Playgroud)
site_config/mysite.yaml
server:
instance_type: m4.large
Run Code Online (Sandbox Code Playgroud)
因此对于所有其他站点,实例类型将是m3.medium,但仅对于mysite,它将是m4.large.
我怎样才能在Ansible中实现同样的目标?
我必须编写一个函数,按顺序执行以下操作来读取变量的值:
我已经设法使用此if条件在我的Puppet脚本中执行此操作.
# foo is read from (in order of preference): facter fact, hiera hash, hard coded value
if $::foo == undef {
$foo = hiera('foo', 'default_value')
} else {
$foo = $::foo
}
Run Code Online (Sandbox Code Playgroud)
但是我想避免重复这个,如果我希望以这种方式解析的每个变量的条件,因此想到写一个格式的新Puppet函数get_args('foo', 'default_value')
,它将返回我的值
default_value
.我知道我可以用来lookupvar
从ruby函数中读取一个因素.如何从我的Puppet ruby函数中读取hiera变量?
我在yaml文件中有以下定义:
keepalived:
cluster_name: "cluster.example.lan"
cluster_ip: "192.168.1.10"
cluster_nic: "eth0"
haproxy:
bind_address: %{hiera('keepalived::cluster_ip')}
Run Code Online (Sandbox Code Playgroud)
结果bind_address
我得到一个空字符串.
如果我使用%{hiera('keepalived')}
我已经打印了整个哈希,但我只需cluster_ip
要从这个哈希.我该如何查找cluster_ip
?
我正在为我的网络服务器构建一个结构.我在hiera有我的设置,但我似乎无法让傀儡回馈正确的类型.
在common.yaml
vhosts:
hostname:
sitename:
app_url: value
app_type: value
Run Code Online (Sandbox Code Playgroud)
我有每个vhost多个站点和多个虚拟主机.在我的清单中,我将创建文件夹结构和其他设置任务,但是现在我甚至无法让它迭代网站.
目前的清单:
define application($app_name, $app_url) {
notice("App Type: ${app_type}")
notice("App Url: ${app_url}")
}
$vhosts = hiera('vhosts')
$vhosts.each |$vhost| {
create_resources(application, $vhost)
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是create_resources
需要哈希.但是,如果我输入演员,$vhost
我知道它不是哈希而是元组.
我怎么从我的yaml哈希中得到一个元组?有没有更好的方法来迭代这个数据集来获得我需要的东西?
获取字符串而不是数组
这是我的 common.yaml
aa::params:
- '--params:"abc.com'
- 'abc2.com'
test::packages:
package1:
ensure:'present'
install_options: "%{lookup('aa:params')}"
Run Code Online (Sandbox Code Playgroud)
这是我的清单文件
$packages = lookup("test::packages",undef,undef,'')
$params= lookup("aa::params",undef,undef,'')
$packages.each | String $packagename, Hash $attributes | {
notify { " ${packagename}, ${attributes[ensure]},${attributes['install_options]},${params} hello ":
}
}
Run Code Online (Sandbox Code Playgroud)
预期的
"package1,present,[--params="abc.com, abc2.com"],[--params="abc.com, abc2.com"] hello"
Run Code Online (Sandbox Code Playgroud)
实际的
"package1,present,["--params=\"abc.com", "abc2.com\""],[--params="abc.com, abc2.com"] hello"
Run Code Online (Sandbox Code Playgroud)
看起来数组正在被字符串化,有人可以解释一下为什么我会这样吗
我正在使用PuPHPet作为我的测试环境,它基于Vagrant/Puppet + Hiera.
在config.yml(Hiera配置文件)中,我想为我的时区添加部分
并使用命令 vagrant provision正确设置它.
这可能吗?
我在YAML文件中有一堆哈希(它用于某些服务器的基于Puppet/Hiera的配置),如下所示:
---
apache_vhosts:
'webuser.co.uk':
ip: '*'
port: '80'
serveraliases: ['www.webuser.co.uk',]
add_listen: false
docroot: '/home/webuser/public_html'
docroot_owner: 'webuser'
docroot_group: 'apache'
serveradmin: 'webmaster@webuser.co.uk'
scriptalias: '/home/webuser/public_html/cgi-bin/'
access_log_format: '\"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"'
override: 'all'
users:
'webuser':
ensure: 'present'
gid: '500'
managehome: true
home: '/home/webuser'
password: '$6$zix5AzRheEzQwadthjvLNh.8maO6o4DU4Y0POTaS6xfgjfdvihP2O/UQN6eVDHjG2hTCT6VTLk5HsXeB9FF0xMlYiYY9W1'
password_max_age: '99999'
password_min_age: '0'
shell: '/sbin/nologin'
uid: '500'
Run Code Online (Sandbox Code Playgroud)
我需要以自动方式在Ruby中附加这些哈希值.这个想法是一个请求进来并命中一个运行ruby脚本的webhook,该脚本添加了一个新的Apache VHost和随附的用户.从操作YAML的角度来看,Ruby文档非常不合适,谷歌搜索没有提出任何相关的东西.也许有人可以指出我正确的方向?