web-dev-qa-db-ja.com

通知と組み合わせると、augeasを使用したPuppet構成が失敗します

次のPuppetマニフェストに問題があります。これは、RHEL-6システムでpasswdqc pamモジュールを有効にすることを目的としています(これはPuppet0.25.5とaugeas0.7.2を使用しています)。

augeas { 'authconfig':
        context => '/files/etc/sysconfig/authconfig',
        changes => [
                'set USEPASSWDQC yes',
                'set USECRACKLIB no',
                ],
        notify  => Exec['authconfig-all'],
}

exec { 'authconfig-all':
        command         => '/usr/sbin/authconfig --updateall',
        refreshonly     => true,
}

このマニフェストを実行すると、正常に完了したように見えます。

info: Applying configuration version '1311189237'
notice: //Augeas[authconfig]/returns: executed successfully
info: //Augeas[authconfig]: Scheduling refresh of Exec[authconfig-all]
notice: //Exec[authconfig-all]: Triggering 'refresh' from 1 dependencies

しかし、ターゲットファイルを調べても、変更は適用されていません。

# egrep 'PASSWDQC|CRACKLIB' /etc/sysconfig/authconfig
USECRACKLIB=yes
USEPASSWDQC=no

マニフェストからnotify => ...行を削除すると、意図したとおりに機能します。つまり、これを考えると:

augeas { 'authconfig':
        context => '/files/etc/sysconfig/authconfig',
        changes => [
                'set USEPASSWDQC yes',
                'set USECRACKLIB no',
                ],
}

変更は正常に保存されます。

# puppet /path/to/manifest.pp
info: Applying configuration version '1311189502'
notice: //Augeas[authconfig]/returns: executed successfully

# egrep 'PASSWDQC|CRACKLIB' /etc/sysconfig/authconfig
USECRACKLIB=no
USEPASSWDQC=yes

ここで何が起こっているのか分かりますか?明らかに、puppetは、変更が最初に行われたと信じていますが、実際にはディスクに保存されていません。 augeasを使用する他の構成があり、正常に機能する操作を通知します。なぜこれが失敗しているのか理解できていません。 augeas操作のnotifyを対応するsubscribe定義のexecに置き換えると、同じ問題が発生することに注意してください。

私の現在の計画は、より新しいバージョンのpuppetとaugeasからパッケージを構築し、問題が魔法のように消えるかどうかを確認することです。

[〜#〜] update [〜#〜]:freiheitは、authconfigがこのファイルを上書きしているように見えることを指摘しています。奇妙なことに、CentOS 5では、/etc/sysconfig/authconfigを変更してからauthconfig --updateallを実行するのが正確に正しい手順でした。これは、従来のキックスタートで実際に使用しているものです。

したがって、明らかにRHEL6のアップグレードにより、authconfigが奇妙で役に立たない方法で動作するようになりました。

7
larsks

答えの一部は、authconfigコマンドの動作がRHEL5とRHEL6の間で変更されたことです。 RHEL6では、reading/etc/sysconfig/authconfigを生成してから構成を生成する代わりに、RHEL6のauthconfigは、管理する個々の構成ファイルを解析してから生成/etc/sysconfig/authconfig現在の状態の記録として。

つまり、(a)authconfigコマンドの実行を回避しようとしている場合、または(b)authconfigコマンドライン。

これは、私がpasswdqcPAMモジュールを有効にすることになったものです。

augeas { 'pam_passwdqc':
    context => '/files/etc/pam.d/system-auth-ac/',
    changes => [
        'rm *[module="pam_cracklib.so"]',
        'ins 9999 before *[type="password"][module="pam_unix.so"]',
        'set 9999/type password',
        'set 9999/control requisite',
        'set 9999/module pam_passwdqc.so',
        'set 9999/argument enforce=everyone',
    ],
    onlyif  => 'match *[module="pam_passwdqc.so"] size == 0',
    notify  => Exec['authconfig-update-all'],
}

exec { 'authconfig-update-all':
    command     => '/usr/sbin/authconfig --updateall',
    refreshonly => true,
}

この答えを読んでいることに気づいたら、これが物事を正しく処理する方法であるかどうかについてのコメントをお待ちしています。私はPuppetを初めて使用するので、物事の仕組みを今でも感じています。

7
larsks

_/usr/sbin/authconfig --updateall_コマンドは/ etc/sysconfig/authconfigに書き込みます-これは単純な「ls-l」で確認できます。 puppet/augeasが行った変更を上書きしています。

私の場合は、必要な基本的な変更を把握し、それらを作成することでこれを処理します。これはすべて_/etc/pam.d/system-auth-ac_にあると思います。それはまた、モジュールへのさまざまなパラメータを制御することを簡単にします。

1
freiheit