らくがきちょう

なんとなく ~所属組織/団体とは無関係であり、個人の見解です~

Amazon Linux2 初期化用シェルスクリプト

しばしばテスト用の Amazon Linux2 を構築するのですが、自分なりの初期設定をスクリプト化してみました。「初期設定を手間なくすませる」方法は、他に以下が考えられると思います。

  1. Ansible で初期設定用の Playbook を作成する
  2. 初期設定を済ませた AMI を作成しておく
  3. cloud-init で初期設定する

Ansible は手軽だし、エージェントも不要なので「良い手段」のひとつだと思います。 大量にテスト用 Linux を用意するのであれば AMI 化するのもひとつの方法だと思いますが、そこまで頻度が高いわけでは無いのであれば、毎回 AWS が提供する最新ベースイメージを Ansible やスクリプト等で設定しても良いと思います。 cloud-init も手軽な方法のひとつですが、「cloud-init が使えない環境には応用し辛い」という点はデメリットだと思います。

スクリプトの内容

スクリプトにより、以下が実行されます。

  • ホスト名の設定
  • タイムゾーンを日本 (Asia/Tokyo) に設定
  • プロンプトに色を付ける
    • 管理者 (root) は赤色
    • 一般ユーザは水色
  • wheel グループに所属していれば、パスワード無しで sudo 実行可能
  • rm / cp / mv 実行時に対話的な Yes/No 確認をしない
  • 鍵交換方式で SSH ログイン可能なユーザを追加する
  • パッケージを最新にアップデートする
  • 再起動する

実行方法

以下のように実行します。 公開鍵はスペースが含まれているので、ダブルクォートで括っておきます。

curl -L https://raw.githubusercontent.com/sig9org/init-linux/master/init-amazon-linux2.sh | bash -s -- -h "HOSTNAME" -u "USERNAME" -p "PUBLIC-KEY"

スクリプト実行後

スクリプトを実行すると OS が再起動されますので、新規作成したユーザでログインし直し、パスワード無しで sudo su - 出来ることを確認します。 問題が無ければ (あれば) 古いバージョンのカーネルを削除し、Amazon Linux2 デフォルトで存在している ec2-user を削除します。

package-cleanup --oldkernels --count=1 -y
userdel -r ec2-user

参考

実際のスクリプト

#!/bin/bash

_usage() {      #(*1)
  echo "usage:"
  echo "${0} -h HOSTNAME -u USERNAME -p PUBLIC-KEY"
  exit 1
}

while getopts h:u:p: OPT
do
  case $OPT in
    "h" ) ENABLE_h="TRUE" ; VALUE_h=${OPTARG} ;;
    "u" ) ENABLE_u="TRUE" ; VALUE_u=${OPTARG} ;;
    "p" ) ENABLE_p="TRUE" ; VALUE_p=${OPTARG} ;;
    :|\?) _usage;;
  esac
done

[ "${ENABLE_h}" != "TRUE" ] && _usage
[ "${ENABLE_u}" != "TRUE" ] && _usage
[ "${ENABLE_p}" != "TRUE" ] && _usage

hostnamectl set-hostname ${VALUE_h}
timedatectl set-timezone Asia/Tokyo

echo "export PS1='\[\033[01;36m\]\u@\H\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '" >> /etc/profile
echo "export PS1='\[\033[01;31m\]\u@\H\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\\$ '" >> /root/.bashrc

sed -i -e "s/^%wheel\tALL=(ALL)\tALL/# %wheel\tALL=(ALL)\tALL/g" /etc/sudoers
sed -i -e "s/^# %wheel\tALL=(ALL)\tNOPASSWD: ALL/%wheel\tALL=(ALL)\tNOPASSWD: ALL/g" /etc/sudoers
sed -i -e "s/#PermitRootLogin yes/PermitRootLogin no/g" /etc/ssh/sshd_config
sed -i -e "s/alias rm='rm -i'/#alias rm='rm -i'/g" /root/.bashrc
sed -i -e "s/alias cp='cp -i'/#alias cp='cp -i'/g" /root/.bashrc
sed -i -e "s/alias mv='mv -i'/#alias mv='mv -i'/g" /root/.bashrc

useradd ${VALUE_u}
usermod -aG wheel ${VALUE_u}
mkdir /home/${VALUE_u}/.ssh/
chmod 700 /home/${VALUE_u}/.ssh/
cat << EOF > /home/${VALUE_u}/.ssh/authorized_keys
${VALUE_p}
EOF
chmod 600 /home/${VALUE_u}/.ssh/authorized_keys
chown -R ${VALUE_u}:${VALUE_u} /home/${VALUE_u}/.ssh/

yum -y update

reboot