前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >puppet 自定义facter

puppet 自定义facter

作者头像
用户5760343
发布于 2022-05-23 06:32:36
发布于 2022-05-23 06:32:36
74100
代码可运行
举报
文章被收录于专栏:sktjsktj
运行总次数:0
代码可运行

自定义fact可以让节点增加更多的标签

在使用puppet作为配置管理工具的同时,facter是一个非常有用的系统盘点工具,这个工具可以通过一些预先设定好变量定位一台主机,比如可以通过变量lsbdistrelease便可以知道当前系统的版本号,通过osfamily便可以知道系统是RedHat还是SLES,还是其它等等。但是这些预先设定好的变量毕竟有限,在整个自动化运维过程中,由于系统应用的多样性,更多需要通过应用的名称、角色的名称进行标示,这样就需要自定义一些fact并赋值到每个节点上去,相当于给节点打上标签。

一、自定义(custom)fact的四种方法

1、定义到facter软件本身的lib库中

这种方法是直接在安装facter的lib库里面直接创建,相当于扩充facter软件的lib库。

可以通过以下方法找到facter包的lib库路径为/usr/lib/ruby/site_ruby/1.8/facter

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@agent1 facter]# rpm -ql facter
/usr/bin/facter
/usr/lib/ruby/site_ruby/1.8/facter
/usr/lib/ruby/site_ruby/1.8/facter.rb
/usr/lib/ruby/site_ruby/1.8/facter/Cfkey.rb
/usr/lib/ruby/site_ruby/1.8/facter/application.rb
/usr/lib/ruby/site_ruby/1.8/facter/architecture.rb
/usr/lib/ruby/site_ruby/1.8/facter/augeasversion.rb
/usr/lib/ruby/site_ruby/1.8/facter/blockdevices.rb
/usr/lib/ruby/site_ruby/1.8/facter/domain.rb
/usr/lib/ruby/site_ruby/1.8/facter/ec2.rb
/usr/lib/ruby/site_ruby/1.8/facter/facterversion.rb
/usr/lib/ruby/site_ruby/1.8/facter/filesystems.rb
/usr/lib/ruby/site_ruby/1.8/facter/fqdn.rb
/usr/lib/ruby/site_ruby/1.8/facter/hardwareisa.rb
/usr/lib/ruby/site_ruby/1.8/facter/hardwaremodel.rb

1.1、在facter的lib库中创建fact,名称为rpms,可以显示当前安装了多少rpm包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@agent1 ~]# cd /usr/lib/ruby/site_ruby/1.8/facter/
[root@agent1 facter]# vim rpms.rb
Facter.add(:rpms) do
  setcode do
    %x{/bin/rpm -qa | wc -l}.chomp  #定义一个shell命令
  end
end

1.2、通过facter命令进行测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@agent1 facter]# facter | grep rpms
rpms => 918
[root@agent1 facter]# facter  rpms
918

备注:这种方法相当于给facter软件打补丁,过多的使用可能会破坏facter本身软件的完整性,不建议使用。

2、使用环境变量‘FACTERLIB’创建fact

这种方法也非常简单,在一个目录下定义一个fact,然后export即可,方法如下

2.1、在自定义目录里面定义一个fact,列出当前系统登录的用户数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@agent1 ~]# vim /var/lib/puppet/kiss_fact/users.rb
Facter.add(:users) do
  setcode do
    %x{/usr/bin/who |wc -l}.chomp
  end
end
[root@agent1 kiss_fact]# facter users #无显示结果,需要设置FACTERLIB
[root@agent1 kiss_fact]#

2.2、将自定义fact路径赋值给变量FACTERLIB

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@agent1 kiss_fact]# export FACTERLIB=/var/lib/puppet/kiss_fact
[root@agent1 kiss_fact]# facter users
2
[root@agent1 kiss_fact]# facter | grep users
users => 2

备注:这种方法是对第一种方法的扩展,可以自己定义目录,不过需要将路径加到变量FACTERLIB中,可以在/etc/profile添加,这样系统启动的时候便可以自动加载。

3、添加外部的(external)fact

这种方式支持txt、yaml、json、sh四种格式,内容也比较固定,默认情况下需要在目录/etc/facter/facts.d/下创建,使用也非常方便。关于这个路径其实是可以修改的,不过修改起来并不是很方便,需要修改facter软件代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@agent1 ~]# vim /usr/lib/ruby/site_ruby/1.8/facter/util/config.rb
 32   def self.external_facts_dirs
 33     if Facter::Util::Root.root?
 34       windows_dir = windows_data_dir
 35       if windows_dir.nil? then
 36         ["/etc/facter/facts.d", "/etc/puppetlabs/facter/facts.d"]  #external路径位置
 37       else
 38         [File.join(windows_dir, 'PuppetLabs', 'facter', 'facts.d')]
 39       end
 40     else
 41       [File.expand_path(File.join("~", ".facter", "facts.d"))]
 42     end
 43   end

特殊说明:只能用于1.7.3版本以上

3.1、通过txt文件创建

3.1.1、创建roles.txt文件

文件内容格式必须为“key=value”

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@agent1 ~]# mkdir /etc/facter/facts.d -p
[root@agent1 facts.d]# vim roles.txt
web=http
db=mysql

3.1.2、测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@agent1 facts.d]# facter web1
http1
[root@agent1 facts.d]# facter db1
mysql1
[root@agent1 facts.d]# facter | egrep 'web1|db1'
db1 => mysql1
web1 => http1

3.2、通过yaml文件创建

3.2.1、创建yaml文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@agent1 facts.d]# vim roles.yaml
---
web2:
 - http2
db2:
 - mysql2

3.2.2、测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@agent1 facts.d]# facter | egrep 'web2|db2'
db2 => mysql2
web2 => http2

3.3、通过json文件创建

3.3.1、创建json文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@agent1 facts.d]# vim roles.json
{
   "web3": "http3",
   "db3": "mysql3"
}

备注:提供一个在线编辑json的网站http://www.bejson.com/go.html?u=http://www.bejson.com/jsonview2/

3.3.2、安装rubygem-json包(json文件需要它的支持)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@agent1 facts.d]# facter | egrep 'web3|db3'
Cannot parse JSON data file /etc/facter/facts.d/roles.json without the json library.
Suggested next step is `gem install json` to install the json library. #缺少json包
[root@agent1 facts.d]# rpm -ivh rubygem-json-1.5.5-2.el5.x86_64.rpm #安装rubygem-json包,找不到安装包的同志可在群共享里面查找,群号码在文章最后面。

3.3.3、测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@agent1 facts.d]# facter | egrep 'web3|db3'
db3 => mysql3
web3 => http3

3.4、通过sh脚本创建

3.4.1、创建shell脚本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@agent1 facts.d]# vim roles.sh
#!/bin/bash
echo "web4=http4"
echo "db4=mysql4"

3.4.2、设置文件具有可执行权限

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@agent1 facts.d]# chmod a+x roles.sh

3.4.3、测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@agent1 facts.d]# facter web4 db4
db4 => mysql4
web4 => http4

思考:那么如何做到所有节点批量部署呢,可以看到以上四种方式都是基于文件编辑的,可在puppetmaster端通过file资源实现部署。

4、使用pluginsync进行发布

这种方法比较特殊,节点factpath目录里除了编写好的rb文件之外,还需要在puppet模块中引用,运行一次之后才会转换成fact。通常在puppetmaster端模块里的lib库中添加,然后在puppet.conf中添加选项pluginsync=true即可,格式为ruby文件。

4.1、创建模块facts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@puppetmaster ~]# cd /etc/puppet/environments/kissprd/environment/modules/
[root@puppetmaster modules]# tree facts/  #目录结构
facts/
└── lib
    └── facter
        └── hwclock.rb
2 directories, 1 file

备注:也可以放在其他已经编写好的模块中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@puppetmaster facter]# vim hwclock.rb  #自定义fact:hwclock,显示节点硬件时间
Facter.add(:hwclock) do
  setcode do
    %x{/usr/sbin/hwclock}.chomp
  end
end

4.2、应用自定义fact至motd模块中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@puppetmaster kissprd]# vim application/modules/motd/manifests/init.pp
class motd{
  package{ 'setup':
    ensure => present,
  }
  file{ '/etc/motd':
    ensure  => present,
    owner   => 'root',
    group   => 'root',
    mode    => '0644',
    source  => "puppet://$puppetserver/modules/motd/etc/motd",
    require => Package['setup'],
  }
  notify { " Hardware-Clock: ${::hwclock}": } #添加一个通知,这里只是测试,没有实际意义
}

4.3、在puppetmaster端的puppet.conf中添加选项pluginsync

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@puppetmaster kissprd]# vim /etc/puppet/puppet.conf
[main]
    logdir = /var/log/puppet
    rundir = /var/run/puppet
    ssldir = $vardir/ssl
    pluginsync = true    #添加插件选项
...

4.4、在所有节点puppet.conf中添加pluginsync(通过在puppet模块中添加实现)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@puppetmaster kissprd]# vim environment/modules/puppet/templates/puppet.conf.erb
### config by  puppet ###
[main]
    logdir = /var/log/puppet
    rundir = /var/run/puppet
    ssldir = $vardir/ssl
    pluginsync = true  #添加插件选项
[agent]
    classfile = $vardir/classes.txt
    localconfig = $vardir/localconfig
    server = <%= scope.lookupvar('puppet::params::puppetserver') %>
    certname = <%= scope.lookupvar('puppet::params::certname') %>

4.5、节点运行puppet agent进行测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@agent1 ~]# facter -p hwclock  #没有这个fact,自定义fact需要加上-p参数才能显示
[root@agent1 ~]# puppet agent -t --environment=kissprd  #运行一次
info: Retrieving plugin
notice: /File[/var/lib/puppet/lib/facter/historys.rb]/ensure: removed
notice: /File[/var/lib/puppet/lib/facter/hwclock.rb]/ensure: defined content as '{md5}d8cc9fe2b349a06f087692763c878e28'
info: Loading downloaded plugin /var/lib/puppet/lib/facter/hwclock.rb  #下载插件至节点factpath指定的目录
info: Loading facts in /var/lib/puppet/lib/facter/hwclock.rb
info: Caching catalog for agent1_cert.kisspuppet.com
info: Applying configuration version '1396170375'
notice:  Hardware-Clock: Sun 30 Mar 2014 05:06:16 PM CST  -0.055086 seconds
notice: /Stage[main]/Motd/Notify[ Hardware-Clock: Sun 30 Mar 2014 05:06:16 PM CST  -0.055086 seconds]/message: defined 'message' as ' Hardware-Clock: Sun 30 Mar 2014 05:06:16 PM CST  -0.055086 seconds' #应用
notice: Finished catalog run in 0.51 seconds
[root@agent1 ~]# facter -p  hwclock #自定义的hwclock生效
hwclock => Sun 30 Mar 2014 05:06:25 PM CST  -0.567090 seconds
[root@agent1 ~]# ll /var/lib/puppet/lib/facter/  #插件已经下载到本地
total 4
-rw-r--r-- 1 root root 79 Mar 30 17:06 hwclock.rb

关于factpath默认路径可通过以下命令查看,当然也可以在puppet.conf中进行修改

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@agent1 ~]# puppet --genconfig | grep factpath
    factpath = /var/lib/puppet/lib/facter:/var/lib/puppet/facts
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
dotnet 分享使用 D2D 绘制界面加 AOT 发布的应用开发经验
这是我用不到 370 行代码,从零开始控制台创建 Win32 窗口,再挂上交换链,在窗口上使用 D2D 绘制界面内容。最后使用 AOT 方式发布的测试应用。成品文件体积不超过 10MB 且运行内存稳定在 60MB 以内,满帧率运行但 CPU 近乎不动
林德熙
2024/02/10
1810
DirectX 使用 Vortice 从零开始控制台创建 Direct2D1 窗口修改颜色
本文将告诉大家如何使用 Vortice 底层库从零开始,从一个控制台项目,开始搭建一个最简单的使用 Direct2D1 的 DirectX 应用。本文属于入门级博客,期望本文能让大家了解 Vortice 底层库是可以如何调用 DirectX 的功能,以及了解 DirectX 中,特别是 D2D 部分的初始化逻辑
林德熙
2023/04/07
1.3K0
DirectX 使用 Vortice 从零开始控制台创建 Direct2D1 窗口修改颜色
WPF 从裸 Win 32 的 WM_Pointer 消息获取触摸点绘制笔迹
本文将告诉大家如何在 WPF 里面,接收裸 Win 32 的 WM_Pointer 消息,从消息里面获取触摸点信息,使用触摸点信息绘制简单的笔迹
林德熙
2024/09/01
2380
WPF 从裸 Win 32 的 WM_Pointer 消息获取触摸点绘制笔迹
dotnet DirectX 通过 Vortice 控制台使用 ID2D1DeviceContext 绘制画面
在上一篇博客里面告诉大家,如何使用 Vortice 从零开始控制台创建 Direct2D1 窗口。上一篇博客采用的是 CreateDxgiSurfaceRenderTarget 的方式拿到了 ID2D1RenderTarget 进行绘制,本文将和大家介绍另一个方式,通过 ID2D1DeviceContext 绘制画面。从底层来说,这两个方式底层都是相同的,只是上层的 API 调用方法不相同而已
林德熙
2023/05/23
5420
dotnet DirectX 通过 Vortice 控制台使用 ID2D1DeviceContext 绘制画面
WPF 使用 Silk.NET 进行 DirectX 渲染入门
本文告诉大家如何使用 dotnet 基金会新开源的 Silk.NET 库调用 DirectX 进行渲染的方法。此库是对 DirectX 的底层基础封装,用上了 dotnet 和 C# 的各个新特性,相对来说基础性能较好,也许后续可以考虑作为 SharpDx 的代替
林德熙
2021/12/27
3.2K0
WPF 使用 Silk.NET 进行 DirectX 渲染入门
原创Paper | DirectX Hook - 优雅的实现游戏辅助窗口
最近看到了一个github的项目,分析过后觉得里面无论是代码还是界面都很好看,然后开始研究其代码。
Seebug漏洞平台
2023/01/08
4.8K2
原创Paper | DirectX Hook - 优雅的实现游戏辅助窗口
WPF 模拟 WPFMediaKit 的 D3D 配置用来测试4k性能
本文告诉大家我在测试 WPFMediaKit 的 D3D 配置性能影响在 4k 分辨率设备下采用高清摄像头的性能
林德熙
2021/12/23
1.1K0
WPF 使用 SharpDX 在 D3DImage 显示 介绍创建控件D3D 设备设置指针画出来
本文告诉大家如何使用 SharpDX 在 D3DImage 显示。在上一篇WPF 使用 SharpDX只是使用窗口,也就是无法使用其它的 WPF 控件。所以这一篇就来告诉大家如何使用 WPF 控件和使用 SharpDX 。
林德熙
2018/09/19
2.4K0
WPF 使用 SharpDX 在 D3DImage 显示
            介绍创建控件D3D 设备设置指针画出来
WPF 对接 Vortice 调用 D2D 使用 IWICBitmap 离屏渲染
通过 Vortice 库可以使用非常底层的方式调用到 Direct2D1 进行渲染,本文将使用 D2D 离屏渲染到 IWICBitmap 上,再使用一点点反射黑科技,直接将此 IWICBitmap 对接到 WPF 框架里。本文提供的这个方法可以实现极高性能且只有很少的转换损耗的离屏渲染方式,唯一的一个缺点是需要进行一点反射调用,适合用来静态画面渲染上
林德熙
2023/04/07
5440
WPF 编写一个测试 WM_TOUCH 触摸消息延迟的应用
我听说在 Win10 到 Win11 的系统版本左右,微软加上了一大波触摸性能优化,准确来说是 HID 性能优化。我想测试一下在这些系统下,采用从 Windows 消息接收到 WM_TOUCH 触摸消息的延迟将会是多少。本文将告诉大家我编写的测试应
林德熙
2023/04/07
6450
ImGUI 1.87 绘制D3D外部菜单
ImGUI 它是与平台无关的C++轻量级跨平台图形界面库,没有任何第三方依赖,可以将ImGUI的源码直接加到项目中使用,该框架通常会配合特定的D3Dx9等图形开发工具包一起使用,ImGUI常用来实现进程内的菜单功能,而有些辅助开发作者也会使用该框架开发菜单页面,总体来说这是一个很不错的绘图库,如下将公开新版ImGUI如何实现绘制外部菜单的功能。
王 瑞
2022/12/28
1.5K0
ImGUI 1.87 绘制D3D外部菜单
WPF 使用 SharpDx 异步渲染 使用方法绑定渲染为什么空白等待画完异步渲染多线程渲染
本文告诉大家如何通过 SharpDx 进行异步渲染,但是因为在 WPF 是需要使用 D3DImage 画出来,所以渲染只是画出图片,最后的显示还是需要 WPF 在他自己的主线程渲染。
林德熙
2018/09/18
2.3K0
dotnet 读 WPF 源代码笔记 从 WM_POINTER 消息到 Touch 事件
本文记录我读 WPF 源代码的笔记,在 WPF 底层是如何从 Win32 的消息循环获取到的 WM_POINTER 消息处理转换作为 Touch 事件的参数
林德熙
2024/09/09
3830
WPF 通过 GetMessageExtraInfo 方法获取当前收到的鼠标消息是否由触摸转换过来
本文将告诉大家如何在 WPF 或者其他 Win32 应用里面,在收到鼠标消息时,通过 GetMessageExtraInfo 方法获取当前收到的鼠标消息是否由触摸消息提升而来
林德熙
2023/11/28
3000
Windows下ImGui的快速使用介绍至项目建立(VS,DX11)
本文建立在基于DX11下API的ImGui使用,如果是别的图形API我还未尝试,故其他API相关请参考阅读,并不一定适用
晨星成焰
2024/06/20
2.2K0
Windows下ImGui的快速使用介绍至项目建立(VS,DX11)
dotnet 读 WPF 源代码笔记 使用 Win32 方法修改窗口的坐标和大小对窗口依赖属性的影响
咱可以使用 Win32 的 SetWindowPos 修改窗口的坐标和大小,此时 WPF 的窗口的 Left 和 Top 和 Width 和 Height 依赖属性也会受到影响,本文将会告诉大家在啥时候会同步更改 WPF 依赖属性的值,而什么时候不会
林德熙
2021/01/12
8840
dotnet C# 通过 Vortice 使用 Direct2D 的 ID2D1CommandList 入门
本文将告诉大家如何通过 Vortice 使用 D2D 的 CommandList 功能
林德熙
2023/06/06
2480
ImGui基于DX11加载/显示图片教程
关于Imgui显示图片,在网上搜到的教程都不符合我的DX11下显示图片的要求故写此文
晨星成焰
2024/08/15
8590
ImGui基于DX11加载/显示图片教程
13.2 外部DirectX绘制实现
在前一节中我们简单介绍了D3D绘制窗体所具备的基本要素,本节将继续探索外部绘制技术的实现细节,并以此实现一些简单的图形绘制功能,首先外部绘制的核心原理是通过动态创建一个新的窗口并设置该窗口属性为透明无边框状态,通过消息循环机制实现对父窗口的动态跟随附着功能,当读者需要绘制新的图形时只需要绘制在透明窗体之上即可实现动态显示的效果。
王 瑞
2023/10/13
5360
13.2 外部DirectX绘制实现
WPF 使用 SharpDX
先介绍一下 SharpDx ,一个底层封装的 DirectX 库,支持 AnyCpu ,支持 Direct3D9, Direct3D11, Direct3D12,Direct2D1。支持 win32 程序和商店程序。
林德熙
2018/09/19
1.4K0
WPF 使用 SharpDX
推荐阅读
相关推荐
dotnet 分享使用 D2D 绘制界面加 AOT 发布的应用开发经验
更多 >
LV.9
这个人很懒,什么都没有留下~
目录
  • 自定义fact可以让节点增加更多的标签
  • 一、自定义(custom)fact的四种方法
    • 1、定义到facter软件本身的lib库中
    • 2、使用环境变量‘FACTERLIB’创建fact
    • 3、添加外部的(external)fact
    • 4、使用pluginsync进行发布
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档