2013-03-13 33 views
7

Tôi có một cài đặt Múa rối địa phương mà tôi đã thực hiện:Múa rối vấn đề với apt :: nguồn và giai đoạn

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

Tôi cũng có nodes.pp sau mà tôi muốn áp dụng:

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

Khi tôi cố gắng áp dụng nó, tôi nhận được:

# 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 

Vấn đề dường như nằm trong tham số stage => 'setup', nhưng tôi muốn muốn hiểu điều gì đang xảy ra và tôi có thể làm gì để giải quyết vấn đề này (tôi đã thừa kế một con rối mã nguồn lớn - ở trên chỉ là bằng chứng về khái niệm - sử dụng điều stage và tôi không muốn xóa nó đi , vì tôi không nhận được hoạt động bên trong của Puppet rất tốt).

Update # 1

Cố gắng di chuyển bước apt::source đến giai đoạn setup, như thế này:

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

Tuy nhiên, điều này không giải quyết vấn đề, chỉ cần tạo ra một chu kỳ phụ thuộc.

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

Full debug đầu ra here. Biểu đồ phụ thuộc là this

Vì vậy, có vẻ như tôi đang cố gắng thực thi thứ tự hoạt động theo cách "tự nhiên" (thông qua toán tử ->) dẫn đến chu kỳ phụ thuộc lạ này.

Trả lời

3

Về cơ bản có vẻ như nguồn apt :: của bạn chỉ định khóa. Khai báo nguồn apt :: của khóa apt :: nói rằng khóa apt :: cần được xử lý trước khi tệp cassandra.list được thêm vào. Điều này có ý nghĩa đúng không?

Nhưng sau đó tài nguyên tệp cassandra có thông báo cho Exec ['apt_update'], tồn tại trong apt :: update. Đó là một gói refreshonly và chỉ được kích hoạt bởi tài nguyên tập tin cassandra đang được thực hiện và thông báo cho nó.

Exec ['apt_update'] này nằm trong apt :: update, do đó cần được xử lý cho Class ['apt :: update'] để được xử lý.

Bây giờ vấn đề thực tế xảy ra từ khai báo apt. Bạn đã khai báo apt (init manifest của module apt) với metaparameter stage => 'setup'. Bạn sẽ thấy apt thực sự bao gồm apt :: update, điều này là tốt - nhưng nó cũng định nghĩa một anchor 'apt :: update' mà yêu cầu lớp apt :: update. Bởi vì sự phụ thuộc của apt vào apt :: update bây giờ chúng ta có một sự phụ thuộc ngầm trên apt :: update từ giai đoạn cài đặt. Giai đoạn chính phụ thuộc vào giai đoạn thiết lập và bất cứ điều gì không được đưa ra một giai đoạn tự động chọn lên giai đoạn chính - do đó File ['cassandra.list'] là một tài nguyên giai đoạn chính quá (nhưng cần phải xảy ra trước khi apt: : cập nhật rõ ràng là tài nguyên giai đoạn thiết lập!)

Tôi hy vọng điều đó có vẻ khá phức tạp - đặc biệt là với các neo.

+0

Những gì bạn đang nói có ý nghĩa, do đó tôi đã cố gắng chuyển 'apt :: source' sang giai đoạn' setup', nhưng điều đó không hoạt động tốt lắm (xem bản chỉnh sửa tôi đã thực hiện) – Unknown

+0

. bounty như câu trả lời giải thích khá nhiều những gì đang xảy ra .. – Unknown

+1

Nhưng không có đề nghị thực tế cho một sửa chữa? –

Các vấn đề liên quan