A Day In The Boy's Life -34ページ目

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

サーバーの台数が増えてくると個々のサーバーへのパッチの適用作業というのは結構手間になってきたりもします。
しかも、パッチを適用することでそれらのパッケージを利用したプログラムとかに影響が出たりして、十分に検証期間を取った上で本番環境に適用したいというニーズが出てきたりもします。


というわけで、単純なyum関連のコマンド(yum、yumdownloader、createrepo)を利用してパッチの適用作業を自動化する方法について書いてみたいと思います。
なお、環境はRedHat5系をベースにして書いています。



社内配布用のリポジトリサーバーを構築する


まず、システム構成のイメージとしては下記のようになります。


A Day In The Boy's Life
社内用のリポジトリ兼検証用サーバーは通常通り外部のリポジトリから最新パッチを適用していき、その影響調査および本番サーバーに配布するためのリポジトリサーバーという役割を担います。
詳しくは後述しますが、もう少し本番適用までを慎重にしたいとか、複数のサーバーで影響調査をしたいという場合は、リポジトリサーバーをもう1台増やしたりして、1台目は最新を常に当てる、2台目は検証が取れた本番適用予定のパッチだけがリポジトリに登録されている、というような構成も取れたりします。


まず最初に、検証用サーバーでは通常通りyum updateで最新のパッチを適用していきます。


# yum update -y

この辺もCronに設定しておけば自動化できるでしょう。
当てたくないパッチなどがある場合は、yum.confのexcludeに適用対象外のパッケージ名を指定しておきます。


exclude=kernel*

次に、検証用サーバーに適用したパッケージをダウンロードしてリポジトリを生成します。
このリポジトリを本番サーバーが参照します。
以下のようなバッチを作成して、検証用サーバーに適用しているパッケージのソースをダウンロードします。


#!/bin/sh
DESTDIR=/path/to/htdocs/rpm/rhel-x86_64-server-5/dev/
rpm -qa | xargs rpm -q --qf '%{NAME}\n' | sort | uniq | xargs yumdownloader --destdir=$DESTDIR
createrepo -q --update $DESTDIR

yumdownloader(createrepoやreposyncコマンドも同様)は、yum-utilsに含まれますので環境に存在しない場合はyum経由でインストールしておきましょう。
後述するreposyncコマンドを使って、外部リポジトリ(rhelやrpmforgeなど)を丸ごとコピーしてもよいですが、かなり容量も大きくなりますし不要なものも多いので、サーバーに適用しているパッケージだけをダウンロードするようにしています。
パッケージダウンロード後は、createrepoコマンドでリポジトリを生成しています。
リポジトリのディレクトリは別のサーバーからHTTP経由でアクセスするため、ドキュメントルート以下にしておきます。


yum update後に上記のバッチによってパッケージをダウンロードしておけば、検証環境に適用しているパッケージとリポジトリに登録しているパッケージのバージョンをそろえることができます



本番環境のリポジトリ参照先を変更


社内配布用のリポジトリができたので、次は本番サーバーがこのリポジトリを参照するように設定変更します。
yum-fastestmirrorを導入している場合、参照先のリポジトリが自動的に選択されるので、まずはこれらのプラグインを動かさないようにしておきます。


[main]
enabled = 0
gpgcheck = 1

enabledを0にしてプラグインの読み込みを禁止します。
次に、検証用のリポジトリを参照するようにyumの設定ファイルを追加します。


[dev]
name = RHEL $releasever - www.example.com -
baseurl = http://192.168.0.100/rpm/rhel-x86_64-server-5/dev/
enabled = 1
protect = 0
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rpmforge-dag
gpgcheck = 0

baseurlには、検証用のサーバーのリポジトリのURIを指定します。
設定後は、yumコマンドでリポジトリの参照先が検証用サーバーを向いているか確認しておきましょう。


# yum check-update
Loaded plugins: security
Excluding Packages in global exclude list
Finished
Skipping security plugin, no data

httpd.x86_64                2.2.3-83.el5_10           dev
httpd-devel.i386            2.2.3-83.el5_10           dev
httpd-devel.x86_64          2.2.3-83.el5_10           dev
httpd-manual.x86_64         2.2.3-83.el5_10           dev

右端に参照しているリポジトリ名(dev)が表示されます。
あとは、任意のタイミングでyum updateを本番サーバーで動かすようにCronにでも登録しておけばパッチが適用されていきます。

この仕組みでは、検証用サーバーのリポジトリを更新しない限り、本番サーバーへ勝手にパッチが当たることがありません
検証用サーバーで十分に検証期間を取った上で本番に適用していきたいということであれば、この辺は運用の組み立て方の話でありますが、


1. 検証用サーバーのパッチ適用は手動で行う(毎週月曜日とか。その週は検証期間としておく)

2. 検証期間で問題なければ日曜日の深夜に検証用サーバーのリポジトリを自動更新する

3. 毎週月曜日の早朝にCronでパッチを自動適用する

4. 以下、次の最新パッチを検証用サーバーにあてていく


というような動かし方ができます。
要は2.を実行しない限り、3.のパッチの本番適用は空振りします(その前に全てのパッチが当たっているはずなので)。
1.2.にどれだけの期間をおくのか、全部自動化してしまうのか、心配だから2.までを手動で行うのか、といった調整でどうにかなるんじゃないでしょうか。


予断にはなりますが、社内リポジトリサーバーを複数たてる(ステージング用のサーバーを作るとか)場合ですが、リポジトリ間の同期が必要です。
その場合は、reposyncコマンドを使ってリポジトリのコピーを作成することができます。
こちらも下記のようなバッチを作っておけば便利です。


#!/bin/sh
DESTDIR=/path/to/htdocs/rpm/rhel-x86_64-server-5/
reposync -p $DESTDIR
createrepo -q --update $DESTDIR/dev/

検証用サーバーでは、外部のリポジトリを参照してパッチを全て当てておき、適用したパッチも含めた最新のリポジトリを作成する。
ステージングサーバーでは、検証用サーバーのリポジトリを上記のバッチで複製しておく(複製のタイミングは少しずらしておく)。
本番サーバーのリポジトリはステージングサーバーのリポジトリを参照する。


といったことをしておけば、万が一検証用サーバーに変なパッチが当たってもそのパッチの本番適用を防ぐことはできると思います。


yum updateだけで対処しようとすると、適用するタイミングでパッチの種類やバージョンが変わったりするので、社内向けにリポジトリサーバーを立てるだけでも結構この辺の作業は楽になるんじゃないかと思います。





という話題が周りで出たりして少し考えさせられたりしました。

クリエイティブという言葉は非情に魅力的に聞こえたりするのですが、社内のシステム保守・開発・運用をする部門に当てはめるには縁遠い言葉のようにも聞こえたりしたわけです。



創造的ではなく真似事と現状維持の仕事をする現実


社内の情報システム部門に与えられる役割は企業によって様々でしょうけど、その中の人で「我々はクリエイティブな仕事をしているぞ!」というのはどれぐらいいるのでしょうか。

自分の予測ではほぼいないような気がします。


クリエイティブという言葉は創造的といった意味にはなりますが、その意味以上に何か新しいもの、世の中に無いものを作り出すといったイメージが含まれていてワクワクさせられるわけですけど、そういったクリエイティブな領域が情報システム部門の中にあるかというとあまり見当たりません

今のうちのこの業務領域が非効率で改善したいとか、社員同士のコミュニケーションインフラを改革したいといったプロジェクトが立ち上がったとしても、それは他所でやっていることや世の中のトレンドを反映しようとしたものになります。

単純に言えば、「今SNSが流行っているようだからうちでも導入して社員のコミュニケーションを円滑にしよう」といった具合に。


ただ、これをクリエイティブと呼ぶかといったらそうではないでしょう。

ありものを持ってこようとしているわけで、それを設計する側としても「Facebookみたいに「いいね」ボタンをつけようぜ」みたいに真似事のシステムを作ろうとするわけです。

結果的にそれが功を奏して社内の業務改善につながるかもしれません。

ただ、それでクリエイティブな仕事をしてたと言えるのかと言えば個人的に違うんじゃないかと思うわけです。

悪く言えば流行を取り入れた真似事のサービスを実装しようとも言えなくもありません。


また、そういった業務改善をすることで新規に何かサービスやシステムを作り出そうというプロジェクトならまだ何かを生み出しているという感覚に包まれるのでよいかもしれませんが、そういったプロジェクトよりも既存のシステム保守・運用といった仕事の方が多かったりします。

サーバーやソフトウェアのEOSに始まったリプレイス施策やインフラ・システムの拡張といったことは、今あるものをベースに考えられたりするので、何か新しいものを作るというよりは単純に現状通りになんとか延命していこうという施策ばかりでは「クリエイティブな仕事がしたい」と思う人がいるのも無理は無いかもしれません。



情報システム部門の中にクリエイティブな仕事の領域があるのか


というのは、情報システム部門にクリエイティブな領域が求められているかどうかということになりますが、例えばラボのようなものがシステム部門の中にあるのであれば、そこは世の中のトレンドをウォッチしつつ社内や社外向けのサービスの種となるような実験的なことをやれたりもするかもしれませんが、こういったラボがシステム部門としてあるところも少ないと思います。

サービス系の部門の一組織として存在していたり、または世の中のトレンドを見るというところも調査部や企画部といった組織に役割が与えられていたりして、情報システム部門としてそういった領域も含めて組織構成されているところはどれだけあるのでしょうか。


つまり、悲しいかな大抵の情報システム部門においてクリエイティブな領域というのは求められたりしていないと思うわけです。

いや、現実的には「もっとクリエイティブな仕事をしていこう」とか言われたりもするのですが、それが実現可能なレベルで実行できるかといえば、踏み込む領域も要員も予算もなかったりするので何をどうやって生み出していけばいいんだ、という気持ちにもなります。


言ってしまえばクリエイティブな仕事をしたければシステム部門ではなく、そういったことをするためのサービス系の部門か、研究をする役割を与えられた組織に配属を希望する方が手っ取り早そうです。

現状のシステムやインフラを維持するという役割がある以上、クリエイティブなことに割く時間というのはおのずと短くなってしまいます

そういったことを避けるために、保守・運用をアウトソースしたりクラウドを利用するといったことが考えられたりもしていますが、それを推し進める過程で創造的であるための基礎を失うことにもなって、結局何も生み出せない抜け殻の組織が出来上がってしまうリスクもあったりします。


もう1つ、社内でのクリエイティブな仕事が難しい理由は、そもそも世の中に出てくる独創的なサービスや製品でも受け入れられるのがなかなか難しいものだったりする中、それを社員向けに使うわけですから、大体がついてこれないでしょうしそういった提案をしたところで「うちの社員には使えこなせそうに無いので今と同じように・・・」といった返答が返ってきたりもします。

この提案は全然クリエイティブではなかったりしますが、今の流行のスタイルというものを提案してもこういった状況なので、それ以上に独創的となると当然受け入れられるわけはないよなぁ、って思ったりします。

対外向けサービスの試作として社内に先行展開するというならまだ理解は得やすいかもしれませんし、それは仕事として扱うので拒否反応も薄いかもしれませんけど。


先進的なサービスを作って受け入れてくれるアーリーアダプターは、世の中的な母数から見ればそれなりの数が出てくるかもしれませんが、それが社内のってことになると皆無という状況にもなったりするわけで、そこからどう広めていくかということになると社員の多くが流行に敏感であったり、文化としてそれが受け入れられる土壌も必要になってくるのではないでしょうか。



まとめ


自分で書いていてなんだか悲しい気持ちにもなってきたりはしたのですが、それでも自分としてもクリエイティブな仕事をしたいという気持ちはあります。

広義に何かを作り出すということとして捉えればまだそういった仕事もあるわけで、システム部門の役割や求められる価値としてどんどん薄くなっていっている現状、そういった生み出す仕事というものをしていかないと本当に存在価値ない部門となっていってしまいます。


生み出す力が弱くなっていったのは、社内に導入していくシステムの数が増えて現状維持で手一杯になる一方で企業として求めるシステム基盤の要件を満たす人材が不足して、低コストで実現できるという名目の外部への委託に走った結果というのもあると思いますけど、それは自分たちがそんな現状に忙しいと甘んじていたというのも理由の一つになるでしょう。


ということで、クリエイティブな領域に踏み込む余地というのは少ないものの、そこに向けて食い込む努力をして勝ち取っていかないとやりたいこともできない状況にますますなっていくのではないかと感じています。

言葉の魔力だけを鵜呑みにするのではなく、与えられた役割をこなしつつ独創的なものを作り出していく、というのは簡単にいえるようで想像以上に難しいことだと感じています。




むかしむかし、組織がそしてシステムが小さな頃は開発や保守、運用という区切りは存在せず、みんなが全てを担当し、一丸となって運営を行っていました。

しかし、システムが複雑になるにつれ、組織も大きくなり、何時しかそれらの作業は1人1人のキャパでは回しきれなくなっていきました。

そこで困った組織長はチームを二分し、開発(・保守)と運用という役割に分けることにします。

チームの役割をはっきりさせることによって組織運営を円滑にするための措置でしたが、それによってチーム同士の戦いが始まることになりました。



開発と運用という縦割りと横割りの隊形


今ではシステム運営のイロハが世に出回っていますから、こんなストリーのように最初から非効率な状態で開始されるということはないかもしれませんが、それでも組織自体が小さかったり、要員が少ないという場合はどうしてもこのように非効率な状態から開始せざるを得ないというのはあるでしょう。

サービスを作り上げた当初、開発・運用の体制が数人というケースはよくあるでしょうし、そういった場合は書いたように全員が開発・運用を担っていくというような組織作りにせざるを得なかったりします。


私もこういった組織体制の変遷を辿ってきたりしましたが、最初はサービスやシステム単位でチームが組まれていきます。

あるシステムはこのチームが運営していく、別のシステムは別のチームが、というように組織が縦割りになって構成されます。

しかし、個々の規模が大きくなってくると各組織で同じような課題が出てきてそれを解決するための施策が立ち上がったりしてきますし、情報が共有されずに非効率な組織運営となっていきます。


それらを解決するために、どのシステムも横串で面倒を見れる開発チームや運用チームという横割りの組織体制に変わっていったりするわけですが、それでも情報共有がされないという課題は同じように出てきたり、横割り故に自分の作業に大きく弊害が出る問題が発生したりします。


縦割りの組織では、「よそはよそ、うちはうち」という割りきりができますが、横割りの組織の場合、業務上でお互いが通さなくてはならないフローを邪魔することがおき始めたりします。

開発には開発のルール、運用には運用のルールというものが出来上がるので、それはお互いのチームの中でよく吟味され、効率化やリスクを低減させるためのものだったりするわけですが、他のチームから見たらその良さは良さや理由が伝わってなくて面倒に思えてきたりします。

「なんでそんな面倒なことをするの?」「そんなの言わなくてもわかるでしょ?」という具合に、早くして欲しいのに遅々として進まない状況に苛立ちを覚えたりもするわけです。



運用チームの苛立ち、開発チームのジレンマ


運用チームから見れば開発の状況が見えないというのは苛立ちの一つでもあったりします。

もちろん進捗を確認する打ち合わせなどで開発担当者からの定期的な報告は聞いているんでしょうけど、何でそういう進捗になっているのかとか、そういった構成をとることになるのか、それを何故リリース後に運用が担当しないといけないのかなどなど、細かいところはなかなか共有されなかったりもします。


開発というのは一定の期間で終わることが多いですが、運用というのはそのサービスやシステムがある限り面倒を見なくてはならない業務です。

それ故に最初が肝心というのを運用の担当者は身にしみて覚えていたりします。

「最初は運用で回避して。後でシステム化するから」といったところで他の案件で開発要員の手が取られて一向に改善が進まないばかりか、そういったシステムが次々と回されてきて現場はパンク寸前なんてことがあったりするからでしょう。


一方で開発チームが受けるジレンマは、運用の細かなルールに縛られるところがあったりします。

「バグです」なら開発が悪いって事になりますが、サービスが止まった(止まりかけた)ってなると運用が責められますし、ユーザーとのやり取りの矢面に立つのが運用だったりもするので品質の維持に人一倍シビアに考えていたりもするからでしょう。

そのために多くのマニュアルが備えられ、ミスを防止するための細かいルールが整備されたりしますが、開発側から見ればそれは酷くまどろっこしいものだったりもするわけです。

ちょっとした機能をリリースしたり、サービスへの影響が無いメンテナンスをするためにも所定の手続きが必要だったりして、「そんなのこっちの責任でやらせてよ」って思ったりもします。


自分はどちらかというと開発側の経験の方が長かったりもするんですが、一番面倒に思えるのがサービスの維持のために必要なサービス監視だったりして、直接影響が無い作業でも監視引っかかったりするとアラートがあがって、運用の担当者に「何かやりましたか?」って都度都度状況を説明しないといけなかったりします。

もちろん監視自体は重要なものとわかっているのですが、そのちょっとしたことがすぐにできないジレンマがあったりするわけです。

「監視システムは5分おきにポーリングしているから、そのログから次の5分までに作業をすればばれないぞ!」みたいな変なノウハウを教わったりもします。



チームを一つにするための大義名分


開発と運用という組織が分かれた場合、その組織長が分かれたりしていて互いに仲が悪かったりする場合は困りものだったりするのですが、結局のところはその運営していくサービスをよりよくするためのことを考えていたりするわけです。

ただ、互いの領分を守ろうとするあまりに相手の言い分が聞こえないような状況に陥ってしまっているわけで、その目的達成のために自分たちの手法やルールが必要だと言い合っているだけだったりします。

こういった状況を打破するためにも、もう一度しっかりと互いの共通目的はなんなのかというチームを束ねるための大義名分が必要だと思います。

こういうのって結構シンプルなものでよくって、「このサービスをよりよくしてお客さんに喜んでもらいたい」とか、「世の中を良くするためのものを作ろう」とか、お互いにそういったことのためにしているんだけど忘れがちになっている部分をちゃんと互いに再認識しておくのって結構大事なんだなって思ったりします。


まぁ、こういうことをいえるのは互いの組織をさらに束ねる長がしっかりと示すべきでしょうけど、そういうのが期待できない場合は、相手の仕事を理解するためのチーム間のローテーションなども必要になってくるでしょう。

互いのチームのやっていることというものが見えればその理由というのもおのずと理解できますし、こういった情報が必要だろうとか、ここは運用とネゴしておこうとか、相手への気遣いというもの生まれて運営が円滑になったりもします。

何よりも互いのチームを回すための業務の知識というものは結構異なってきたりもしますし、システムの運用をするのにプログラムに理解が無いというのは結構開発視点でも運用視点でも辛かったりもします。
運用側の課題を解決するために自分たちでどうにかできないというのは、開発はサービスやアプリの開発に注力して運用の課題を解決するための施策に手を回す時間が取れなかったりもしますから、運用側は運用側で自分たちで運用ツールを構築していくといったことをしていかないと何時まで経っても仕事が降ってきて要員はパンク寸前という状況が打破できません。


あとは、何よりもチームが分かれているけど、互いにとって必要な存在ではあるわけですから、しっかりと情報を共有したり、言いたいことを言っておく場というのも大事になってきます。
色んなシステムの面倒を見ていて大変というのはあるんですけど、開発側も運用側もそれぞれの苦労があるわけで、互いの言い分だけでなくちゃんと理由を伝えることだったり、自分も運用側にいてその苦労がわかるからそれを回避するためにやってあげた方がいいことっていう気遣いをちゃんと示しておくとわかってくれたりもするものです。

そして、お互い何のためのこの仕事をしているのか?ってことの原点をちゃんと確認しておくべきじゃないかと思うわけです。