<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                #### Puppet基礎篇10-自定義fact實現的四種方式介紹 ### 自定義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` ~~~ [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包** ~~~ [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命令進行測試** ~~~ [root@agent1 facter]# facter | grep rpms rpms => 918 [root@agent1 facter]# facter rpms 918 ~~~ **備注:**這種方法相當于給facter軟件打補丁,過多的使用可能會破壞facter本身軟件的完整性,不建議使用。 ### 2、使用環境變量‘FACTERLIB’創建fact 這種方法也非常簡單,在一個目錄下定義一個fact,然后export即可,方法如下 **2.1、在自定義目錄里面定義一個fact,列出當前系統登錄的用戶數** ~~~ [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** ~~~ [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軟件代碼。 ~~~ [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” ~~~ [root@agent1 ~]# mkdir /etc/facter/facts.d -p [root@agent1 facts.d]# vim roles.txt web=http db=mysql ~~~ **3.1.2、測試** ~~~ [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文件** ~~~ [root@agent1 facts.d]# vim roles.yaml --- web2: - http2 db2: - mysql2 - ~~~ **3.2.2、測試** ~~~ [root@agent1 facts.d]# facter | egrep 'web2|db2' db2 => mysql2 web2 => http2 ~~~ **3.3、通過json文件創建** **3.3.1、創建json文件** ~~~ [root@agent1 facts.d]# vim roles.json { "web3": "http3", "db3": "mysql3" } ~~~ **備注:**提供一個在線編輯json的網站[http://www.bejson.com/go.html?u=http://www.bejson.com/jsonview2/](http://www.bejson.com/go.html?u=http://www.bejson.com/jsonview2/) **3.3.2、安裝rubygem-json包(json文件需要它的支持)** ~~~ [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、測試** ~~~ [root@agent1 facts.d]# facter | egrep 'web3|db3' db3 => mysql3 web3 => http3 ~~~ **3.4、通過sh腳本創建** **3.4.1、創建shell腳本** ~~~ [root@agent1 facts.d]# vim roles.sh #!/bin/bash echo "web4=http4" echo "db4=mysql4" ~~~ **3.4.2、設置文件具有可執行權限** ~~~ [root@agent1 facts.d]# chmod a+x roles.sh ~~~ **3.4.3、測試** ~~~ [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** ~~~ [root@puppetmaster ~]# cd /etc/puppet/environments/kissprd/environment/modules/ [root@puppetmaster modules]# tree facts/ #目錄結構 facts/ └── lib └── facter └── hwclock.rb 2 directories, 1 file ~~~ **備注:**也可以放在其他已經編寫好的模塊中 ~~~ [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模塊中** ~~~ [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** ~~~ [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模塊中添加實現)** ~~~ [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進行測試** ~~~ [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中進行修改 ~~~ [root@agent1 ~]# puppet --genconfig | grep factpath factpath = /var/lib/puppet/lib/facter:/var/lib/puppet/facts ~~~ ### 資料參考: - 官網 [http://docs.puppetlabs.com/guides/custom_facts.html](http://docs.puppetlabs.com/guides/custom_facts.html) - 書籍《pro puppet 2》Chapter10:Extending Facter and Puppet **下載地址:**[http://kisspuppet.com/2014/03/29/propuppet2/](http://kisspuppet.com/2014/03/29/propuppet2/) - 書籍《Puppet 3 Cookbook》Chapter8: External Tools the Puppet Ecosystem **下載地址:**QQ群里已經共享,群號在文章最下面 那么在生產環境當中應當如何應用自定義的fact呢,下一章節會介紹一種方法,結合ENC(hiera)實現節點分類。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看