地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【puppet】入門する

背景/概要

puppetを使う機会が出てきたので調べたことのメモを記載。commitログとかみてると結構頻繁に今でも更新されていてちょっとびっくりした。

以下に全てがまとまっている。

www.slideshare.net

puppetとは/特徴とか

github.com

puppetとは構成管理ツールの一つ。Ansibleとかと競合するツール。「クライアント/サーバ構成」でサーバ構成を集中管理できる設定管理ツールで各ノードにはエージェントが必要。Ruby型のDSLが使える。

f:id:ryuichi1208:20210708224246p:plain

ドキュメントとかは以下

www.puppetcookbook.com

ターゲットシステム (またはノード) 上で実行される 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だとなくて出る。

puppet hieraとは何か · GitHub

contain

Containment | Puppet

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 hieraとは何か · GitHub

まとめ/感想

参考

作業手順書はもういらない! Puppetにおける自動化の定義書「マニフェスト」の書き方と基礎文法まとめ:新人インフラ技術者のためのサーバー構築/運用自動化入門(4)(1/5 ページ) - @IT