[Ansible] さくらのVPSにCentOS6を再インストール

Ansibleを使って、さくらのVPSにCentOS6を最小パッケージで再インストールするroleです。

roles/sakura-install/tasks/main.yml

– include: kickstart.yml

roles/sakura-install/tasks/kickstart.yml

– name: Download vmlinuz
 get_url: url=”http://ftp.riken.jp/Linux/centos/6/os/x86_64/isolinux/vmlinuz” dest=/boot
 become: yes
 tags: install

– name: Download initrd.img
 get_url: url=”http://ftp.riken.jp/Linux/centos/6/os/x86_64/isolinux/initrd.img” dest=/boot
 tags: install

– name: Copy Kickstart file
 template: src={{ item.src }} dest={{ item.dst }}
 with_items:
 – src: ks.cfg.j2
 dst: /boot/ks.cfg
 tags: install

– name: Configure grub.conf
 lineinfile:
 dest: /etc/grub.conf
 line: “title CentOS 6 install
    root (hd0,0)
    kernel /vmlinuz ro root=LABEL=/ ks=hd:vda1:/ks.cfg
    initrd /initrd.img”
 tags: install

roles/sakura-install/templates/ks.cfg.j2

firewall –enabled –ssh –service=ssh
# Install OS instead of upgrade
install
# Use network installation
url –url=”http://ftp.riken.jp/Linux/centos/6/os/x86_64″
# Root password
rootpw {{ root_password }}
# System authorization information
auth –useshadow –passalgo=sha512
# Use text mode install
text
# System keyboard
keyboard jp106
# System language
lang en_US
# SELinux configuration
selinux –disabled
# Do not configure the X Window System
skipx
# Installation logging level
logging –level=info
# Reboot after installation
reboot
# System timezone
timezone Asia/Tokyo
# Network information
network –bootproto=static –device=eth0 –gateway={{ ansible_default_ipv4.gateway }} –ip={{ ansible_eth0.ipv4.address }} –nameserver={{ nameserver }} –netmask={{ ansible_eth0.ipv4.netmask }} –onboot=on –noipv6 –hostname {{ ansible_nodename }}
# System bootloader configuration
bootloader –append=”console=ttyS0,115200n8r crashkernel=auto” –location=mbr –driveorder=”vda”
# Partition clearing information
clearpart –all –drives=vda
# Disk partitioning information
part /boot –fstype=”ext4″ –size=500
part pv.00 –grow –size=1

volgroup vg_00 –pesize=4096 pv.00
logvol / –fstype=ext4 –name=lv_root –vgname=vg_00 –grow –size=1024 –maxsize=102400
logvol swap –name=lv_swap –vgname=vg_00 –grow –size=512 –maxsize=2048

%packages –nobase
@core

%end

ks.cfg.j2中にroot_passwordを変数で設定していますが、これはvars/main.ymlにべた書きするか、ansible-vaultコマンドで暗号化して保存しておいてください。

このroleを実行後に再起動すれば、自動的に再インストールが始まります。

pipでパッケージを再インストールする時にやること

paramikoの調子が悪かったので再インストールしようとしたところ、

Collecting paramiko
 Using cached paramiko-1.16.0-py2.py3-none-any.whl

こんな感じでキャッシュを使ってインストールされるため、症状が改善しませんでした。

こういう場合は、一旦該当のパッケージをアンインストールした後で、再インストールする時に、

$ sudo pip uninstall paramiko
$ sudo pip install –no-cache-dir paramiko

って–no-cache-dirをつけて実行してあげると、キャッシュを利用せずに再度DLして一からインストールしてくれます。

Macでスクリーンキャプチャーの保存先を変更する

Macでは以下の方法でスクリーンキャプチャーをすることができます。

全画面キャプチャー

- Command+Shift+3

任意の範囲を指定してキャプチャー

1. Command+Shift+4
2. カーソルが変わるので、キャプチャーしたい範囲をマウスで指定→即キャプチャー

各ウィンドウのキャプチャー

1. Command+Shift+4
2. カーソルが変わるので、キャプチャーしたいウィンドウに移動
3. Spaceを押してウィンドウを選択。カーソルがカメラに変わる。
4. マウスの左クリック

すると、デスクトップにキャプチャーした画像が保存されます。

しかし、デスクトップに画像を保存したくない場合があると思います。
この場合は、ターミナルを開いて、次のコマンドを実行します。

~/Downloadsに保存する場合

$ defaults write com.apple.screencapture location ~/Downloads
$ killall SystemUIServer

元に戻したい場合は、

$ defaults delete com.apple.screencapture location
$ killall SystemUIServer

と実行すればデスクトップに保存されます。

CentOSにEPELやRepoForge(旧RPMForge)リポジトリを追加する

CentOSには結構な数のパッケージが標準で用意されていますが、それでも足りないパッケージはあります。
ソースを持ってきてコンパイルするのも面倒って時は、EPEL(Extra Packages for Enterprise Linux)RepoForgeのリポジトリを追加すると便利です。

追加方法は簡単で、次のコマンドで追加できます。

CentOS6の場合

$ sudo yum install http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
$ sudo yum install http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86\_64.rpm

※CentOS6以外は上記の公式HPにOS毎の*-releaseファイルへのリンクがあるので、そちらを参照してください。

これでEPELやRepoForgeからパッケージをyumコマンドで追加できるようになりましたが、このままだと標準のパッケージを追加したいのに不用意にパッケージを追加してしまう可能性があります。
このため、

$ sudo vi /etc/yum.repos.d/epel.repo
$ sudo vi /etc/yum.repos.d/rpmforge.repo

上記のファイルをそれぞれ開いて

enabled=1

となっている箇所を

enabled=0

に変更しておきます。
これで、yumを使っても勝手にインストールされることは無くなりました。

もし、EPELやRepoForgeからパッケージを追加したくなった時は、

$ sudo yum install パッケージ名 –enablerepo=epel,rpmforge

とenablerepoを付ければ一時的に指定したリポジトリが有効になります。

SSHでPermission Deniedになる場合

sshでサーバへ接続しようとすると、

Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

このようなエラーが表示されて接続できない時がある。

偉い人がこちらで対策を纏めてくれてるけど、パーミッションを見直しても間違っていない。

これで、結構悩みました。

ssh -v(もしくは-vvvなど)を実行してみましたが、

略
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /Users/hogehoge/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 279
debug1: Authentication succeeded (publickey).
略

となるはずが、

略
debug1: Offering RSA public key: /Users/hogehoge/.ssh/id_rsa
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic
debug1: Trying private key: /Users/hogehoge/.ssh/id_dsa
debug1: Trying private key: /Users/hogehoge/.ssh/id_ecdsa
debug1: Trying private key: /Users/hogehoge/.ssh/id_ed25519
debug1: No more authentication methods to try.
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

となって、接続できない。

この場合、サーバCent OS6系だと/etc/sshもしくは、~/.sshなどをls -lしてみてください。

# ls -l /etc/ssh/
-rw-r–r–. 1 root root 2047 8月 13 18:58 2015 ssh_config
略
-rw——- 1 root root 3870 2月 13 17:37 2016 sshd_config

パーミッションの後に「.」があるファイルとないファイルがある場合があります。
これは、ファイルがSELinuxで管理されていることを示しています。

私の場合、元のサーバから設定ファイルをコピーしてきたので、サーバのSELinuxが有効なまま、適切に設定されていないファイルが混じってしまい、sshdがファイルを読めなくなっていました。

対策としては、いろいろのあると思うのですが、

# vi /etc/sysconfig/selinux
SELINUX=disabled

などとして、SELinuxを無効にすると接続できるようになると思います。
もしくはls -lして.がついてるファイルに対して適切に設定してください。

pyenvのインストール

pythonのバージョンを簡単に使い分けられるように、まずはpyenvをインストールします。

pyenvのインストール


Macの場合

pyenvのインストールはMacの場合はHomebrewを使うと簡単にインストールできるので、それを利用します。
Homebrewについてはこちらをご覧ください。

brew install pyenv

また、pyenvに加えて、複数の環境をパッケージ構築できるvirtualenvもインストールしておきます。

brew install pyenv-virtualenv

Linuxの場合

以下のコマンドでGithubからダウンロードします。

$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv

インストール後の設定

インストールが完了したら、以下の内容を.profile(もしくは.bashrc等)に追加します。

# for pyenv
export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

以下のコマンドでシェルを再起動すればpyenvコマンドが使えるようになっていると思います。

exec "$SHELL"

pythonのインストールのためのパッケージを追加

Ubuntuの場合、pythonのインストールのためには次のコマンドで開発用パッケージをインストールします。

$ sudo apt install build-essential gdb lcov pkg-config \
libbz2-dev libffi-dev libgdbm-dev  libgdbm-compat-dev liblzma-dev \
libncurses5-dev libreadline6-dev libsqlite3-dev libssl-dev \
lzma lzma-dev tk-dev uuid-dev zlib1g-dev

pyenvによるpythonのインストール

pyenvを使ってpythonをインストールするには、先にpyenvを最新にアップデートしておきます。

$ pyenv update

これによりインストールできるpythonのバージョンなどが最新になります。

インストールできるバージョンを確認するには

$ pyenv install -l
Available versions:
  2.1.3
  2.2.3
  2.3.7
  2.4.0
  2.4.1
  略

とすることでインストールできるバージョンが一覧表示されます。
この中からインストールしたいバージョンを見つけたら、

$ pyenv install 3.9.13

の様に実行すると指定されたバージョンがインストールされます。

Pythonインストール時にオプションを指定する

pyinstallerなどを使おうと思ったら、

$ pyinstaller cmd.py --onefile
84 INFO: PyInstaller: 5.1
84 INFO: Python: 3.9.7
98 INFO: Platform: Linux-4.4.0-22000-Microsoft-x86_64-with-glibc2.31
略
OSError: Python library not found: libpython3.9mu.so.1.0, libpython3.9m.so, libpython3.9m.so.1.0, libpython3.9.so, libpython3.9.so.1.0
    This means your Python installation does not come with proper shared library files.
    This usually happens due to missing development package, or unsuitable build parameters of the Python installation.

    * On Debian/Ubuntu, you need to install Python development packages:
      * apt-get install python3-dev
      * apt-get install python-dev
    * If you are building Python by yourself, rebuild with `--enable-shared` (or, `--enable-framework` on macOS).

といった感じオプションつけて再構築しろと言われました。
この場合は、上記のように単にinstallするだけじゃなく、

env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.9.13

といった感じで実行するとオプションを指定してインストールすることが出来ます。

CentOSにてIPv6を無効にするには

CentOSではIPv6が有効になっているため、ifconfigを実行すると次のようにリンクローカルのアドレスが設定されていることが分かります。

eth0 Link encap:Ethernet HWaddr 52:xx:09:00:xx:02

inet addr:xxx.xxx.xxx.xxx Bcast:xxx.xxx.xxx.255 Mask:255.255.255.0

inet6 addr: fe80::xxxx:xxxx:fe00:xxxx/64 Scope:Link ←この部分

無効にするには、まず /etc/sysconfig/networkに次の行を追加します。

NETWORKING_IPV6=no

次のようにして/etc/modprobe.d/disable-ipv6.confを追加します。

sudo echo “options ipv6 disable=1 ” > /etc/modprobe.d/disable-ipv6.conf

また、ip6tablesは不要になるので自動起動を無効にします。

sudo /sbin/chkconfig ip6tables off

以上を設定した後で再起動するとIPv6が無効になります。

/sbin/ifconfig -a

を実行し、インターフェースにIPv6のアドレスが設定されていなければOKです。

追記:
CentOS7では、上記の方法で出来ませんでした。
CentOS7では、

echo “net.ipv6.conf.all.disable_ipv6 = 1” > /etc/sysctl.d/disableipv6.conf

上記のコマンドを実行後、再起動すると無効にできました。
もしかしたら、同様の方法でCentOS6でも無効化できるのかもしれませんが、試していません。

CD-ROM(DVD)がマウント出来なくなったら

cdromをマウントしようとしたら、

# mount /dev/cdrom /mnt
mount: unknown filesystem type 'iso9660'

といったエラーがでてマウント出来ないことがあると思います。

この場合、正しくモジュールがロード出来ていない可能性があります。
まずは、

# uname -a
Linux localhost.localdomain 3.10.0-229.20.1.el7.x86_64
#1 SMP Tue Nov 3 19:10:07 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

を実行して、現在のカーネルのバージョンを確認します。
そして、以下の場所にあるisofsモジュールをinsmodするとマウント出来るようになりました。

# insmod /lib/modules/3.10.0-229.20.1.el7.x86_64/kernel/fs/isofs/isofs.ko
# mount /dev/cdrom /mnt
mount: block device /dev/sr0 is write-protected, mounting read-only

UUIDを調べてfstabを再構築する

最近のCentOSなどでは以下のようなfstabになっていると思います。

/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=e01eb23e-f456-7a89-0b1c-23a4df5c6fd7 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

たまにfstabが壊れる時があると思いますが、再構築しようとするとUUIDを調べる必要が出てきます。


CentOSの場合、以下のコマンドでUUIDを調べることができます。

“UUIDを調べてfstabを再構築する” の続きを読む