Bowen's Blog

Respect My Authorita.

Facter

| Comments

facter是一个以key/value形式收集系统信息的工具。

1
2
3
4
5
[root@localhost ~]# yum provides /usr/bin/facter
1:facter-1.6.17-1.el6.x86_64 : Ruby module for collecting simple facts about a host operating system
Repo        : installed
Matched from:
Other       : Provides-match: /usr/bin/facter

Ansible和Puppet都用它来收集系统信息。

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# facter
architecture => x86_64
boardproductname => VirtualBox
facterversion => 1.6.17
hardwareisa => x86_64
hardwaremodel => x86_64
ipaddress => 10.0.2.15
ipaddress_eth0 => 10.0.2.15
.......
operatingsystem => CentOS

facter是跨平台的,所以可以利用它来获取不同服务器的信息。 比如Ansible中有专门的facter模块。

1
2
3
4
5
6
7
8
9
10
11
12
13
~> ansible vagrant -m facter -i hosts
vagrant | success >> {
   "architecture": "x86_64",
   "augeasversion": "0.9.0",
   "changed": false,
   "domain": "localdomain",
   "facterversion": "1.6.17",
   "fqdn": "localhost.localdomain",
   "hardwareisa": "x86_64",
 ......
 ```

puppet中,可以如此使用:

puppet case $::operatingsystem { ‘CentOS’: { include centos } ‘MacOS’: { include mac } }

1
2
3
4
因为facter的变量都是global的,所以直接使用`$operatingsystem`也是可以的。

有两种方式可以添加自定义的facter变量(fact),其中通过环境变量的方式会比较容易,只要环境变量名是以`FACTOR_`
开头,都可以通过facter读取到该变量。

bash ~> export FACTER_cartman_is_gay=“true” ~> facter | grep cartman cartman_is_gay => true

~> export FACTER_KYLE_MOM_IS_BITCH=“true” ~> facter | grep kyle kyle_mom_is_bitch => true

~> export FACTER_cartman_is_gay=“false” ~> facter | grep cartman cartman_is_gay => false

1
2
可以看出,fact变量的大小写无关的,自定义的fact可以被override的,puppetlabs的文档中说系统fact
不能被override,但是貌似可以,不知道哪里出了问题。

bash [vagrant@localhost ~]$ facter | grep operatingsystem operatingsystem => CentOS operatingsystemrelease => 6.4 [vagrant@localhost ~]$ export FACTER_operatingsystem=“Rock” [vagrant@localhost ~]$ facter | grep operatingsystem operatingsystem => Rock operatingsystemrelease => 2.6.32-358.el6.x86_64 ```

我们老一点的系统都部署在数据中心,所有的服务器的配置用puppet管理,基本上都是虚拟化,基于一个标准的 镜像,标准镜像spin up的服务器中会添加一个自定义的fact,用来判断是否是自定义的系统。我其实不太喜欢 这样的使用方式,首先这让puppet manifest的可读性降低了,找遍整个repo都不找不到在哪里定义的这个变 量,其次,让puppet manifest对系统产生了依赖性,不够灵活。


1