Puppetマニフェスト(Sendmail→Postfix入替え)

Sendmailをアンインストールして、Postfixの最新版をインストールするマニフェスト。
Sendmailのアンインストール部分でハマったのでメモ。


ハマって試行錯誤した部分は後述するとして、

完成品のマニフェスト

# Postfixのインストール
package { 'postfix':
        ensure => latest,
        }


# Sendmailのアンインストール
package { 'sendmail':
        ensure => purged,
        }


# Postfixの自動起動設定
service {'postfix':
        name => 'postfix',
        enable => 'true',
        ensure => running,
        require => Package['postfix'],
        }


# Sendmailを削除してPostfixしかMTAがないけど一応alternativesコマンドで設定しておく
exec { 'alternativesmta':
        path => ['/usr/bin', '/usr/sbin'],
        command => 'alternatives --set mta /usr/sbin/sendmail.postfix',
        require => Package['postfix'],
        }


# /etc/postfix/main.cfのテンプレートファイル配布
file { '/etc/postfix/main.cf':
       content  => template('/etc/puppet/manifests/templates/etc/postfix/main.cf'),
       owner => 'root',
       group => 'root',
       mode => 644,
       notify  => Service['postfix'],
       }


ハマった部分

ハマった部分はSendmailをアンインストールする↓この部分(これだと想定通りアンインストールされました。)

# Sendmailのアンインストール
package { 'sendmail':
        ensure => purged,
        }



当初はensureを以下のようにabsentにしていました。(これだと想定通りアンインストールされませんでした。)

# Sendmailのアンインストール
package { 'sendmail':
        ensure => absent,
        }


調べた

何でかなと思い、調べました。
pakageリソースタイプのensureに指定出来るパラメータは
absentしか知らなかったのですが、↓を参照してpurgedがあることを発見!
http://www.puppetcookbook.com/posts/remove-package.html

# remove a package but leave its config files alone
package { "screen":
    ensure => "absent"
}

# remove a package and purge its config files
package { "screen":
    ensure => "purged"
}

Removing a package via Puppet is as simple as installing one.
Simply setting “ensure” to “absent” will remove the package.
If your platforms package provider supports purging packages (you can check in the table under packages then you can specify “Purged” as a value and it should remove the config files along with the package.


absentとpurgedの違いは何だろうと思ったら、
どうも設定ファイルが含まれるパッケージの場合、purgedを指定しないとパッケージはアンインストールされないっぽい。(っぽいっていうかされませんでした。)


まとめるとこんな感じか?

設定ファイル有り 設定ファイル無し
absent アンインストールされない アンインストールされる
purged アンインストールされる アンインストールされる

試しに設定ファイルの無い単体のパッケージにensureにpurgedを指定したマニフェストを適用してみたらアンインストールされました。


なので、パッケージをアンインストールするマニフェストを作成する時は、
packageのensureはpurgedにしておくと間違いないっぽいです。