Puppet은 공백을 무시하지 않습니다.

Puppet은 공백을 무시하지 않습니다.

다음에 표시되거나 표시되지 않을 수 있는 항목이 있습니다 /etc/rsyslog.conf.

# Added for Kiwi
*.err;*.emerg;*.alert;*.warning;*.debug;*.notice;*.crit;*.info          @10.19.24.50

이러한 서버 중 일부는 이를 수동으로 입력하기 때문에 공백이 균일하다고 가정할 수 없습니다(그리고 내가 찾은 최소 두 개의 서버에 따라 다릅니다). 이 줄을 제거하기 위해 꼭두각시 모듈을 작성하려고 합니다.

이 모듈의 관련 부분:

  file_line {'remove_kiwi_comment':

    ensure => absent,
    path   => $confFile,
    match  => "^#.*Kiwi$",
    line   => "# Added for Kiwi",
    match_for_absence => true,

  }

  file_line {'remove_kiwi_forward2':

    ensure => absent,
    match_for_absence => true,
    path   => $confFile,
    match  => '^.*50$',
    line   => '*.err;*.emerg;*.alert;*.warning;*.debug;*.notice;*.crit;*.info @10.19.24.50',
    notify => Service[$serviceName],

  }

위 코드는 DEV 서버 중 하나에서 주석을 성공적으로 제거했지만 실제 리디렉션은 제거되지 않은 것으로 보입니다. 나는 성공하지 못한 채 정규식을 사용해 보았지만 match=>줄을 삭제하기 위해 무엇을 시도할 수 있는지 잘 모르겠습니다. 충분한 공간을 추가하면 제거되지만 모듈이 공간을 차지하지 않고 rsyslog.

Stdlib 모듈 버전은 4.11, 마스터는 3.3, 이 서버의 클라이언트 노드는 3.6입니다.

답변1

file_line유형에는 귀하에게 적합한 이후 옵션이 있습니다. 유일한 문제는 댓글을 달기 전에 규칙을 삭제했는지 확인해야 한다는 것입니다.

file_line {'remove_kiwi_comment':
    ensure => absent,
    path   => $confFile,
    match  => '^#.*Kiwi$',
    line   => '# Added for Kiwi',
    match_for_absence => true,
}

file_line {'remove_kiwi_forward2':
    ensure => absent,
    path   => $confFile,
    line   => '# Added for Kiwi',
    after  => '^#.*Kiwi$',
    before => File_line['remove_kiwi_comment'],
    notify => Service[$serviceName],
}

주석이 파일에 있다는 것을 믿을 수 없다면 제가 생각할 수 있는 가장 간단한 해결책은 execwith 를 사용하는 것입니다 sed.

exec { 'remove-kiwi-rsyslog-line-with-sed':
    command => "sed -i '/@10\.19\.24\.50$/d' $confFile",
    path    => '/usr/bin:/bin',
    onlyif  => "grep -q '@10.19.24.50$' $confFile",
}

exec는 파일에 IP 주소 10.19.24.50이 포함된 경우에만 실행됩니다.

답변2

리디렉션 회선을 제거하려면 다음을 사용해 보십시오.

file_line {'remove_kiwi_forward2':

    보장 => 결석,
    match_for_absence => 사실,
    경로 => $conf파일,
    일치 => '^.*50$',
    line => '\*.err;\*.emerg;\*.alert;\*.warning;\*.debug;\*.notice;\*.crit;\*.info.*@10.19.24.50' ,
    알림=>서비스[$serviceName],
}

답변3

더 많은 조사를 한 후에 나는 이것이 file_line비침해적인 프로필 관리에 대한 최선의 노력이라는 것을 알았습니다. 나와 비슷한 불만을 갖고 있는 사람들이 많이 있다. file_line읽기 쉬운 인형을 원할 때 인형 모듈을 사용하는 것이 일반적이지만, 문제의 첫 징후가 나타나면 포기하고 다른 모든 용도로 Augeas를 사용하기 시작하는 것 같습니다.

내 임시 인형 모듈의 최종 버전:

class kiwiprep {

  if ($::syslogng == "ABSENT"){

    case $::operatingsystemmajrelease {

      /^5/: {

        $serviceName="syslog"
        $confFile="/etc/syslog.conf"

      }

      /^(6|7)/: {

        $serviceName="rsyslog"
        $confFile="/etc/rsyslog.conf"

      }

      default:{
        fail("Platform Not Supported")
      }

    }

    service {$serviceName:
      ensure => running,
      enable => true,
    }

    file_line {'remove_kiwi_comment':

      ensure => absent,
      path   => $confFile,
      match  => "^#.*Kiwi$",
      line   => "# Added for Kiwi",
      match_for_absence => true,

    }

    augeas {"kiwi forwarder 1":
      context => "/files$confFile",
      changes => ["rm *[descendant::hostname = '10.19.24.50']"],
    }

    augeas {"kiwi forwarder 2":
      context => "/files$confFile",
      changes => ["rm *[descendant::hostname = '10.18.104.50']"],
    }


  }

}

(이것은 RHEL에만 해당되며 SUSE 또는 Debian에 맞게 변경해야 합니다.)

보시다시피 내 최종 모듈에는 file_line주석이 유지되는데 이는 나에게 잘 작동합니다. 그런 다음 값이 내 전달자 중 하나와 동일한 하위 항목이 있는 최상위 개체를 삭제하는 작업으로 되돌아갑니다 augeas. hostname이 모듈은 환경을 정리할 때 완벽하게 작동합니다. file_line이제 기존 응답기를 정리했으므로 돌아가서 새 응답기를 제자리에 추가하겠습니다.

관련 정보