8

私が行ったローカルPuppetのインストールがあります:

# puppet module install puppetlabs/apt  
Preparing to install into /etc/puppet/modules ...            
Downloading from http://forge.puppetlabs.com ...             
Installing -- do not interrupt ...                           
/etc/puppet/modules                                          
└─┬ puppetlabs-apt (v1.1.0)                                  
  └── puppetlabs-stdlib (v3.2.0)                             

私はまた、nodes.pp私が適用したい次のものを持っています:

node default {                                                              
    include stdlib                                                      

    class {'apt':
            always_apt_update => true,
            disable_keys => true,
            stage => 'setup'
    }
    ->
    apt::source { "cassandra":
            location => "http://debian.datastax.com/community",
            release => "stable",
            repos => "main",
            key => "B999A372",
            key_source => "http://debian.datastax.com/debian/repo_key", 
            include_src => false
    }
}

適用しようとすると、次のようになります。

# puppet apply nodes.pp
err: Could not apply complete catalog: Found 1 dependency cycle:
(Anchor[apt::key B999A372 present] => Apt::Key[Add key: B999A372 from Apt::Source cassandra] => File[cassandra.list] => Exec[apt_update] => Class[Apt::Update] => Stage[setup] => Stage[main] => Class[Main] => Node[default] => Apt::Source[cassandra] => File[cassandra.list])
Try the '--graph' option and opening the resulting '.dot' file in OmniGraffle or GraphViz
notice: Finished catalog run in 0.12 seconds

問題はstage => 'setup'パラメータにあるようですが、何が起こっているのか、この問題を解決するために何ができるのかを理解したいと思います(私は大きなパペットコードベースを継承しています-上記は概念実証にすぎません- stagePuppetの内部動作がうまく機能しないため、まだ削除したくありません)。

アップデート#1

apt::source次のように、ステップをsetupステージに移動してみました。

class cassandra {
     apt::source { "cassandra":                                               
        location => "http://debian.datastax.com/community",              
        release => "stable",                                             
        repos => "main",                                                 
        key => "B999A372",                                               
        key_source => "http://debian.datastax.com/debian/repo_key",      
        include_src => false                                             
    }                                                                        
}                                                                           

node default {                                                               
    include stdlib                                                           

    class {'apt':                                                            
        always_apt_update => true,                                       
        disable_keys => true,
        stage => setup
    }                                                                        
    ->                                                                       
    class {'cassandra': stage => setup}
}

ただし、これは問題を解決するものではなく、別の依存関係サイクルを生成するだけです。

err: Could not apply complete catalog: Found 1 dependency cycle:
(Anchor[apt::key B999A372 present] => Apt::Key[Add key: B999A372 from Apt::Source cassandra] => File[cassandra.list] => Exec[apt_update] => Class[Apt::Update] => Anchor[apt::update] => Class[Apt] => Class[Cassandra] => Apt::Source[cassandra] => File[cassandra.list])

ここに完全なデバッグ出力。依存関係グラフはこれ

->したがって、(演算子を介して)「自然な」方法で操作の順序を強制しようとすると、この奇妙な依存関係のサイクルにつながるように思われます。

4

1 に答える 1

3

基本的に、 apt::source がキーを指定しているようです。apt::key の apt::source 宣言は、ファイル cassandra.list を追加する前に apt::key を処理する必要があることを示しています。これは理にかなっていますよね?

ただし、cassandra ファイル リソースには、apt::update に存在する Exec['apt_update'] の通知があります。これは refreshonly パッケージであり、cassandra ファイル リソースが実行されて通知されることによってのみトリガーされます。

その Exec['apt_update'] は apt::update 内にあるため、Class['apt::update'] が処理済みと見なされるように処理する必要があります。

ここで、実際の問題は apt 宣言から発生します。メタパラメータ stage => 'setup' で apt (apt モジュールの init マニフェスト) を宣言しました。apt には実際には apt::update が含まれていることがわかりますが、これは問題ありませんが、クラス apt::updateを必要とするアンカー 'apt::update' も定義しています。apt が apt::update に依存しているため、セットアップ段階からも apt::update に暗黙的に依存しています。

メイン ステージはセットアップ ステージに依存し、ステージが指定されていないものはすべて自動的にメイン ステージを選択します。したがって、File['cassandra.list'] もメイン ステージ リソースです (ただし、apt::update の前に発生する必要があります)。暗黙的にセットアップ ステージ リソース!)

特にアンカーの場合は、非常に複雑に思えるかもしれません。

于 2013-03-20T02:06:56.877 に答える