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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ### 創建自定義的提供者 在上一節,我們創建了一個新的名為 gitrepo 的自定義資源類型并告訴 Puppet 此類型需要攜帶兩個參數,分別為 source 和 path。 然而到目前為止,我們還沒有告訴 Puppet 如何檢出倉庫,即如何創建這種類型的具體實例。 這正是提供者(provider)的用武之地。 正如我們之前看到的,一個類型經常會有幾種可能的提供者。在本例中, 對一個 Git 倉庫進行實例化僅有一種明智的方法,所以我們只需一個提供者:git。 如果你想要擴展這個自定義類型(將其稱之為 repo 而非 gitrepo), 不難想象只要針對不同類型的倉庫創建若干不同的提供者即可,例如:git、svn、cvs 等等。 #### 準備工作 1. 在你的 custom 模塊的 lib/puppet 目錄中, 創建一個名為 provider/gitrepo 的子目錄: ``` # mkdir -p lib/puppet/provider/gitrepo ``` 2. 在 gitrepo 目錄中,使用如下內容創建一個名為 git.rb 的文件: ``` require 'fileutils' Puppet::Type.type(:gitrepo).provide(:git) do commands :git =&gt; "git" def create git "clone", resource[:source], resource[:path] end def exists? File.directory? resource[:path] end end ``` #### 操作步驟 1. 在 Puppet 配置清單中添加如下代碼為新的資源類型 gitrepo 創建一個實例: ``` gitrepo { "https://github.com/puppetlabs/puppet.git": path =&gt; "/tmp/puppet", ensure =&gt; present, } ``` 2. 現在運行 Puppet,你的新類型將被加載并進行了實例化: ``` # puppet agent --test info: Retrieving plugin notice: /File[/var/lib/puppet/lib/puppet]/ensure: created notice: /File[/var/lib/puppet/lib/puppet/provider]/ensure: created notice: /File[/var/lib/puppet/lib/puppet/provider/gitrepo]/ensure: created notice: /File[/var/lib/puppet/lib/puppet/provider/gitrepo/git.rb]/ ensure: defined content as '{md5}a12870d89a4b517e48fe417ce2e12ac2' notice: /File[/var/lib/puppet/lib/puppet/type]/ensure: created notice: /File[/var/lib/puppet/lib/puppet/type/gitrepo.rb]/ensure: defined content as '{md5}90d5809e1d01dc9953464e8d431c9639' info: Loading downloaded plugin /var/lib/puppet/lib/puppet/ provider/gitrepo/git.rb info: Loading downloaded plugin /var/lib/puppet/lib/puppet/type/ gitrepo.rb info: Redefining gitrepo in Puppet::Type info: Caching catalog for cookbook.bitfieldconsulting.com info: Applying configuration version '1299850325' notice: /Stage[main]//Node[cookbook]/Gitrepo[https://github.com/ puppetlabs/puppet.git]/ensure: created notice: Finished catalog run in 74.43 seconds ``` > ![注記](https://box.kancloud.cn/2016-05-12_5733eec619643.png) > 注意:由于 Puppet 的一個錯誤,當你首次創建新類型的實例時,可能需要兩次運行 puppet agent:第一次加載類型的定義,第二次才真正創建實例。 如果你看到如下的信息: > ``` > err: /Stage[main]//Node[cookbook]/Gitrepo[https:// > github.com/puppetlabs/puppet.git]: Could not > evaluate: No ability to determine if gitrepo exists > ``` > 就意味著你正遭遇此錯誤帶來的困擾?—?別急,再次運行 Puppet 即可正常工作。 當你讀到本書的出版物時,這個錯誤很可能已經被修復。 #### 工作原理 首先我們為 gitrepo 類型注冊一個資源類型的提供者: ``` Puppet::Type.type(:gitrepo).provide(:git) do ``` 當你在配置清單中聲明此類型的一個實例時,Puppet 會先檢查是否有已經存在的實例: ``` def exists? File.directory? resource[:path] end ``` Puppet 會調用我們實現的 exists? 方法來做這種檢查。 如果已有一個匹配實例 path 參數的目錄存在,它返回 true。 如果 exists? 返回 true,那么 Puppet 將不會采取進一步的行動, 否則 Puppet 將通過調用 create 方法試圖創建這個資源: ``` def create git "clone", resource[:source], resource[:path] end ``` 在這種情況下,create 方法會執行 git clone ,這會將原始倉庫 (由 source 參數指定)克隆到由 path 參數指定的目錄。 #### 更多用法 你已經看到 Puppet 的自定義類型和提供者的強大之處。 實際上,他們可以做任何事情?—?至少是 Ruby 可以做的任何事情。 如果在你管理的某一部分基礎設施中,使用了復雜的 define 和 exec 資源, 你就應該考慮將它們替換為自定義資源類型。 實際上,在你創建自定義類型之前可以先環顧一下周圍是否已經有人實現了你需要的自定義資源類型。 此處我舉的例子比較簡單,你還有更多有關書寫自定義類型的內容需要學習。 如果你要分發代碼以供他人使用(或者,即使你不分發代碼),在代碼中包含必要的測試是一個好主意。 Puppet Labs 有一些有關開發自定義類型的有用頁面: [http://docs.puppetlabs.com/guides/custom_types.html](http://docs.puppetlabs.com/guides/custom_types.html) 和 [http://projects.puppetlabs.com/projects/1/wiki/Development_Practical_Types](http://projects.puppetlabs.com/projects/1/wiki/Development_Practical_Types) 。 有關如何編寫符合 Puppet Labs 標準的測試信息,請參考 [http://projects.puppetlabs.com/projects/1/wiki/Development_Writing_Tests](http://projects.puppetlabs.com/projects/1/wiki/Development_Writing_Tests) 。 James Turnbull 為自定義類型的開發撰寫了一篇相當不錯的易于遵循的介紹文章 “Creating Puppet types and providers is easy…”,其地址為: [http://www.kartar.net/2010/02/puppet-types-and-providers-are-easy/](http://www.kartar.net/2010/02/puppet-types-and-providers-are-easy/) 。 Dean Wilson 也提供了一個非常有啟發性的例子,用于管理 APT 資源: [https://github.com/deanwilson/puppet-aptsourced](https://github.com/deanwilson/puppet-aptsourced) 。
                  <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>

                              哎呀哎呀视频在线观看