Browse Tag: centos

CentOS 7.x で最新の Node.js をインストールする方法

CentOS 7.x 公式で提供している Node.js のバージョンは、現時点で 0.10.42 とかなり古いバージョンになります。
現在の Node.js の最新の安定版は 6.x ですから、こちらをインストールしてみたいところです。

もちろん、普通にコンパイルしてインストールする方法があるのですが、コンパイルはせずにパッケージなどでさくっと導入したいと思って、その方法を調べてみました。すると、2つの方法がありそうです。

1. n package を使ってインストールする方法
この方法では、既存の node.js npm から n というパッケージを導入して、n パッケージ経由で node.js を複数バージョンできるものです。今回は、複数バージョンではなく、単に安定版だけをインストールしたかったので、この方法は見送りました。

2. NodeSource が提供しているパッケージを使う
NodeSource から、deb、yum、向けに各バージョンの node.js パッケージが提供されています。
CentOS 7 もサポートされているため、今回はこちらの方法で Node.js を差し替えてみました。

方法は、次のとおりです。

1. 既存の node.js を削除します

$ sudo yum remove -y nodejs npm

2. NodeSource の yum リポジトリを追加します

# curl -sL https://rpm.nodesource.com/setup_6.x | bash -
あるいは直接パッケージをインストールします
# rpm -i https://rpm.nodesource.com/pub_6.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm

3. node.js をインストールします

$ sudo yum install -y nodejs
※自動的に、対応している npm などもインストールされます
$ node -v
v6.4.0

ということで、手軽に CentOS 7.x に最新安定版の Node.js をインストールすることができました。
Node.js のバージョンアップ追従もパッケージ側の方もちゃんと行っているため、とても便利でした。

Ansible on CentOS 7 ですこしハマった

CentOS 7 上で Ansible 2 系を使っていますが、EPEL にある Ansible パッケージが、現時点で最新の 2.0.2.0 にバージョンアップされていました。
さっそくこのバージョンを使ったところ、次のような JSON をパースするような処理がある場合は、エラーとなってしまいました。


- set_fact: foo_aws_access_key_id="{{ cloudformation_outputs | selectattr('OutputKey', 'equalto', 'FooKey') | map(attribute='OutputValue') | join(',') }}"

これは、取得した CloudFormation の JSON データの OUTPUTS から特にキーの値を取得するものですが、これを実行すると、次のようなエラーになります。


An exception occurred during task execution. To see the full traceback, use -vvv. The error was: TemplateRuntimeError: no test named 'equalto'
fatal: [foo]: FAILED! => {"failed": true, "msg": "Unexpected failure during module execution.", "stdout": ""}

原因を調査したところ、どうも Ansible が使っているテンプレートエンジン Jinja2 が 2.7 系のままだったことが原因みたいです。
たしかに yum 経由でインストールされる Jinja2 が 2.7 系のままでした。


sudo yum info python-jinja2.noarch
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.osuosl.org
* epel: mirror.symnds.com
* extras: mirror.confluxtech.com
* updates: mirrors.tripadvisor.com
インストール済みパッケージ
名前 : python-jinja2
アーキテクチャー : noarch
バージョン : 2.7.2
リリース : 2.el7
容量 : 3.0 M
リポジトリー : installed
提供元リポジトリー : base
要約 : General purpose template engine
URL : http://jinja.pocoo.org/
ライセンス : BSD
説明 : Jinja2 is a template engine written in pure Python. It provides a
: Django inspired non-XML syntax but supports inline expressions and an
: optional sandboxed environment.
:
: If you have any exposure to other text-based template languages, such
: as Smarty or Django, you should feel right at home with Jinja2. It's
: both designer and developer friendly by sticking to Python's
: principles and adding functionality useful for templating
: environments

ということで、あまりやりたくはないですが、仕方がなく pip コマンドでアップグレードするようにしました。
けっこう Ansible も Jinaja もリリースされるバージョンに問題があることが多いのでバージョンを固定するようにしました。


$ sudo pip install --upgrade Jinja2==2.8

これで、上のような Playobook もちゃんと通るようになりました。

CentOS 7 で起動時と終了時にそれぞれ1回だけ実行するスクリプトを作成する

CentOS 7 で起動時と終了時にそれぞれ1回だけ実行するスクリプトを作成する方法を紹介したと思います。
次のような systemd スクリプトを作成します。


cat << EOF > /usr/lib/systemd/system/my-oneshot.service

[Unit]
Description=my-oneshot
After=network.service
Before=shutdown.target
Requires=network.service

[Service]
Type=oneshot
ExecStart=/bin/bash -v ‘/usr/local/bin/my-up.sh’
ExecStop=/bin/bash -v ‘/usr/local/bin/my-down.sh’
RemainAfterExit=true

[Install]
WantedBy=multi-user.target
EOF

次に systemd をリロードして、サービスを有効・開始します。


$ sudo systemctl daemon-reload
$ sudo systemctl enable my-oneshot
$ sudo systemctl start my-oneshot

これで、起動時には /usr/local/bin/my-up.sh が実行されて、終了時には /usr/local/bin/my-down.sh が実行されます。
もちろん、EC2 上でも利用可能ので、AutoScaling 時などに起動あるいは終了時に実行したいコマンドがあるときに設定すると便利ですよね。

Software Collections for CentOS-6

Software Collections for CentOS-6 がリリースされました。

Software Collections というのは、RHEL で提供されている追加コンポーネントです。

この追加コンポーネントには、次のものが含まれています。

  • Perl 5.16.4
  • PHP 5.4.14
  • Python 2.7
  • Python 3.3
  • Ruby 1.9.3
  • MariaDB 5.5
  • MySQL 5.5
  • PostgreSQL 9.2
  • Node.js 0.10

Node.js のみ、テクニカルプレビューのようです。

これらが CentOS 6 で利用できるようになったようです。比較的バージョンの新しいものがあるので、自分でパッケージをビルドする必要がないので、便利ですね!

インストール方法は、とても簡単です。まず、Yum リポジトリを追加します。

$ sudo yum install centos-release-SCL

これをインストールすると、/etc/yum.repos.d/CentOS-SCL.repo ができます。

試しに Ruby 1.9.3 をインストールしてみましょう。

$ sudo yum install ruby193

そうすると、/opt/rh/ruby193 以下に Ruby 1.9.3 がインストールされます。
/opt/rh/ruby193/enable を読み込むと、PATH などを書き換えることができます。

$ source /opt/rh/ruby193/enable
$ ruby --version
ruby 1.9.3p448 (2013-06-27) [x86_64-linux]

手っ取り早く、上記のものを使いたいときは、とても便利ですね。
Ruby に限っては、2 系を追加してほしいところですね。

Yum の変数を追加する方法

CentOS 5/6 系で、/etc/yum.repos.d/ の yum リポジトリの設定をみてみると、$releasever や $basearch という変数名が使われていて、リリースバージョンにあうようになっていて便利ですよね。ですが、$releasever は、CentOS 6.3 なら 6 としか入らないので、多少不便です。毎回、バージョンアップすることに /etc/yum.repos.d/ の設定を固定値で書き換えても当然いいのですが、めんどくさいということで、Yum の変数をカスタマイズする方法を調べてみました。

まず、定義されている Yum の変数をチェックするには、次のワンライナーで確認することができます。

$ sudo python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)'
for CentOS 5.8
{'arch': 'ia32e',
'basearch': 'x86_64',
'releasever': '5'}

for CentOS 6.3
{'arch': 'ia32e',
'basearch': 'x86_64',
'releasever': '6',
'uuid': 'xxx'}

5系と6系で多少違うようです。

まず、6系の方で Yum の変数を増やすには、/etc/yum/vars ディレクトリ以下に、ファイルを作成するだけで Yum の変数を追加することができます。

$ sudo vi /etc/yum/vars/full_releasever
6.3
$ udo python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)'
Loaded plugins: fastestmirror, presto
{'arch': 'ia32e',
'basearch': 'x86_64',
'full_releasever': '6.3',
'releasever': '6',
'uuid': 'xxx'}

おぉ、簡単に Yum の変数を追加することができました。ファイル名が変数名、ファイルの書かれている値がその変数の値となります。
CentOS の場合、X.Y のみを取得したい場合、次のコマンドで取得できます。

$ rpm -q --queryformat '%{VERSION}.%{RELEASE}' centos-release | cut -c 1-3

その他の方法として、/etc/redhat-release を参照する方法もありますが、このファイルが書き換えられている可能性もあるため、上のコマンドの方がよいでしょう。ただし、上のコマンドだと X.Y のパターンしか調整できないので注意して下さい。

5 系の場合、残念ながら 6 系と同じ方法が使えません。$YUM[0-9] という環境変数を定義することで増やすことができますが、任意の変数名を追加することができないようです。

$ export YUM0=hoge

これはちょっとばかり不便ですね。

ということで、6 系なら、SRPM をダウンロードする Yum リポジトリの設定を次のように書くことができるので便利です。

$ sudo vi /etc/yum.repos.d/sources.repo
[base-source]
name=CentOS-$full_releasever - Base source
baseurl=http://vault.centos.org/$full_releasever/os/Source/
gpgcheck=1
gpgkey=http://vault.centos.org//RPM-GPG-KEY-CentOS-6
priority=1
enabled=1

[updates-source]
name=CentOS-$full_releasever - Updates Source
baseurl=http://vault.centos.org/$full_releasever/updates/Source/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
priority=1
enabled=1

かなり便利になりましたね!

この状態で、例えば、kernel の SPRM をダウンロードするには、yum-utils パッケージをインストールして、次のコマンドを実行するだけです。

$ sudo yumdownloader --source kernel-`uname -r`

CentOS 5.x 系で XFS でフォーマットしてインストールする方法

キックスタート経由で、CentOS 5.x 系だと XFS でフォーマットしてインストールすることができません。

そこで、XFS でフォーマットできる方法を紹介したいと思います。

まず、キックスタートのときに最初に参照される stage2.img に必要なファイルを組み込みます。
次の例は、cobbler を使ったときになります。

$ cp /var/www/cobbler/ks_mirror/centos5-x86_64/images/stage2.img .
$ unsquashfs -dest ./stage2 stage2.img
$ cp /sbin/mkfs.xfs ./stage2/usr/sbin
$ cp /sbin/fsck.xfs ./stage2/usr/sbin
$ cp /usr/sbin/xfs_db ./stager2/usr/sbin
$ mksquashfs ./stage2 ./stage2.img -all-root -no-fragments

あとは、%packages で、次のパッケージをインストールします。

kmod-xfs
xfsdump
xfsprogs

これで、作成した stage2.img を使えば、キックスタート経由で XFS でフォーマットすることができます。/boot は、ext3/4 のままでないと、たぶんブートできないと思うので、注意しましょう。

snmpd のログ設定について

CentOS 5.8 x86_64 での snmpd を動かしている場合、設定によっては大量の接続ログが /var/log/messages に出力されてしまうことがあります。

そこで、SNMPd のログ設定まとめてみます。

まず、/etc/sysconfig/snmpd.options の OPTIONS を、次のように変更します。

OPTIONS="-Ls6d -Lf /dev/null -p /var/run/snmpd.pid"

上記の場合、local6 facility に出力されることになるので、/etc/syslog.conf に、次を追加します。

local6.* /var/log/snmpd.log

あわせて、/var/log/messages に出力しないようにします。

*.info;mail.none;authpriv.none;cron.none,local6.none /var/log/messages

最後に、snmpd と syslog を再起動して、設定は完了です。

$ sudo service snmpd restart
$ sudo service syslog restart

syslog の設定によっては、まったく /var/log/messages にログが出力されなくなることもあるので注意して設定しましょう。
ちなみに僕は local*.none の設定を追加したら対応していないらしく、何も /var/log/messages にログが出力されなくなってしまいました...。

参考資料
Reduce SNMPd logging verbosity - Server Fault

そろそろ、CentOS 5 の時代ではなくなってきているので、攻めるシステムの OS は置き換えていきたいと考えています。

PHP 5.3 + MySQL 5.5 の RPM も作ったお話

昨日、PHP 5.4 + MySQL 5.5 の RPM を作成したわけですが、stomp という PECL を使う環境で stomp がインストールでませんでした。このあたりが原因のようです…。

CentOS 5.8 x86_64 では、php53 というパッケージに公式にあるので、パッケージをダウンロードしてリビルドしてみました。

$ yumdownloader --source php53
$ rpm -i php53-5.3.3-13.el5_8.src.rpm

前回と同じように、mysql_config のパスと php53-mysql を php53-mysql55 に変更してビルドを開始しました。

$ rpmbuild -ba ~/rpmbuild/SPECS/php53.spec
...
hecking for specified location of the MySQL UNIX socket... no
checking for mysql_close in -lmysqlclient... no
checking for mysql_error in -lmysqlclient... no
configure: error: mysql configure failed. Please check config.log for more information.
error: Bad exit status from /var/tmp/rpm-tmp.88928 (%build)

MySQL まわりの configure で失敗してしまいました…。
socket の設定は、–with-mysql-sock オプションを追加することで改善したのですが、どうしても -lmysqlclient まわりが解決できませんでした。おそらく、MySQL の RPM を公式で使っていることが原因だと推測したので、別のパッケージを探してみました。

執筆時現在の PHP 5.3 系の最新バージョンは、PHP 5.3.14 になります。
いくつかあった中で、ここにある SRPM からリビルドをしてみました。(remi リポジトリにもあるようですが、個人的にあまり remi は信用していないため、今回は使いませんでした)
ただし、この php-5.3.14-1.w5.src.rpm は、SPEC ファイル名が php53.spec となっていますが、パッケージ名が「php」となっているため、php53 にパッケージを変更しました。パッケージを変更するにあたり、昨日の php54.spec ファイルを参考にしながら変更しました。この変更には、依存関係まわりでかなりはまってしまいました。差分の方はかなり長いので、gist に置いておきました。

あと、pear は、昨日の php54-pear を php53-pear としてコピーしてさくっと作成しました。

そして、stomp ですが、OpenSSL 1.0 系に対応しているため、CentOS 5.x の OpenSSL では対応できないため、OpenSSL 対応をオフするとインストールすることができます。PECL インストールするには、php53-devel が必要です。


$ sudo pecl install stomp
downloading stomp-1.0.3.tgz ...
Starting to download stomp-1.0.3.tgz (18,309 bytes)
......done: 18,309 bytes
6 source files, building
running: phpize
Configuring for:
PHP Api Version: 20090626
Zend Module Api No: 20090626
Zend Extension Api No: 220090626
OpenSSL install prefix (no to disable SSL support) [/usr] : no
...
Build process completed successfully
Installing '/usr/lib64/php/modules/stomp.so'
install ok: channel://pecl.php.net/stomp-1.0.3
configuration option "php_ini" is not set to php.ini location
You should add "extension=stomp.so" to php.ini

$ vi /etc/php.d/stomp.ini
extension=stomp.so

$ php -r "phpinfo();" | grep stomp
/etc/php.d/stomp.ini,
PHP Warning: phpinfo(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead in Command line code on line 1
stomp.default_broker => tcp://localhost:61613 => tcp://localhost:61613
stomp.default_connection_timeout_sec => 2 => 2
stomp.default_connection_timeout_usec => 0 => 0
stomp.default_read_timeout_sec => 2 => 2
stomp.default_read_timeout_usec => 0 => 0

RPM を作成するのも、なかなか大変ですねっと。。。

CentOS 5.x 系で IPv6 を無効にする方法

CentOS 5.x 系で IPv6 を無効にする方法を調べていたのですが、バージョンごとに微妙に方法が違うようなのでまとめておきます。
公式情報は、CentOS 5 FAQ になります。

1. /etc/sysconfig/network で “NETWORKING_IPV6” を “yes” から “no” に変更します
2. バージョンごとに設定方法が違います
(CentOS 5.4 以降の場合)
– /etc/modprobe.conf に alias ipv6 off と options ipv6 disable=1 を追加します
– /etc/modprobe.d/disable-ipv6.conf を作成して、”install ipv6 /bin/true” を追加します
(CentOS 5.3 以前の場合)
– /etc/modprobe.conf に alias ipv6 off と alias net-pf-10 off を追加します
3. IPv6 のファイアーウォールを無効にします
# /sbin/chkconfig ip6tables off
4. 最後に /etc/sysctl.conf に “net.ipv6.conf.all.disable_ipv6 = 1” を追加します(これは推奨設定です、/proc/sys/net/ipv6 がない場合は設定しませんので、通常は設定しなくても問題ないでしょう)

あとは、network サービスを再起動するか、OS を再起動することで IPv6 が無効になります。

僕の場合、CentOS 5.3 以前から運用しているサーバがあり、アップグレードをしていたのですが、そのときに設定を変更するのを忘れていました。。。

[CentOS] SRPM をダウンロードする方法

CentOS 5.8 系でたまに SRPM をダウンロードし直して、パッケージをリビルドすることがあるんですが、いつも検索して個別に SRPM をダウンロードするのは手間なので yumdownaloder 経由でさくっと入手できるようにしました。

方法は、まず、 /etc/yum.repos.d/CentOS-SRPM.repo 設定ファイルを次のようにします。

[base-SRPM]
name=CentOS-5.8 - Base SRPM
baseurl=http://vault.centos.org/5.8/os/SRPMS/
gpgcheck=0

[updates-SRPM]
name=CentOS-5.8 - Updates SRPM
baseurl=http://vault.centos.org/5.8/updates/SRPMS/
gpgcheck=0

[extras-SRPM]
name=CentOS-5.8 - Extras SRPM
baseurl=http://vault.centos.org/5.8/extras/SRPMS/
gpgcheck=0
enabled=0

上の例では extras は無効になっているので、使う場合は有効にして下さい。

baseurl 部分は通常 $releasever を設定した方がいいんですが、$releasever = 5 のため、マイナーバージョンを含めて個別に設定しています。お使いの CentOS のバージョンにあわせてもらえばいいかと思います。
この他にも、centosplus, fasttrack の SRPM が vault.centos.org に置いてあります。

あとは、yum-utils パッケージをインストールして、例えば zsh なら次のようにコマンドを実行するだけです。

$ yumdownloader --source zsh
Loaded plugins: fastestmirror
Excluding Packages in global exclude list
Finished
Enabling epel-source repository
Excluding Packages in global exclude list
Finished
zsh-4.2.6-6.el5.src.rpm | 2.0 MB 00:04

CentOS 6 系でも同じように設定できるはずです。

  • 1
  • 2