背景/概要
puppetを使う機会が出てきたので調べたことのメモを記載。commitログとかみてると結構頻繁に今でも更新されていてちょっとびっくりした。
以下に全てがまとまっている。
puppetとは/特徴とか
puppetとは構成管理ツールの一つ。Ansibleとかと競合するツール。「クライアント/サーバ構成」でサーバ構成を集中管理できる設定管理ツールで各ノードにはエージェントが必要。Ruby型のDSLが使える。
ドキュメントとかは以下
ターゲットシステム (またはノード) 上で実行される Puppet デーモンは、Puppet エージェントと呼ばれる。エージェントは構成の更新がないかどうかマスターをポーリングする。この辺がAnsible使っていると理解しづらい点かなと思う。
Ansibleとの比較
一番気になるのがやはりpull型という点。plus/consあると思うけど実際使ってから感じていく。
tool | Push/Pull | 開発元 | 実装言語 |
---|---|---|---|
Ansible | Push | RedHat | Python |
Puppet | Pull | Puppet Labs | Ruby |
環境構築
master/agetnそれぞれの手順
master
$ yum -y install https://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpm $ sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/puppetlabs.repo $ yum --enablerepo=puppetlabs-products,puppetlabs-deps -y install puppet-server
agent
$ yum -y install https://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpm $ sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/puppetlabs.repo $ yum --enablerepo=puppetlabs-products,puppetlabs-deps -y install puppet $ puppet agent --test --ca_server=192.168.1.15 $ systemctl start puppet
ハンズオン?
hello worldする
master1台あればできるhello world。noticeはdebug message的な使い方をするらしいので必須。
[root@master manifests]# cat hello.pp notice("Hello, World!") [root@master manifests]# puppet apply hello.pp Notice: Scope(Class[main]): Hello, World! Notice: Compiled catalog for master in environment production in 0.12 seconds Notice: Finished catalog run in 0.01 seconds
グループ/ユーザ追加
group { "developer" : ensure => "present", gid => "1101", } user { "developer01" : ensure => "present", uid => "1101", gid => "developer", home => "/home/developer01", managehome => "true", shell => "/bin/bash", password => '$6$aqc3cun1$QpzeHomBlMEcKmCOkeDa9VItfbzi4R.NTyLm7r7ak6Mc9oxtQSzBlfgFtvQcvBNkr/OEZMXXu6XegP1g/p67O1', expiry => "2016-12-31", }
nodeを指定してパッケージを追加
node 'slave' { package {['ypbind.x86_64']: ensure => 'present', } }
即時反映させたい
puppet-agentを再起動させれば即読み込む。
puppetで使える関数を知りたい
facterで見れる。
推奨ディレクトリで進める
Puppetのmoduleのmanifestsのマニフェスト構成の基本ディレクトリなるものがあるらしいのでそちらを試す。
[root@master puppet]# tree -L 1 . ├── auth.conf ├── environments ├── fileserver.conf ├── manifests // modues配下を読み行く ├── modules // ここに実際に行いたい操作を書いたファイルを置く └── puppet.conf 3 directories, 3 files
またモジュール内には以下のファイルが置かれるのがデファクトらしい。
- params.pp -> そのmodule内で使われる変数、default値の定義
- init.pp -> 同一モジュール内のその他classの適用順序関係を記載
- user.pp -> このmoduleでインストールするソフトウェアが必要とするアカウント情報(userやgroup)の定義
- install.pp -> moduleに必要なパッケージインストールのためのResourceの定義
- config.pp -> ソフトウェアのセットアップに必要となる設定ファイルの配備、ディレクトリの作成等のためのResourceの定義
- service.pp -> Moduleの含むデーモン(apache, mysql-server等)のservice Resourceの定義
以下のディレクトリ構成でモジュールを作成してみる
$ tree modules/ modules/ └── useradd └── manifests └── init.pp
モジュール配下を呼び出すには以下のような記述をmanifest配下にファイルに対して行う。
node 'slave' { package {['ypbind.x86_64']: ensure => 'present', } class {'useradd': } }
init.ppから他classを呼び出すことも可能だが単体で呼び出すことも可能。node指定とかで複雑になるくらいならこっちで読みやすくしても良さそうだろうか?(運用したことないので不明)
cat params.pp class useradd::params ( $uid = '50', ) { group { "developer3" : ensure => "present", gid => "1103", } }
「Warning: Config file /etc/puppet/hiera.yaml not found, using Hiera defaults」
$ ln -s /etc/hiera.yaml /etc/puppet/hiera.yaml
デフォルト値が設定されたyamlを読み込めていない場合に出る文言らしい。CentOS6とかではデフォルトで入っていたが7だとなくて出る。
contain
include
DSLに触れる
マニフェスト内では、変数の利用が可能で変数名は「$」で始まる文字列で指定する
# httpdパッケージをインストール package { “httpd”: provider => “yum”, ensure => “installed” } # httpdサービスを起動する service { “httpd”: name => “httpd”, ensure => running, require => Package[“httpd”] } # /var/www/testディレクトリを作成する file { “/var/www/test”: ensure => directory, owner => “root”, group => “root”, require => Package[“httpd”] } # httpd用の設定ファイルを作成する file { “/etc/httpd/conf.d/mysite.conf” : content => ” NameVirtualHost *:8000 <VirtualHost *:8000> ServerName $hostname DocumentRoot /var/www/test ErrorLog logs/test-error_log CustomLog logs/test-access_log common </VirtualHost>”, mode => “0644”, owner => “root”, group => “root”, subscribe => Service[“httpd”] }
使えそうなコマンド
# 適用させる $ puppet apply /etc/puppet/manifests/site.pp # モジュールをインストールする $ puppet module install puppetlabs/mysql
Hieraとは
Hieraはkey/value型(yaml, json)の設定データ検索ツール。 ノードごとの設定値をHieraに記述することで、マニフェストからノード固有設定を分離する。
まとめ/感想
参考
作業手順書はもういらない! Puppetにおける自動化の定義書「マニフェスト」の書き方と基礎文法まとめ:新人インフラ技術者のためのサーバー構築/運用自動化入門(4)(1/5 ページ) - @IT