módulo puppet do firewalld incapaz de adicionar vários erros de origem: ZONA INVÁLIDA na segunda fonte

1

Temos um módulo de fantoches (v3.6.2 como estamos usando para o Satellite 6)

O módulo funciona como esperado, exceto ao adicionar várias fontes a uma zona. Ele irá adicionar a zona e, em seguida, adicionar um souce, em seguida, erro ao tentar adicionar a segunda fonte para a zona com a mensagem:

INVALID_ZONE: backup

A execução do módulo pela segunda vez adiciona as fontes 2 e 3 com sucesso.

A zona está sendo criada com sucesso e o recarregamento do firewalld está sendo acionado, mas é quase como se não terminasse o recarregamento, pois não vê a zona de "backup" recém-adicionada como válida para a segunda e terceira fontes .

Código do módulo:

class firewalld(
    $enabled = true,
    $package_name = 'firewalld',
    $service_name = 'firewalld',
    $config_dir = '/etc/firewalld',
    $zone_create = [],
    $zone_remove = [],
    $zone_set_default = '',
    $zone_add_source = hiera_hash('firewalld::zone_add_source', { }),
    $zone_add_service = hiera_hash('firewalld::zone_add_service', { }))
{

    if $enabled {
        $service_ensure = 'running'
        $service_enable = true
        $package_ensure = 'present'
        $config_ensure = 'present'
        Package["$package_name"] -> File["$config_dir"]
        File["$config_dir"] -> Service["$service_name"]
    } else {
        $service_ensure = 'stopped'
        $service_enable = false
        $package_ensure = 'absent'
        $config_ensure = 'absent'
        Service["$service_name"] -> File["$config_dir"]
        File["$config_dir"] -> Package["$package_name"]
    }

    package { "$package_name":
        ensure => $package_ensure,
    }

    file { "$config_dir":
        ensure => $config_ensure,
        force  => true,
    }

    service { "$service_name":
        ensure     => $service_ensure,
        enable     => $service_enable,
        hasrestart => true,
        hasstatus  => true,
    }

    exec { 'firewalld_reload':
        onlyif      => 'systemctl -q is-enabled firewalld.service',
        path        => '/bin:/usr/bin:/sbin:/usr/sbin',
        # command     => "systemctl restart firewalld.service",
        command     => "firewall-cmd --reload",
        refreshonly => true,
    }

    define firewalld_zone_create() {
        exec { "firewalld_zone_create_${name}":
            path    => '/bin:/usr/bin:/sbin:/usr/sbin',
            command => "firewall-cmd --permanent --new-zone=${name}",
            unless  => "firewall-cmd --permanent --get-zones | grep -qw ${name}",
            notify  => Exec['firewalld_reload'],
            require => Service['firewalld'],
        }
    }

    define firewalld_zone_add_source($zone, $source) {
        exec { "firewalld_${zone}_add_source_${source}":
            path    => '/bin:/usr/bin:/sbin:/usr/sbin',
            command => "firewall-cmd --permanent --zone=${zone} --add-source=${source}",
            unless  => "firewall-cmd -q --permanent --zone=${zone} --query-source=${source}",
            notify  => Exec['firewalld_reload'],
            require => Service['firewalld'],
        }
    }

    if $enabled {
        firewalld_zone_create{ $zone_create: } -> firewalld_zone_set_default_zone{ $zone_set_default: }
        create_resources('firewalld_zone_add_service', $zone_add_service)
        create_resources('firewalld_zone_add_source', $zone_add_source)
    }
}

Cortei as seções que definem a adição de portas / destinos, etc., pois é bastante longo.

A entrada que estou usando é

class { 'firewalld':
    enabled          => true,
    zone_create      => ['zone1', 'mgmt', 'backup'],
    zone_add_service => {
        '001' => { 'zone' => 'mgmt', 'service' => 'ssh' },
    },
    zone_add_source  => {
        '001' => { 'zone' => 'mgmt', 'source' => 'INT.x.x.x/24' },
        '002' => { 'zone' => 'mgmt', 'source' => 'INT.x.x.x/24' },
        '003' => { 'zone' => 'mgmt', 'source' => 'INT.x.x.0/24' },
        '004' => { 'zone' => 'backup', 'source' => 'IP.1.x.x/24' },
        '005' => { 'zone' => 'backup', 'source' => 'IP.2.x.0/24' },
        '006' => { 'zone' => 'backup', 'source' => 'IP.3.x.0/24' },
    },
    zone_set_default => 'zone1',
}

Eu alterei as sub-redes e nomes de zona para fins de segurança.

Se alguém poderia, por favor, informar sobre o porquê desse comportamento e como resolvê-lo, agradeceria muito.

Nota: Eu tentei um firewall-cmd - reload e um systemctl restart firewalld.service e obtive o mesmo resultado.

Felicidades, Amelia

    
por Amelia 06.09.2016 / 08:56

1 resposta

0

parece que a criação de zonas deve ser feita antes de adicionar fontes, portanto, declare essa dependência como uma referência de recurso:

define firewalld_zone_add_source($zone, $source) {
    exec { "firewalld_${zone}_add_source_${source}":
        path    => '/bin:/usr/bin:/sbin:/usr/sbin',
        command => "firewall-cmd --permanent --zone=${zone} --add-source=${source}",
        unless  => "firewall-cmd -q --permanent --zone=${zone} --query-source=${source}",
        notify  => Exec['firewalld_reload'],
        require => Service['firewalld'],
        require => Exec['firewalld_zone_create_${zone}'], # <- run after zone create
    }
}
    
por 06.09.2016 / 11:54