Назад | Перейти на главную страницу

Зависимость от ресурса, только если он существует в Puppet

У меня есть класс для включения брандмауэра на узлах (с использованием ufw в Ubuntu):

class ufw {
  package { ["ufw"]:
    ensure => latest
  }

  exec { "enable-firewall":
    command => "/usr/bin/yes | /usr/sbin/ufw enable",
    unless => "/usr/sbin/ufw status | grep \"Status: active\"",
    require => [Package["ufw"]]
  }
}

Это нормально работает. На узлах, куда я включаю этот класс, включен межсетевой экран.

Затем у меня есть еще один класс для включения OpenSSH:

class openssh {
  package { "openssh-server":
    ensure => latest
  }

  service { ssh:
    enable => true,
    ensure => running,
    require => [Package["openssh-server"]]
  }

  exec { "allow-openssh":
    command => "/usr/sbin/ufw allow OpenSSH",
    unless => "/usr/sbin/ufw status | grep \"OpenSSH.*ALLOW.*Anywhere\\|Status: inactive\"",
    require => [Package["ufw"], Exec["enable-firewall"]]
  }
}

Как видите, он не только включает OpenSSH, но и открывает для него брандмауэр. Проблема в том, что OpenSSH используется на сервере, на котором нет брандмауэра. Я получаю:

предупреждение: не удалось создать экземпляр конфигурации: не удалось найти пакет зависимостей [ufw] для Exec [allow-openssh] в /etc/puppet/manifests/classes/openssh.pp:19; с использованием кэшированного каталога

Есть ли способ потребовать ресурс, чтобы он казнен во-первых, но если его нет, просто удалить текущий ресурс все вместе?

Я бы сделал отдельный класс в том же манифесте:

class openssh::ufw {
  exec { "allow-openssh":
    command => "/usr/sbin/ufw allow OpenSSH",
    unless => "/usr/sbin/ufw status | grep \"OpenSSH.*ALLOW.*Anywhere\\|Status: inactive\"",
    require => [Package["ufw"], Exec["enable-firewall"], Package["openssh-server"], Service["ssh"]]
  }
}

который вы должны включить либо когда есть ssh и ufw, либо всегда, и он должен работать, когда ufw отсутствует, но оставляет class openssh работает.