puppet 利用 facter, 实现不同主机调用不同变量方法



分析

变量类型常见三种

1. 内建变量, 如 $title, $name 等, 针对类固定的格式而进行调用
2. 自定义变量, 如 myname = tttttt, 等, 但需要在每个类中进行独立定义, 不能够在类之间进行传递,
3. facter , 公共变量, 可以在每个类中共同使用, 当前打算使用 facter 作为变量的调用

测试1.

修改 /etc/puppet/fileserver.conf 如下, 目的, 创建文件传输目录

grep -v "#" /etc/puppet/fileserver.conf  | grep -v ^$
[extra_files]
  path /etc/puppet/files
  allow *

创建对应目录

mkdir /etc/puppet/files

把 facter 模板存放至 /etc/puppet/files

cat /etc/puppet/files/roles.txt

db01ip=10.10.10.1
puppetip=10.10.0.100
db01sqlip=10.10.10.2
db01user=terry
db02ip=10.10.20.2
db02sqlip=10.10.10.4
db02user=bbxxswqq

创建测试用 puppet 推送模板

[root@gd02-openstack-puppet manifests]# tree
.
├── openstack
│   ├── cinder.vclound.com.pp
│   ├── db.vclound.com.pp
│   ├── galera.vclound.com.pp
│   ├── glance.vclound.com.pp
│   ├── glusterfs.vclound.com.pp
│   ├── haproxy.vclound.com.pp
│   ├── keystone.vclound.com.pp
│   └── test.pp                  <--- 测试用模板
└── site.pp

测试模板内容

[root@gd02-openstack-puppet manifests]# cat openstack/test.pp
node 'gd02-openstack-testdb1.vclound.com', 'gd02-openstack-testdb2.vclound.com' {

  file { [ '/etc/facter','/etc/facter/facts.d']:
      ensure => directory,
      owner => root, group => root,
      mode => 0755,
  }

  file { '/etc/facter/facts.d/roles.txt':
      source =>  "puppet://$fileserver/extra_files/roles.txt",
      owner => root, group => root,
      mode => 0755,
      require => File [ '/etc/facter','/etc/facter/facts.d'],
  }

  if $fqdn == "gd02-openstack-testdb1.vclound.com"
  {
        file { "/tmp/test.txt":
                content => "dbip=$db01ip\npuppet=puppetip\ndbsql=$db01sqlip\ndbuser=$db01user\n",
                owner => root, group => root,
                mode => 644,
                require => File ['/etc/facter/facts.d/roles.txt'],
        }

  }elsif $fqdn == "gd02-openstack-testdb2.vclound.com"
  {
        file { "/tmp/test.txt":
                content => "dbip=$db02ip\npuppet=$puppetip\ndbsql=$db02sqlip\ndbuser=$db02user\n",
                owner => root, group => root,
                mode => 644,
               require => File ['/etc/facter/facts.d/roles.txt'],
        }

  }

}

目的, 分别在 'gd02-openstack-testdb1.vclound.com', 'gd02-openstack-testdb2.vclound.com' 主机中添加 /tmp/test.txt
文件中分别调用 facter 变量
效果如下

testdb1 内容

[root@gd01-openstack-testdb1 ~]# cat /tmp/test.txt
dbip=10.10.10.1
puppet=10.10.0.100
dbsql=10.10.10.2
dbuser=terry

testdb2 内容

[root@gd02-openstack-testdb2 /]# cat /tmp/test.txt
dbip=10.10.20.2
puppet=10.10.0.100
dbsql=10.10.10.4
dbuser=bbxxswqq

结论: 可以在不同主机上匹配不同的 facter 内容

时间: 2024-11-14 12:23:55

puppet 利用 facter, 实现不同主机调用不同变量方法的相关文章

利用NodeJS的子进程(child_process)调用系统命令的方法分享_json

NodeJS子进程简介 NodeJS子进程提供了与系统交互的重要接口,其主要API有: 标准输入.标准输出及标准错误输出的接口. NodeJS子进程简介 NodeJS 子进程提供了与系统交互的重要接口,其主要 API 有: 标准输入.标准输出及标准错误输出的接口 child.stdin 获取标准输入 child.stdout 获取标准输出 child.stderr 获取标准错误输出 获取子进程的PID:child.pid 提供生成子进程的重要方法:child_process.spawn(cmd,

利用Ossim系统进行主机漏洞扫描

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://chenguang.blog.51cto.com/350944/1349749 利用Ossim系统进行主机漏洞扫描 企业中查找漏洞要付出很大的努力,不能简单的在服务器上安装一个漏洞扫描软件那么简单,那样起不了多大作用.这并不是因为企业中拥有大量服务器和主机设备,这些服务器和设备又通不同速率的网络互联,只是我们在期望的时间内无法获得所需的覆盖范围,目前许多欧美的国际安全组织都按照自

winform-在C# Winform项目 利用WIN32 API 无法再次调用第三方的应用系统

问题描述 在C# Winform项目 利用WIN32 API 无法再次调用第三方的应用系统 在C# Winform项目,from窗体中有一个Panel控件和一个Button控件. 目前已经能够利用WIN32 API 找到"监控系统"窗口的句柄,并将那个获取到的窗口"附加"到了Panel控件上. 并能够正常在Panel控件中显示"监控系统". 请问下,怎么样实现form窗体关闭后,再次再点击Button控件能够再次获取到"监控系统&quo

利用OpenVSwitch构建多主机Docker网络

本文讲的是利用OpenVSwitch构建多主机Docker网络,[编者的话]当你在一台主机上成功运行Docker容器后,信心满满地打算将其扩展到多台主机时,却发现前面的尝试只相当于写了个Hello World的入门程序,多主机的网络设置成了下一道门槛.在你尝试各种方案时不妨先看看本文,或许就会豁然开朗,发现原来也不复杂.嗯,是的,本文用到了OpenVSwitch. 运行Docker已经不是什么新鲜事,网上有很多入门教程来帮助你在一台主机上运行容器.这台主机可以是Linux服务器,也可以是Mac(

.net下不用AJAX实现前台JS调用后台C#方法(小技巧)

纯属小技巧,高手见笑了. 一提到如何在前台JS调用后台C#方法,AJAX成为了必然的想法. 只是实现的细节采用AJAX 1.0或者AjaxPro的区别. 其实如果不用AJAX,我们也能够很方便地利用JS调用后台方法. 步骤如下: 1 前台放一个按钮.设置为隐藏.注意:不能直接设置Visible=false的方式,这样的话在ASP.Net 2.0编译后的代码里是找不到这个按钮的.需要设置风格:style="display:none;" 2 双击按钮,写入C#方法,或者写一个调用后台其他方

JNI调用C/C++方法从控制台输入密码

最近看到一个问题,如何用Java实现从控制台输入密码?本来以为是很简单的问题,查了一下发现Java居然没提供这样一个方法.目前实现的方式有2个,一个是利用JNI来调用C/C++方法,另一个是使用多线程.下面是使用JNI的方法:首先,写出我们的Java类: public class JNIPasswordReader { private native String readPassword();static {System.loadLibrary( " PasswordDLL " );}

如何远程调用Access数据库方法详解

  如何远程调用Access数据库方法详解: 使用了TCP/IP,ADO及XML(需要安装Microsoft XML 4.0.).分服务器和客户端两部分,服务器可以多用户同时连接.远程连接Access数据库有很多方法,我以前已经比较详细的回答过(见下面所列的5种方法),我现在这个例子属于其中的第3种方法(不需要使用RDS或Web服务器). 远程连接access数据库的几个方法: 1.建立VPN(Virtual Private Network),这样你的电脑和主机的连接就与局域网无异,然后把服务器

利用jQuery对无序列表排序的简单方法_jquery

利用jQuery对无序列表排序的原理是:获取到无序列表中的所有列表项,并转成数组形式,使用JavaScript函数对其进行排序后再次输出.其中使用到的jQuery函数有ready().get().text().each().append()和JavaScript函数sort(). 1.jQuery函数介绍 (1)jQuery函数get()--获取匹配元素集合 该函数取得所有匹配元素的一种向后兼容的方式(不同于jQuery对象,实际上是元素数组).其语法形式如下: object.get() 注:如

CI框架源码解读之利用Hook.php文件完成功能扩展的方法_php实例

本文实例讲述了CI框架源码解读之利用Hook.php文件完成功能扩展的方法.分享给大家供大家参考,具体如下: 看了hook.php的源码,就知道CI使用hook来进行扩展的原理了. hook的基本知识 http://codeigniter.org.cn/user_guide/general/hooks.html CI中hook的使用经历了一个:开启hook,定义hook,调用hook,执行hook的过程. 手册中已经告知了开启.定义.调用的方法.那么hook的实现原理是啥呢. <?php if