puppet與ansible都是運維自動化工具,兩者最大的區別在於,puppet重量級適用於較大規模運維場景,而ansible較輕量級在較大規模站點的功能顯得不那麼強。
nginx
puppet使用ruby語言研發,因此在使用中還要掌握一些ruby的語法;
shell
本處使用epel倉庫安裝puppet,版本是3.6.2
數組
yum -y install puppet
puppet獲取幫助信息ruby
puppet help
puppet有兩種工做模型bash
standalone模型 master/agent模型
puppet的資源類型app
puppet describe -l #顯示全部的puppet資源類型 puppet describe -ms group #顯示指定資源的簡要信息,-s顯示簡要信息,-m顯示元信息
定義資源的語法
less
resource {'title': attribute => value …… } #resource必須使用小寫,title在同一資源中必須惟一
puppet的八種經常使用資源類型:
運維
一、group資源
ide
建立組工具
cat group.pp group{'mygrp': #資源名稱是group,title是mydb,以冒號標識 ensure => present, #ensure表示建立或刪除組,此處present表示建立組,absent表示刪除組 name => mygrp, #組名稱,若是未定義則使用title指定的字符串,即此字段能夠省略 system => yes, #此組是系統組 gid => 1991, #定義組id } #上述咱們建立一個建立組的資源清單,每字段尾都要以逗號隔開,最後一行的逗號則能夠寫也能夠不寫 puppet apply -v --noop group.pp #-v顯示詳細信息,--noop表示幹跑,即模擬測試此資源清單,實際操做能夠去掉--noop參數 #若是此組已經存在,多執行幾回命令結果都是不變的,由於此資源是冪等的
二、user資源
建立用戶
cat user.pp user{'user1': ensure => present, uid => 3000, #指定用戶id groups => puppet, #用戶所屬輔助組 home => '/app', #指定用戶家目錄 shell => '/bin/csh', #在使用路徑標識時必定要記得加引號,不然報錯 } #建立用戶資源清單 #若是用戶屬於多個輔助組,可使用groups => ['puppet','mygrp'],數組的表示方式 puppet apply -v user.pp #應用此清單,便可建立資源
資源依賴/資源引用 user{'user1': ensure => present, uid => 3000, home => '/app', shell => '/bin/csh', groups => ['testgrp','mygrp'], require => [Group['testgrp'],Group['mygrp']], #require引用資源,資源的首字母必須大寫 } group{'testgrp': ensure => present, } group{'mygrp': ensure => present, } #資源依賴,即要建立user1用戶,必須存在testgrp和mygrp組,並且這兩個組必須被引用 #除了require外,資源依賴還有一種表示方式:before,即某個資源被別的資源依賴,以下在testgrp組資源下定義 before => User['user1'], #此組被user1用戶資源所依賴,即此組要先存在才能建立user1 #總結,依賴關係用兩種方式定義,一是被前資源依賴,一是被後資源依賴
三、package資源
安裝軟件包
cat package.pp package{'nginx': ensure => latest, name => nginx, } #就這些字段就能夠將nginx安裝了
四、service資源
啓動服務
cat service.pp service{'nginx': ensure => running, #是否開啓服務 enable => true, #開機自啓動 hasrestart => true, #是否有重啓命令 restart => "service nginx restart", #設置重啓命令 require => Package['nginx'], #開啓服務依賴於package資源,只有先安裝軟件包才能啓動服務 } package{'nginx': ensure => latest, }
五、file資源
管理文件,既能複製文件又能指定文件類型
類型1、文件 cat file.pp file{'/etc/nginx/nginx.conf': ensure => file, #文件類型 source => '/app/nginx.conf', #要複製的原文件 path => '/etc/nginx/nginx.conf', #目標路徑,與title重複,因此此處能夠省略 owner => root, group => root, mode => 0644, } #咱們將nginx的配置文件監聽端口修改成其餘值如90,配置文件修改了,應該重啓nginx服務,這部分後面會介紹 #以上實現複製文件的方法,下面進行目錄的配置實現 類型2、目錄 cat directory.pp file{'yum.repos.d': ensure => directory, path => '/tmp/yum.repos.d/', source => '/etc/yum.repos.d/', #在/tmp下建立目錄yum.repos.d,可是此目錄下的文件是不會一併複製過來的 recurse => true, #因此須要使用遞歸參數recurse,將目錄中的文件、子目錄全複製到path指定路徑下 } #若是將文件複製到目錄中,即source是文件而path是目錄並且ensure也指定目錄,最終複製是有問題的 #上述兩個例子都是複製文件和目錄,若是建立文件或目錄則使用ensure指定present便可 類型3、符號連接 cat link.pp file{'/tmp/yum.d': #本示例未使用path,則title充當目標路徑,即在tmp目錄下建立的文件爲yum.d ensure => link, #符號連接,建立的yum.d文件爲軟連接 target => '/etc/nginx/nginx.conf', #軟連接文件指向的原始文件 } #path或者title指定的是將要建立的對象,不管是文件仍是目錄 #符號連接文件的權限、屬主、屬組能夠不用考慮 訂閱和通知關係,下面經過綜合示例說明訂閱與通知關係 cat package.pp package{'nginx': ensure => latest, name => 'nginx', } #首先,安裝軟件包 file{'nginx.conf': ensure => file, path => '/etc/nginx/nginx.conf', source => '/app/nginx.conf', owner => 'root', group => 'root', mode => 0644, require => Package['nginx'], #file資源依賴於package資源 notify => Service['nginx'], #當此配置文件修改時就會通知service資源,觸發service的動做 } #編輯配置文件,將修改後的文件經過file資源複製到目標 service{'nginx': ensure => running, name => 'nginx', hasrestart => true, restart => 'systemctl restart nginx', #subscribe => File['nginx.conf'], #此資源訂閱file資源,即file資源有改動此資源就會被通知並採起行動 } #因爲notify與subscribe都能感知變更並當即通知,因此兩者的功能是重合的,只是放置的位置不一樣,所以只是用其中一個 #下述示例與本示例效果同樣 package{'nginx': ensure => latest, name => 'nginx', } -> #此方法表示package資源先於file資源 file{'nginx.conf': ensure => file, path => '/etc/nginx/nginx.conf', source => '/app/nginx.conf', owner => 'root', group => 'root', mode => 0644, } ~> #此方法表示file資源通知service資源或者service資源訂閱file資源 service{'nginx': ensure => running, name => 'nginx', hasrestart => true, restart => 'systemctl restart nginx', } #本例與上例效果都是同樣的,此外還有第三種方法可以達到一樣的效果 package{'nginx': ensure => latest, name => 'nginx', } file{'nginx.conf': ensure => file, path => '/etc/nginx/nginx.conf', source => '/app/nginx.conf', owner => 'root', group => 'root', mode => 0644, } service{'nginx': ensure => running, name => 'nginx', hasrestart => true, restart => 'systemctl restart nginx', } Package['nginx'] -> File['nginx.conf'] ~> Service['nginx'] #單獨一處,定義依賴及通知關係
六、exec資源
相似於ansible中的shell
cat exec.pp exec{'mkdir': command => 'mkdir /tmp/test', #執行的命令,建立目錄 path => '/bin:/sbin:/usr/bin:/usr/sbin', #PATH變量的路徑 creates => '/tmp/test', #若是此處的文件存在就不會執行command,不然執行 } #本例中,creates只是在建立文件、目錄時生效,若是是用戶類命令則還須要其餘參數 cat exec2.pp exec{'useradd': command => 'useradd user2', path => '/bin:/sbin:/usr/bin:/usr/sbin', unless => 'id user2', #unless表示本命令執行失敗纔會執行command,即沒有user2用戶本命令纔會執行失敗 } #unless表示除非,其爲假纔會執行command #onlyif表示只有,其爲真纔會執行command 試想下,咱們複製nginx的配置文件時,想將原文件作個備份,而不是向file複製那樣直接覆蓋,這樣該怎麼作 咱們使用exec資源的refreshonly參數實現 cat exec3.pp file{'nginx.conf': ensure => file, source => '/app/nginx.conf', path => '/etc/nginx/nginx.conf' } exec{'backupfile': command => 'cp /etc/nginx/nginx.conf /tmp/nginx.conf.bak', path => ['/bin','/sbin','/usr/bin','/usr/sbin'], refreshonly => true, #關鍵步驟,刷新功能啓動 subscribe => File['nginx.conf'], } #訂閱參數指定依賴的資源,因此當file資源改變時觸發exec資源 #此例實現配置文件修改,而後將原文件備份
七、cron資源
計劃任務
cat cron.pp cron{'timesync': command => 'ntpdate 172.18.0.1 &> /dev/null', ensure => present, #建立計劃任務 minute => '*/3', user => root, } #每3分鐘以root的身份執行一次同步時間操做 crontab -l #查看效果
八、notify資源
發送提示信息
結束