Puppet--自動化運維工具基本功能介紹

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資源

發送提示信息



結束

相關文章
相關標籤/搜索