puppet(5)-master/agent模式

master/agent模式的工做流程

  1. agent每隔固定時長會向master端發送nodename(本身的節點名,節點名相當重要)和 facts ,而且向服務器端請求本身的catalog。
  2. master端收到之後首先(classify)分類識別來請求的是哪個客戶端和這個客戶端要哪些東西,因而master端就在本地根據定義的站點清單給這個agent端聲明哪些類。前端

    Ps:每個agent端必須向master端明確的發送本身的nodename。node

master端依靠nodename識別agent端,爲何要靠nodename識別agent端呢?

  1. 由於兩者之間是基於ssl互相認證通信的,puppet中master與agent是基於https協議通信的。
  2. https通信的構建過程:客戶端發請求服務端把證書扔給客戶端,客戶端驗證這個這個證書。而在puppet中 是雙向認證的,master要驗證agent端的證書,agent還要驗證master端的證書。也就意味着agent端發請求會把本身的證書扔給master端的,master要根據agent本身聲明的名字和agent本身發過來的證書來驗證兩者之間是否一致的,若是能保持一致,那麼咱們就認爲這是經過的,更重要的是master端還保存着ca證書,所以它還要使用ca去驗證此證書各個方面的有效性,這一切都經過了,雙方纔能夠創建基於ssl通訊會話的。這裏面的通訊過程agent要發送本身的節點名,而agent向master請求時儘可能使用master的節點名稱而不要使用ip地址。所以在咱們的puppet工做環境中,DNS服務相當重要。每個節點都必需要有一個儘量惟一的名字。經過dns服務可以解析,並且能彼此之間經過解析後可以互相通訊才能夠.mysql

    ssl xmlrpc, https
    8140/tcp
    master : puppet , puppet-server, facter
    agent : puppet facter
    服務端啓動puppet-server ,監聽端口8140
    agent端啓動puppet, 不監聽端口,每隔固定時間向master端請求本身相關的catelognginx

構建master/agent的應用

  • master端安裝:web

    sudo yum install puppet-server puppet facter

    安裝master必備的兩個包,puppet 和puppet-server,若是本機也須要請求catelog那就須要安裝facter,這裏咱們想讓master同時也作agent端,因此上面yum安裝了 這三個包。正則表達式

    查看puppet-server安裝包sql

    $ rpm -ql puppet-server-3.6.2-3.el7.noarch
      /etc/puppet/fileserver.conf
      /etc/puppet/manifests
      /usr/lib/systemd/system/puppetmaster.service
      /usr/share/man/man8/puppet-kick.8.gz
      /usr/share/man/man8/puppet-master.8.gz
      /usr/share/man/man8/puppet-queue.8.gz

    從安裝路能夠看出:puppet-server並無什麼可執行文件,只有幾個目錄、文件以及使用手冊。這就說明master的執行程序也是puppet提供的子命令。
    這裏簡單說明下:centos

    fileserver.conf是提供fileserver功能的配置文件
      /etc/puppet/manifests 目錄是存放站點清單的目錄

    安裝puppet-server以後,就可使用puppet-server的功能了。服務器

  • puppet的配置文件
    查看配置文件目錄:restful

    $ ls /etc/puppet/
      auth.conf  fileserver.conf  manifests  modules  puppet.conf

    主配置文件 puppet.conf ,是init的配置文件類型,像mysql服務的配置文件,一個配置文件同時有mysqlclient和mysqld的配置項,咱們來看看默認配置文件內容:

    $ cat /etc/puppet/puppet.conf
      [main]
          # The Puppet log directory.
          # The default value is '$vardir/log'.
          logdir = /var/log/puppet
    
          # Where Puppet PID files are kept.
          # The default value is '$vardir/run'.
          rundir = /var/run/puppet
    
          # Where SSL certificates are kept.
          # The default value is '$confdir/ssl'.
          ssldir = $vardir/ssl
    
      [agent]
          # The file in which puppetd stores a list of the classes
          # associated with the retrieved configuratiion.  Can be loaded in
          # the separate ``puppet`` executable using the ``--loadclasses``
          # option.
          # The default value is '$confdir/classes.txt'.
          classfile = $vardir/classes.txt
    
          # Where puppetd caches the local configuration.  An
          # extension indicating the cache format is added automatically.
          # The default value is '$confdir/localconfig'.
          localconfig = $vardir/localconfig

    咱們看配置文件中並無puppet-server的配置內容,能夠用puppet config命令對配置文件進行操做
    [main] 表示agent和master均可以使用的配置
    [agent] agent進程的配置

  • puppet config 命令使用
    查看命令幫助

    $ puppet help config
      ...
      ACTIONS:
        print    Examine Puppet's current settings.
        set      Set Puppet's settings.
    
      See 'puppet man config' or 'man puppet-config' for full help.

    可使用print查看當前puppet的配置(包括master, agent, main)

    $ puppet config print
      confdir = /home/ops-manager/.puppet
      vardir = /home/ops-manager/.puppet/var
      name = config
      logdir = /home/ops-manager/.puppet/var/log
      log_level = notice
      disable_warnings = []
      priority =
      trace = false
      profile = false
      autoflush = true
      ...
      下面有不少配置項,就不貼出來了

    可使用set 來單獨設置某一個配置項
    經過 puppet print列出的配置項都是默認的配置項。但展現出來的並無說明某一個配置項的含義。並且也不知道哪些配置是master端的,哪些是agent端的。這個print也只能用於管理員確認某一個配置項時使用。那麼咱們想看配置文件說明怎麼辦? -- 用puppet doc 子命令,doc自命令分段、分類介紹。可使用puppet doc --list查看分爲哪幾個段,如:

    $ puppet doc --list
      configuration - A reference for all settings
      function - All functions available in the parser
      indirection - Indirection types and their terminus classes
      metaparameter - All Puppet metaparameters and all their details
      providers - Which providers are valid for this machine
      report - All available transaction reports
      type - All Puppet resource types and all their details
  • 使用puppet doc --reference configuration 能夠查看配置文件相關的文檔

    # Configuration Reference
    
      **This page is autogenerated; any changes will get overwritten** *(last generated on 2018-03-27 05:38:24 +0000)*
    
      ## Configuration Settings
    
      * Each of these settings can be specified in `puppet.conf` or on the
        command line.
      * When using boolean settings on the command line, use `--setting` and
        `--no-setting` instead of `--setting (true|false)`.
      * Settings can be interpolated as `$variables` in other settings; `$environment`
        is special, in that puppet master will interpolate each agent node's
        environment instead of its own.
      * Multiple values should be specified as comma-separated lists; multiple
        directories should be separated with the system path separator (usually
        a colon).
      ...
      一樣是一堆內容,能夠做爲往後查找手冊

    puppet config print命令 和puppet doc --reference configuration命令內容都不太適合剛入手查看。
    有更適合新手的查看方法:

    puppet master --genconfig 顯示master的相關配置
      puppet agent  --genconfig 顯示agent的相關配置

    使用上面兩個命令能夠幫助咱們瞭解master、agent端的默認配置項。若是我想改這些默認配置項,能夠把內容放到puppet.conf文件中,但要注意的是,puppet master --genconfig 和 puppet agent --genconfig命令都是經過調用puppet.conf文件進行顯示的,因此你千萬不能直接就把puppet.conf文件給覆蓋了,這樣會有很大問題的。正確的作法都是先將顯示的內容輸出到一個新建的文件中,而後在不puppet.conf 重命名爲puppet.conf_default,在把那個新文件命名爲puppet.conf。

    puppet master --genconfig > puppet_new.conf
      puppet agent --genconfig >> puppet_new.conf
    注意: (1) 生產新的配置以前不能刪除或移動原有的puppet.conf; (2) 生成的配置中,有的參數已經被廢棄,與現有puppet版本不兼容,所以還需進行手動排查。

    (3) 有的參數的默認值與如今的版本所支持值可能不相兼容。
    所以若是咱們本身不想麻煩的話,最好不要本身手動生成配置文件,只要修改部分想修改的相關項便可。

  • puppet配置文件的組成部分:

    [main]
      [master]
      [agent]
  • 運行puppet master  puppet agent
    puppet master/agent各節點是強依賴主機名的,因此在啓動meter/agent工做模式時,要確保各節點之間能夠經過FQDN徹底限定名可以互相解析。
    以服務方式啓動命令 : puppet master
    建議第一次啓動,使用參數讓master在前端運行:

    puppet master --no-daemonize -v
      -v 表示工做在詳細模式
      --no-daemonize 不工做在守護模式下
      -d 調試信息模式,可能會有一些干擾信息,咱們這裏就不使用它。

    如下是運行結果

    若是咱們看到上面的信息,沒有什麼錯誤信息的話,其實咱們就能夠直接把puppet master服務啓動了,不用進行更改配置了。即便用它的默認配置就能夠工做起來。同時咱們能夠看到默認證書存放的位置/var/lib/puppet/ssl。

    若是此次生成的內容不想要了,如何作的呢?
    只要刪除剛剛生成的證書目錄便可:

    rm -rf /var/lib/puppet/ssl/*

    而後再次運行puppet master --no-daemonize -v 重新生成一遍。若是沒有問題就能夠啓動在後臺。在centos7上有專門的unit file,如:

    # ls /usr/lib/systemd/system/puppet
      puppetagent.service   puppetmaster.service  puppet.service

    這裏puppetagent.service 是鏈接到 puppet.service 都是啓動puppet agent的
    puppetmaster.service 是啓動 puppet master的

    [root@ops ssl]# systemctl start puppetmaster.service
      使用ss -tnl查看端口

    接着咱們就要安裝 、 配置agent端
    安裝就簡單了

    sudo yum install epel-realese
      sudo yum install agent facter

    配置文件是 /etc/puppet/puppet.conf 中的 [agent] 段
    默認配置文件中內容很少,咱們想首先 配置的應該是指明master端的 FQDN徹底限定名
    若是咱們不在配置文件中指定,也可使用puppet agent命令指定

    puppet agent --server puppet-master.my.com

    注意若是命令執行了,agent端會自動生成一個ssl私鑰,並生成一個證書籤署請求然後發送給master端,並等待master端給它作簽署,在簽署完成以前雙方是不能夠進行通訊的。所以咱們第一次作的時候,對於agent端而言 仍是同樣 咱們先作測試,看能不能正常經過。命令以下:

    puppet agent --server ops-zabbix.blockshine.com --noop --test -v --no-daemonize
      -v 顯示
      --noop 表示dry run ,預演的意思
      --test 表示測試

    輸出結果如圖:

    接下來把--noop 和 --test 選項去掉
    執行後界面卡住以下:

    雖然沒有顯示,實際上它已經生成key和自簽證書請求,並把請求發給master端,等待master端簽發證書。
  • 簽署證書
    打開master端,使用puppet help cert命令查看幫助

    puppet cert <action> [-h|--help] [-V|--version] [-d|--debug] [-v|--verbose] [--digest <digest>] [<host>]
      Action
          list 查看全部待簽署證書
          sign 簽署證書
      puppet  cert list       顯示未簽發的
      puppet  cert list --all 顯示已經簽發和未簽發的
      puppet sign 節點      簽發指定節點
      puppet sign --all   簽發全部

    上面顯示已經完成了爲節點簽署證書,客戶端再次啓動就顯示以下:

    此時agent端的測試已完成就可使用unit file啓動了
    sudo systemctl start puppet.service
  • 總結配置啓動master/agent
    1. 配置master
      # puppet master --no-daemonize -v
      # systemctl start puppetmaster.service
      # systemctl enable puppetmaster.service
      8140/tcp
    2. 配置agent
      # puppet agent --server ops-zabbix.blockshine.com --noop --test -v --no-daemonize
      # puppet agent --server ops-zabbix.blockshine.com -v --no-daemonize
      發送證書請求給master
    3. 在master端爲客戶端簽署證書
      # puppet cert list
      # puppet cert sign node_name
      # puppet cert sign --all
    4. 若是想把某一個節點的證書清楚掉
      服務端 # puppet cert clean node_name
      客戶端 # rm /var/lib/puppet/ssl/* -rf
      而後在從新啓動agent端
    5. 在master端:
      (1)安裝全部要用到的模塊:

      puppet module install
       自建

      (2)定義site manifest:

      /etc/puppet/manifests/site.pp
           node 'NODE_NAME' {
               ... puppet code ...
           }
       例如:
           node 'node3.my.com'{
               include nginx::proxy
           }
           include直接跟類名,由於模塊中的類能夠全局進行直接調用的

      當完成以上配置,而且運行master/agent後,agent每隔30分鐘會想master端索取catelog,但有時候要馬上執行,那麼能夠在master端進行推送,推送命令稍後說。
      其實到這一步驟,基本上就夠咱們使用了,接下來就是一些比較好的實例用法。

  • 站點清單高級定義方式

    site.pp定義節點的方式:
    (1) 以主機名直接給出其相關定義:

    node 'NODE_NAME' {
              節點變量$web_port = 8088
              ... puppet code ...
          }
      (2) 把功能相近的主機事先按統一格式命名,按統一格式調用:
    
          node /^web\d+\.my\.com/ {
              ... puppet code ...
          }
      (3) 假如公司維護的節點有上千個,主機命名要依照 命名規範 進行命名
      假如如今全部節點都須要進行ntp 時間同步,那麼有沒有比較方便的定義方法?這就是定義基節點,然後每個節點去繼承基節點。
    
      node  basenode {
          include ntp
      }
    
      node web.my.com inherits basenode {
          include  nginx::proxy
      }
      當某一模塊被多數主機所共用時,能夠經過定義基節點的方式,讓其餘節點經過繼承的方式獲取這個公共配置。
    
      (4)無論怎麼講,咱們把上千個節點的配置放在site.pp文件中,也顯得臃腫,不方便查找。能夠經過對節點配置進行分段管理。
    
          /etc/puppet/manifests/
              site.pp
                  import "webservers/*.pp"
              webservers/
                  unicom.pp
                  telecom.pp
              cacheservers/
    
              appservers/
      (5) 模塊當中,若是manifest/init.pp 下要定義的類太多的話,也能夠採用分段切割,放在多個文件中,可是在init.pp中要把他們給import 進來,道理和節點分段管理同樣的。

依賴於主機名稱互相通訊

  • DNS
  • 主機名命令規範:
    • 角色-運營商-機房名-IP.管理域名
      web1-unicom-sh-1.1.1.1.magedu.com
      依賴於主機名稱互相通訊

      DNS

      主機名命令規範:
      角色-運營商-機房名-IP.管理域名
      web1-unicom-sh-1.1.1.1.magedu.com

    定義節點:

    node 'NODE_NAME' {
          變量
          聲明類
      }
    
      定義在站點清單:/etc/puppet/manifests/site.pp

    節點名稱定義亦能夠繼承:

    node basenode {
          $dbport = 3306
          include baseserver
      }
    
      node "node2.magedu.com" inherits basenode {
          include nginx
      }
    
      node "node3.magedu.com" inherits basenode {
          $dbport = 3307
          include mysql
      }
    
      目的:爲全部節點應用相同的全局變量,以及完成節點的初始化;
    
      節點定義方式:
          一、每節點單獨定義;
          二、在節點名稱中使用正則表達式;
              node "/node[0-9]+\.magedu\.com/" {
    
              }

    puppet進程的配置文件:puppet.conf
    生成配置:puppet master --genconfig > /etc/puppet/puppet.conf
    puppet agent --genconfig >> /etc/puppet/puppet.conf

    [main], [master], [agent]
    
      瞭解配置文件路徑:puppet doc --configprint confdir

    master端而言:/etc/puppet/manifests/site.pp
    站點清單

    認證配置文件:auth.conf
          應用於puppet的restful風格的API的訪問受權;
    
      名稱空間訪問認證配置文件:namespaceauth.conf
          [puppetmaster]
              allow *.magedu.com
    
      autosign.conf

    配置puppet master支持多種不一樣的環境:

    puppet.conf
          [master]
          environment = development, testing, production
    
          [development]
          manifests = /etc/puppet/manifests/development/site.pp
          modulepath = /etc/puppet/modules/development/:/usr/share/modules/development
          fileserverconfig = /etc/puppet/fileserver.conf.development
    
          [testing]
          manifests = /etc/puppet/manifests/testing/site.pp
          modulepath = /etc/puppet/modules/testing/:/usr/share/modules/testing
          fileserverconfig = /etc/puppet/fileserver.conf.testing
    
          [production]
          manifests = /etc/puppet/manifests/production/site.pp
          modulepath = /etc/puppet/modules/production/:/usr/share/modules/production
          fileserverconfig = /etc/puppet/fileserver.conf.production
    
      puppet agent:
          [agent]
          environment = development

    模塊管理:
    Puppet Forge: puppet維護模塊倉庫,大部分由第三方做者提供

    puppet module
    
          list
          search
          install

    Puppet kick機制:

    緊急推送配置時使用。

    puppet架構擴展:
    單臺master節點可能會出現瓶頸之處:

    認證功能
          文件服務
          網絡
    
      解決思路:單機擴展
    
          Nginx+Mongrel
          Apache+Passenger
          Nginx+Passenger
    
      解決思路:多機擴展

    mcollective

    Foreman

相關文章
相關標籤/搜索