簡體   English   中英

在另一個類中通知資源時解決p中的循環依賴性

[英]resolving cyclic dependency in puppet when notifying resource in another class

我編寫了一個apache類,該類安裝apache2並配置ssl,然后啟動apache服務。 我正在編寫一個子類,它將配置一台虛擬主機,然后重新啟動apache服務。 添加虛擬主機后,我試圖通知apache2服務時,出現循環依賴項錯誤。

我通過更改require包括解決了此錯誤,但這是否意味着apache類中的資源將在apache :: no之前運行?

如果不是,那么解決此依賴性錯誤的方法是什么?

通知另一類的資源是否是一個好習慣?

Error: Failed to apply catalog: Found 1 dependency cycle:
(Exec[no] => Service[apache2] => Class[Apache] => Class[Apache::No] => Exec[no])
Try the '--graph' option and opening the resulting '.dot' file in OmniGraffle or GraphViz

apache.pp

class apache {

    $listen_port="8181"
    $no_port="4143"
    #file { '/etc/apache2/ports.conf' :
        #ensure => present ,
        #content => template("apache/ports.conf.erb"),
        #require => Package['apache2'],
        #notify => Service['apache2'],
    #}->
    case $facts['osfamily'] {
    /^(Debian|Ubuntu)$/: {
    file { '/etc/apache2/sites-available/000-default.conf' :
        ensure => present ,
        content => template("apache/000-default.conf.erb"),
        require => Package['apache2'],
        notify => Service['apache2'],
        noop => true,
    }
    file { '/etc/apache2/sites-available/default-ssl.conf':
        ensure => present ,
        content => template("apache/default-ssl.conf.erb"),
        require => Package['apache2'],
        notify => Service['apache2'],
        #noop => true,
    }
    file { ['/etc','/etc/apache2','/etc/apache2/ssl'] :
        ensure => directory,
        require => Package['apache2'],
    }
    package { 'apache2' :
        ensure => latest,
        notify => Exec['ssl']
    } ->
    augeas { 'no' :
        context => "/files/etc/apache2/ports.conf",
        changes => [
                       "set /files/etc/apache2/sites-available/default-ssl.conf/IfModule/VirtualHost/directive[2]/arg localhost",
                       "set /files/etc/apache2/sites-available/default-ssl.conf/IfModule/VirtualHost/directive[8]/arg /etc/apache2/ssl/apache.key",
                       "set /files/etc/apache2/sites-available/default-ssl.conf/IfModule/VirtualHost/directive[7]/arg /etc/apache2/ssl/apache.crt",
                       "set /files/etc/apache2/ports.conf/IfModule[2]/directive/arg $$no_port",
                       "set /files/etc/apache2/ports.conf/IfModule[1]/directive/arg $no_port",
                       "set /files/etc/apache2/ports.conf/directive/arg 8181",
                       "set /files/etc/apache2/sites-available/000-default.conf/VirtualHost/arg *:8181",
                       "set /files/etc/apache2/sites-available/default-ssl.conf/IfModule/VirtualHost/arg *:$no_port",
                   ],
        require => Package['apache2'],
    } ->
    service { 'apache2' :
        ensure => running
    }
    package { 'openssl' :
        ensure => latest
    } ->
    exec { 'ssl' :
        path => ["/usr/local/sbin","/usr/local/bin","/usr/sbin","/usr/bin","/sbin","/bin"],
        command => 'openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt -subj "/C=GB/ST=London/L=London/O=Global Security/OU=IT Department/CN=example.com" ; a2enmod ssl ; a2ensite default-ssl ',
        notify => Service['apache2'],
        require => Augeas['no'],
        refreshonly => true,
    }
    }
}

no.pp

class apache::no {

      require ::apache
      $listen_port="8181"
      file { 'no' :
          ensure => present,
          path => '/etc/apache2/sites-available/no.conf',
          content => template("apache/no.conf.erb"),
          notify => Exec['no'],
      }
      Exec { 'no' :
           path => ["/usr/local/sbin","/usr/local/bin","/sbin","/bin","/usr/sbin","/usr/bin","/root/bin"],
           command => 'a2ensite no.conf',
           notify => Service['apache2'],
           refreshonly => true,
      }
      #Service { 'apache2' :
          #ensure => running,
      #}
}

謝謝

您的代碼確實不一致。 通過...

require ::apache

...它堅持要求通過類::apache管理的所有事物都必須在當前類中聲明的任何事物之前進行管理,但是...

Exec { 'no' :
   # ...
   notify => Service['apache2'],
   # ...
}

...要求Exec['no']Service['apache2']之前進行管理,該Service['apache2']由類::apache2管理。 您不能同時擁有這兩種方式。

問題來自混合抽象級別。 在一個地方,您表示與整個班級的關系,而在其他地方,您表示與該班級的一部分的關系。 解決此問題的基本方法有兩種:要么建立單獨的類大小的塊來聲明單獨的關系,要么直接與相關資源(在這種情況下為PackageService )建立所有需要的關系。 后者是可以接受的,因為您在同一個模塊中工作,但是即使這樣,前者也可能更好。 它可能看起來像這樣:

class apache {
  # declare variables ...
  include '::apache::software'
  include '::apache::config'
  include '::apache::service'

  Class['::apache::software'] -> Class['::apache::config']
  Class['::apache::config']   ~> Class['::apache::service']
}

# ... class apache::software manages ensuring the package is installed
# ... class apache::config manages the configuration file
# ... class apache::service manages the httpd service

class apache::no {
    require 'apache::config'
    # ...
  Exec { 'no' :
    # ...
    notify => Class['apache::service']
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM