いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.212 / 読者数:1983名

こんばんは、うすだです。

突然ですが、ロジカルシンキングに心を奪われています。

きっかけは、社長からの社員向けのお話(というかプレゼン)でした。
ダメな例(ロジカルじゃない例)を聞いて、ハンマーで殴られたような衝撃を受けました。

思えば、この41年間、 ロジカルにシンキングしてなにか成し遂げたことがあっただろうか、 と考えますと、おそらくなかったと思います。

だいたいの場合、感情や感触などが先行して、 えいやーで決めてしまっていたように思います。
そういった感覚も大切だとは思いますが、ロジカルでなく決断して失敗をしたことも、 過去にたくさんあったはずです。

というわけで、入門編的な本をこの土日でもりもりと読破し、 いま抱えている問題についてロジカルに考えるぞ! …と意気込んでおります。

しかし、この土日は、ほぼ白紙状態の原稿を仕上げなければなりません。
当メルマガのお題もまだ決まっていません。
そして、そんなときに限って、余計なことをしています。

まず、計画的かつ集中してやるべきことをこなすにはどうすればよいか、 ロジカルに考えるのか、それとも、まずやるべきことをやってしまうべきなのか、 ニワトリが先かタマゴが先か、悩んでおります…。

ロジカルに考えられないまま、まずはこちらをはりきってまいります。

今回のお題 - 繰り返し的な処理を自動化する

サーバの管理をしていますと、 ある決まった処理を繰り返し行わなければならないケースに、よく遭遇します。

それが2〜3個程度であれば、手で繰り返し行っても、間違うことはさほどないと思います。

ですが、5個とか10個とか、微妙な数の場合、 1回くらいは間違える可能性が生じます。
また、100個とか1000個とかのオーダーになってきますと、 手で繰り返し行うには非現実的になってしまいます。

というわけで今回は、繰り返し実行する処理を自動化してみます。
とはいえ、決まった方法があるわけではありません。ですので、 いくつかのケースをご紹介して、お茶を濁…いえ、今後に役立ててくださいませ。

あるグループに所属するユーザの洗い出し

とあるグループに属しているユーザの一覧を確認したいとしましょう。

その場合、主グループがそのグループであるユーザと、 主グループは別で補助グループにそのグループを指定しているユーザが、該当します。

具体的には、前者は、 /etc/passwd ファイルのグループIDがそのグループであるユーザが、 そのグループに属していると言えます。

ということを確認するスクリプトを、こさえてみました。

#!/bin/sh

# 引数の確認
if [ $# -ne 1 ]; then
    echo "Usage: $0 group"
    exit 1
fi

# /etc/group から該当する行を抜き出す
ENTRY=`grep -e "^$1:" /etc/group | tr : " "`
if [ -z "$ENTRY" ]; then
    echo "$1: unknown group"
    exit 2
fi

# グループIDと、そのグループに属するユーザを取り出す
GID=`echo $ENTRY | awk '{print $3}'`
USERS=`echo $ENTRY | awk '{print $4}'`

# 主グループがそのグループのユーザを取り出す
while IFS=: read name pass uid gid gecos dir shell; do
    [ "$gid" = "$GID" ] && USERS="${USERS},$name"
done < /etc/passwd

# 結果の表示
echo "gid=$GID users=`echo $USERS | sed 's/^,*\([^,].*[^,]\),*$/\1/'`"

引数にグループ名を指定すると、そのグループのIDと、属するユーザ一覧を出力します。

処理を簡単に説明しますと、以下のようになります。

最初に引数をチェックした後、次のブロックでは、 /etc/group からそのグループの行を抜き出し、: をスペースに置き換えて、 結果を変数ENTRYに格納しています。
その次のブロックでは、その中からIDとユーザ一覧を取り出し、 それぞれ変数GID, USERS に格納しています。
さらにその次は、/etc/passwd から、主グループがそのグループのユーザを取り出し、 変数USERS に追加しています。
最後に、結果を出力して、めでたしめでたし…となっております。

これを、groupinfo.sh という名前で保存し、実行可能にして実行しますと、 以下のような結果が得られます。

  $ chmod +x groupinfo.sh
  $ ./groupinfo.sh www-data
  gid=33 users=tange,kenmochi,yanagi,www-data,okamoto,akutagawa

グループIDが33のひとは、こんな感じです。
ですので、上記の結果は正しいと言ってよいと思います。

  $ grep :33: /etc/passwd /etc/group
  /etc/passwd:www-data:x:33:33:www-data:/var/www:/bin/sh
  /etc/passwd:okamoto:x:1004:33::/home/okamoto:/bin/bash
  /etc/passwd:akutagawa:x:1007:33::/home/akutagawa:/bin/bash
  /etc/group:www-data:x:33:tange,kenmochi,yanagi

ちなみに、存在しないグループを指定すると、エラーになります。

  $ ./groupinfo.sh bauhaus
  bauhaus: unknown group

DNSのゾーン設定の追加

次に、いくつかのゾーンの情報をDNSに追加したいとしましょう。
しかも、ネットワークはみなクラスCで、以下のような、 似たような内容で登録したいとします。

  $TTL 86400
  @     IN SOA ns.ドメイン名 root.ドメイン名 (
        2011120400 ; serial
        3600       ; refresh
        1800       ; retry
        604800     ; expire
        86400      ; min
  )
        IN NS ns1.ドメイン名
        IN NS ns2.ドメイン名
  ns1   IN A ネットワークアドレス.1
  ns2   IN A ネットワークアドレス.2
  ftp   IN A ネットワークアドレス.21
  www   IN A ネットワークアドレス.80

上記の「ネットワークアドレス」のところは、たとえば「192.168.1」のような、 アドレスのネットワーク部だけを指定します。

必要な処理は、上記内容のファイルを「ドメイン名.zone」という名前で作成することと、 「/etc/named.conf」にゾーンの設定を追加する必要があるということです。

というわけで、こちらもどーんとスクリプトを作成しました。

#!/bin/sh
while read domain addr; do
    # name.confに設定を追加
    cat << E-O-F >> /etc/named.conf

zone "${domain}" {
    type master;
    file "${domain}.zone";
    allow-transfer { ${addr}.0/24; localhost; };
};
E-O-F

    # ゾーンファイルの作成
    cat << E-O-F > ${domain}.zone
\$TTL 86400
@     IN SOA ns.${domain} root.${domain} (
      2011120400 ; serial
      3600       ; refresh
      1800       ; retry
      604800     ; expire
      86400      ; min
)
      IN NS ns1.${domain}
      IN NS ns2.${domain}
ns1   IN A ${addr}.1
ns2   IN A ${addr}.2
ftp   IN A ${addr}.21
www   IN A ${addr}.80
E-O-F
done

標準入力から、1行につき、ドメイン名とIPアドレスのネットワーク部を読み込み、 /etc/named.conf へ追記して、かつゾーンファイルをカレントディレクトリに作成します。

たとえば、このスクリプトを addzone.sh というファイル名で保存して、 実行可能にしておきます。

  $ chmod +x addzone.sh

そして、以下のようなファイルを用意します。
ドメイン名とアドレスのネットワーク部が対になったファイルですね。

  $ cat zoneinfo
  local.usupi.org 192.168.0
  local.kuri.info 192.168.1

用意しましたら、root の権限で以下のように実行します。
(/etc/named.conf に追記するため、root 権限を必要とします。)

  # ./addzone.sh < zoneinfo

すると、/etc/named.conf に以下が追加されます。


  zone "local.usupi.org" {
      type master;
      file "local.usupi.org.zone";
      allow-transfer { 192.168.0.0/24; localhost; };
  };

  zone "local.kuri.info" {
      type master;
      file "local.kuri.info.zone";
      allow-transfer { 192.168.1.0/24; localhost; };
  };

そして、カレントディレクトリにゾーンファイルが作成されています。

  # ls
  addzone.sh*  local.kuri.info.zone  local.usupi.org.zone  zoneinfo
  # cat local.kuri.info.zone
  $TTL 86400
  @     IN SOA ns.local.kuri.info root.local.kuri.info (
  ...中略...
        IN NS ns1.local.kuri.info
        IN NS ns2.local.kuri.info
  ns1   IN A 192.168.1.1
  ns2   IN A 192.168.1.2
  ftp   IN A 192.168.1.21
  www   IN A 192.168.1.80

おわりに

以上、繰り返し処理をスクリプトで確実に行う方法を、例で示しました。

…なんといいますか、場当たり的で申し訳ございません。

ただ、そもそも当メルマガでは、 こんな感じで普段使っているスクリプトやコマンドの実行手順をご紹介することで、 ちょっとやってみようかなと思っていただくことを目指していました。
そう考えますと、今回のネタは、 さほどブレていないと言っていいのではないかと思います。 (…と、自分に言い聞かせています…。)

ちなみに、過去にも、ユーザの追加やパスワードの自動設定を行っております。 興味のある貴兄は、さらりとご確認くださいませ。

Vol.004 - たくさんのユーザを登録する
http://www.usupi.org/sysad/004.html
Vol.005 - たくさんのユーザを登録する フルスロットル
http://www.usupi.org/sysad/005.html
Vol.136 - パスワードを自動生成する
http://www.usupi.org/sysad/136.html

宿題の答え

前回の宿題は、

  SASL認証が意図した通りに動かないときのデバッグ方法について考えて
  みましょう。

でした。

基本的には syslog に出力されますので、 facility が auth の出力先となるログを確認すればよいと思います。

たとえば、testsaslauthd コマンドを使って認証を試みたらダメだったとしましょう。 (「usu」はユーザ名です。適時変更してください。)

  # testsaslauthd -u usu -p 正しいパスワード
  0: NO "authentication failed"

ログ(/var/log/messages とか /var/log/auth.log とか)を見ると、 以下のようなメッセージが出力されていました。

  auth failure: [user=usu] [service=imap] [realm=] [mech=pam] \
  [reason=PAM auth error]

PAMかーと思って、imap の設定を確認してみると…ないようです。

  $ ls /etc/pam.d/imap
  ls: cannot access /etc/pam.d/imap: No such file or directory

それでは、あるやつで試せばよいのではということで、 「-s」オプションで sshd と指定してみたところ、今度はうまくいきました。

  # testsaslauthd -u usu -p 正しいパスワード -s sshd
  0: OK "Success."

ちなみに、ログにも出力されていました。

  auth success: [user=usu] [service=sshd] [realm=] [mech=pam]

もっといろいろ吐いてほしいというときには、 「-d」オプションをつけて saslauthd さんを直接実行してみましょう。
すると、以下のように、標準エラー出力に詳細を吐いてくださいます。

  # saslauthd -m /var/run/saslauthd -a pam -d
  saslauthd[PID] :main           : num_procs  : 5
  saslauthd[PID] :main           : mech_option: NULL
  saslauthd[PID] :main           : run_path   : /var/run/saslauthd
  saslauthd[PID] :main           : auth_mech  : pam
  ...

ただ、認証の成功・失敗は、-d なしのときと同じでしたが…。
(ソースコードを見ても、そのくらいしか出力していませんでした。)

今回の宿題

今回の宿題は、

  逆引きのゾーン設定も追加してみましょう。

です。

うっかり正引きのゾーン設定しか追加していませんでした。
というわけで、逆引きも追加してみましょう。

また、念のためバックアップをとっておいたり、 ファイルを上書きしないようチェックしたりなども、入れてみるとよいかもしれません。

あとがき

12月になり、今年も残すところあと1ヵ月未満となりました。
みなさまは、年末に向けて走り回られておられますでしょうか。

今年は、2月に転職して、スピード感あふれる仕事内容に翻弄されつつ、 当メルマガや某雑誌の記事をなんとかこなし、栗の絵も描き続けた1年となりました。

対外的には、いろいろ経験させていただき、充実した1年だったと言えるのですが、 内面的には、いろいろ悩みの多い1年でした。

それらをひっくるめてこねくり回し、集約してひとつにまとめて、 一文で言い表しますと、言われるがままではなく、 自分で考えてこうだと思ったことをやらないといけないのだ、 いうことに尽きると思いました。

何かを解決しようとしたり、今の状況を打開するために、 それっぽい本を買って読んだとしても、読んだだけで自分の頭で考え、 その結果の行動をやらなければ、なんにも変わらないということです。

…ということに、いまさらですが、何年もかかってようやく気づいた…という次第です。 ですが、もう41歳…来年は42歳ですので、変化を起こしてよりよくしていくために、 自分なりの答えを出して突き進みます。

 

さて、それとは別に、実は、まったく手をつけられていない原稿があり、 いま、かなりブルーな気分が蔓延しています。

年内に完成させないといけないため、おしりに火がつく前に、 自分で火をつけようと思っております。

ですので、次回は12月18日の予定ですが、お休みをいただきます。
そして、1月の第1日曜日は元旦ですので、1週ずらしたいと思います。
申し訳ありませんが、ご了承ください。

また、叱咤激励のメールなどは、いつでも受け付けております。
お気軽に投げつけてください。
(罵倒的内容でなければ、心の支えとさせていただきます。)

 

今回も、ここまで読んでいただき、たいへんありがとうございました。
次回は、1月8日(日) の未明にお会いしましょう!
それではみなさま、よいお年を!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- 来年こそは、富嶽三十六景の栗バージョンを描きたいです。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本