のぴぴのメモ

自分用のLinuxとかの技術メモ

"LB + Web x 2 + RDB"マルチAZ”でWordPressをインストールするCloudFormation

はじめに

前にAWSさんの体験ハンズオンで経験した"LB + Web x 2 + DB x 2"環境構築して、そこに動作確認としてWordPressをインストールして動かすところまでの手順を、CloudFormationを使って自動化して見ました。WordPressのインストールは、CloudFormationのcfn-init ヘルパースクリプトを使っています。

構成概要

f:id:nopipi:20170910213131p:plain

  • 東京リージョンでの利用前提(手抜きです)
  • Webサーバ用のPublicSubnetを2つと、RDB用のPrivateSubnetを2つ作成
  • Subnetは2つのAZ(AvailabilityZone)にサブネットをそれぞれ配備する
  • WebサーバへのWordPressインストールは、cfn-init ヘルパースクリプトを利用。下記作業時実施。
    • 前提パッケージと、WordPressのダウンロードと解凍コピー
    • 定義ファイルの作成
    • サービスの起動

CloudFormationコード

SRPM展開&Gun global解析&squashfs化する自作ツールの説明

1.ツールができること

"srpm2html.py"は、SRPMソースコードを展開、Gnu global処理、その他諸々を自動化する自作ツールです。
具体的には、このツールを使うと以下の一連の作業をサボることができます。

コードはgithub(gist)に登録してあります。

2.インストール方法

2.1 前提環境

Linuxであれば多分動くと思います。(私は、CentOS6,AmazonLinux上で利用しています)

2.2 前提パッケージ

この自作ツールを実行するためには以下のrpmパッケージが必要です。*1*2

下記コマンドでRPMパッケージをインストールします。

sudo yum install rpm-build squashfs-tools gcc make ncurses-devel

2.3 Gnu Globalのインストー

Gnu globalはソースコードをダウンロードしてmakeします。

wget http://tamacom.com/global/global-6.5.6.tar.gz
tar -xxvf global-6.5.6.tar.gz
cd global-6.5.6
./configure
make
sudo make install

2.4 ツールのセットアップ

srpm2html.pyは、githubに登録してあるのでそこからダウンロードします。

cd "セットアップしたいディレクトリパスを指定"
wget https://gist.githubusercontent.com/Noppy/027ea703dd7084be0c3d4d99ce618109/raw/1e3eefeb83c7542d37c8c455701a0f727df128d4/srpm2html.py
chmod +x srpm2html.py 

2.5 ディレクトリの準備

デフォルトでは下記ディレクトリが必要になります。ディレクトリは実行時の引数(後述)または、pythonの先頭のデフォルト設定を書き換えることで変更可能です。

  • 必要なディレクト
    1. /tmp : srpmのダウンロードと追加するfstabの作成に使用。容量は利用しない。
    2. /data/rpmbuild : srpmインストール、コード展開、globl解析をするメイン作業用。
      • 大量のファイルを作成するため、ファイルシステムフォーマット時にするinodeを潤沢に確保したほうが良い
        • フォーマット例:mkfs.ext4 -L rpmbuild -i 2048 /dev/sdb1
      • メモリが潤沢にある場合は、tmpfs(メモリファイルシステム)の利用が良い。
    3. /data/squshfs : 作成したsquashfsファイルの格納先
    4. /data/kernel : Globalが生成したhtmlのsquashfs化したもののマウントポイントを作成するディレクトリ(kernelのsrpmを解析した場合)
    5. /data/tools : 上記と同じ(kernel以外の、srpmを解析した場合)
    6. /data/source:ソースコードsquashfs化したもののマウントポイントを作成するディレクト

2.6 sudo設定

最後のfstab更新とマウント実行時に、sudoコマンドを利用しています。srpm2html.py実行ユーザがsudoでroot昇格できるように設定を事前にして下さい。またパスワード入力が面倒な方は、NOPASSWDもして下さい。

3.使い方

3.1 簡単な使い方

簡単な使い方は以下のとおりです。

./srpm2html.py "SRPMファイルのURL"

例えば、CentOS7.3のカーネルソースを展開したい場合は以下の通りになります。

srpm2html.py http://vault.centos.org/7.3.1611/os/Source/SPackages/kernel-3.10.0-514.el7.src.rpm

3.2 引数の説明

  • 構文
usage: srpm_to_html.py [-h] [-d] [-t TMPDIR] [-r RPMBUILDDIR] [-s SQUASHFSDIR]  
                       [-K HTTP_KERNELSDIR] [-T HTTP_TOOLSDIR] [-S SOURCEDIR]  
                       SRPM_FilePath_or_URL
  • 必須引数
    • SRPM_FilePath_or_URL: srpmのURLまたは、ローカルに格納しているsrpmのファイルパスを指定します。
  • 主なオプション詳細
    • -h, --help : ヘルプの表示
    • -t TMPDIR, --tmpdir TMPDIR : tmpディレクトリの指定
    • -r RPMBUILDDIR, --rpmbuilddir RPMBUILDDIR : srpmの展開先と作業用ディレクトリの指定
    • -s SQUASHFSDIR, --squashfsdir SQUASHFSDIR : squashfsファイルの格納先ディレクトリ指定
    • -K HTTP_KERNELSDIR, --http_kernelsdir HTTP_KERNELSDIR : マウントポイントを作成するディレクトリ指定(kernel)
    • -T HTTP_TOOLSDIR, --http_toolsdir HTTP_TOOLSDIR : マウントポイントを作成するディレクトリ指定(kernel以外)
    • -S SOURCEDIR, --sourcedir SOURCEDIR : マウントポイントを作成するディレクトリ指定(ソースコード)

*1:gcc,make,ncurses-develは、Gnu globalインストール時に必要

*2:pythonも必要ですが、標準で大抵インストールされているので割愛

SRPMインストール先を指定する方法

ソースコードをパッケージ化したSRPM(拡張子がsrc.rpmのファイル)のインストール先は、デフォルトでは"${HOME}/rpmbuild"になります。(CentOS5/RHEL5以前は"/usr/src/redhat")。このデフォルトのインストール先を変更する方法を説明します。

1.普通にSRPMをインストールした場合

SRPMrpmコマンドでインストールします。

$rpm -ivh lsof-4.87-4.el7.src.rpm 

デフォルトでインストールした場合は、ホームディレクトリ配下のrpmbuildディレクトリにインストールされます。

/home/n/rpmbuild/
├── SOURCES
│   ├── lsof_4.87-rh.tar.xz
│   └── upstream2downstream.sh
└── SPECS
    └── lsof.spec

2.インストールディレクトリを指定する方法

2.1 RPMのマクロ定義ファイル("~/.rpmmacros")で指定

ネットを調べるとたいてい出てくる方法はこちらの方法になります。rpmコマンドでのSRPMインストールと、その後のrpmbuildコマンドによるビルド操作で都度、引数でディレクトリを指定する手間を考えると、マクロ定義ファイルで予め定義するほうが現実的な気はします。

(1)マクロ定義ファイルの設定

インストール先のトップディレクトリは、"%_topdir"変数になるので、この変数をマクロ定義ファイルで変更します。

$echo "%_topdir /data/rpmbuild" > ~/.rpmmacros
(2)SRPMのインストール
$rpm -ivh lsof-4.87-4.el7.src.rpm 

2.2 コマンド引数でインストールディレクトリを指定する方法

ホームディレクトリに".rpmmacros"ファイルを作成したくない場合や、一時的にインストールディレクトリを変更したい場合は、"--define="引数でマクロの変数を変更します。

$rpm -ivh --define='%_topdir /data/rpmbuild' lsof-4.87-4.el7.src.rpm

cloudformation VPC(PubSub x 2, PrivateSub x 2) + 1 Instance(t2.micro, AmazonLinux) を作るテンプレート

概要

自分用のメモです。"一つ前の記事"VPCのPublicASubにインスタンスを一つ追加したテンプレートです。

作成されるもの

  • VPC × 1
  • サブネット × 4
    • PubASub CIDR:10.0.1.0/24, AZ: ap-northeast-1a ルートテーブル: インターネットへのルーティングあり
    • PubBSub CIDR:10.0.2.0/24, AZ: ap-northeast-1c ルートテーブル: インターネットへのルーティングあり
    • PrivateASub CIDR:10.0.11.0/24, AZ: ap-northeast-1a
    • PrivateBSub CIDR:10.0.12.0/24, AZ: ap-northeast-1c
  • セキュリティグループ × 2
    • WebSecurityGroup: HTTP(port80),HTTPS(port443)を全て許可
    • SSHSecurityGroup: SSH(port22)を全て許可
  • インスタンス × 1
    • 利用イメージ: AmazonLinux("ami-56d4ad31")
    • インスタンスタイプ : t2.micro
    • サブネット: PubASub(インターネット接続あり)
    • SSHキーペア: "xxxxxxxxxxxxx"となっているので適切に修正
    • 追加EBS:
      • タイプ: デフォルトの「汎用 SSD (gp2)」
      • サイズ:20GiB
      • バイス名:/dev/xvdb

※AZは東京の場合

構成概要

f:id:nopipi:20170212222757p:plain

テンプレート

cloudformation VPC(2つのパブリックsub+2つのプライベートsub)を作るテンプレート

概要

自分用のメモです。下記のようなvpcを作るテンプレートです。

作成されるもの

  • VPC × 1
  • サブネット × 4
    • PubASub CIDR:10.0.1.0/24, AZ: ap-northeast-1a ルートテーブル: インターネットへのルーティングあり
    • PubBSub CIDR:10.0.2.0/24, AZ: ap-northeast-1c ルートテーブル: インターネットへのルーティングあり
    • PrivateASub CIDR:10.0.11.0/24, AZ: ap-northeast-1a
    • PrivateBSub CIDR:10.0.12.0/24, AZ: ap-northeast-1c
  • セキュリティグループ × 2
    • WebSecurityGroup: HTTP(port80),HTTPS(port443)を全て許可
    • SSHSecurityGroup: SSH(port22)を全て許可

※AZは東京の場合

構成概要

f:id:nopipi:20170211175348p:plain

テンプレート

ubuntuで古いカーネルを削除する方法(/bootの空きが足りない時とか)

1.はじめに

ubuntuで「ソフトウェアの更新」で「/bootのディスク容量が足りない」と言われてしまった時の対処方法です。
ubuntuが結構頻繁にkernelの更新を行うようで、私は半年ぐらい周期で/bootが足りなくなります。

f:id:nopipi:20170210112308p:plain

2.対処方法(古いkernelの削除)

(1)現在のカーネルバージョンの確認

$ uname -r
4.4.0-59-generic

(2)インストール済みカーネルのバージョン一覧を確認

現在利用中のカーネルバージョン(4.4.0-59)以外のバージョン(4.4.0-38、4.4.0-45、4.4.0-47、4.4.0-51、の4つ)をこれから削除します。

$ dpkg --get-selections |grep linux-
linux-base					install
linux-cloud-tools-4.4.0-38			install
linux-cloud-tools-4.4.0-38-generic		install
linux-cloud-tools-4.4.0-45			install
linux-cloud-tools-4.4.0-45-generic		install
linux-cloud-tools-4.4.0-47			install
linux-cloud-tools-4.4.0-47-generic		install
linux-cloud-tools-4.4.0-51			install
linux-cloud-tools-4.4.0-51-generic		install
linux-cloud-tools-common			install
linux-cloud-tools-generic			install
linux-firmware					install
linux-generic					install
linux-headers-4.4.0-36				install
linux-headers-4.4.0-36-generic			install
linux-headers-4.4.0-38				install
linux-headers-4.4.0-38-generic			install
linux-headers-4.4.0-45				install
linux-headers-4.4.0-45-generic			install
linux-headers-4.4.0-47				install
linux-headers-4.4.0-47-generic			install
linux-headers-4.4.0-51				install
linux-headers-4.4.0-51-generic			install
linux-headers-4.4.0-59				install
linux-headers-4.4.0-59-generic			install
linux-headers-generic				install
linux-image-4.4.0-36-generic			install
linux-image-4.4.0-38-generic			install
linux-image-4.4.0-45-generic			install
linux-image-4.4.0-47-generic			install
linux-image-4.4.0-51-generic			install
linux-image-4.4.0-59-generic			install
linux-image-extra-4.4.0-36-generic		install
linux-image-extra-4.4.0-38-generic		install
linux-image-extra-4.4.0-45-generic		install
linux-image-extra-4.4.0-47-generic		install
linux-image-extra-4.4.0-51-generic		install
linux-image-extra-4.4.0-59-generic		install
以下略

(3)コマンドをテスト実行確認(DryーRun)

apt-getコマンドで古いカーネルパッケージを削除します。
”--purge”オプションで削除するパッケージを指定しますが、指定が正しいか確認するため”--dry-run”オプションで空実行させて確認します。

$ sudo apt-get --dry-run autoremove --purge linux-{headers,image}-4.4.0-{36,38,45,47,51}
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
<省略>
アップグレード: 0 個、新規インストール: 0 個、削除: 39 個、保留: 234 個。
Purg linux-cloud-tools-4.4.0-38-generic [4.4.0-38.57]
Purg linux-cloud-tools-4.4.0-38 [4.4.0-38.57]
Purg linux-cloud-tools-4.4.0-45-generic [4.4.0-45.66]
Purg linux-cloud-tools-4.4.0-45 [4.4.0-45.66]
Purg linux-cloud-tools-4.4.0-47-generic [4.4.0-47.68]
Purg linux-cloud-tools-4.4.0-47 [4.4.0-47.68]
Purg linux-headers-4.4.0-36-generic [4.4.0-36.55]
Purg linux-headers-4.4.0-36 [4.4.0-36.55]
Purg linux-headers-4.4.0-38-generic [4.4.0-38.57]
Purg linux-headers-4.4.0-38 [4.4.0-38.57]
Purg linux-headers-4.4.0-45-generic [4.4.0-45.66]
Purg linux-headers-4.4.0-45 [4.4.0-45.66]
Purg linux-headers-4.4.0-47-generic [4.4.0-47.68]
Purg linux-headers-4.4.0-47 [4.4.0-47.68]
Purg linux-headers-4.4.0-51-generic [4.4.0-51.72]
Purg linux-headers-4.4.0-51 [4.4.0-51.72]
Purg linux-signed-image-4.4.0-36-generic [4.4.0-36.55]
Purg linux-image-extra-4.4.0-36-generic [4.4.0-36.55]
Purg linux-image-4.4.0-36-generic [4.4.0-36.55]
Purg linux-signed-image-4.4.0-38-generic [4.4.0-38.57]
Purg linux-image-extra-4.4.0-38-generic [4.4.0-38.57]
Purg linux-image-4.4.0-38-generic [4.4.0-38.57]
Purg linux-signed-image-4.4.0-45-generic [4.4.0-45.66]
Purg linux-image-extra-4.4.0-45-generic [4.4.0-45.66]
Purg linux-image-4.4.0-45-generic [4.4.0-45.66]
Purg linux-signed-image-4.4.0-47-generic [4.4.0-47.68]
Purg linux-image-extra-4.4.0-47-generic [4.4.0-47.68]
Purg linux-image-4.4.0-47-generic [4.4.0-47.68]
Purg linux-signed-image-4.4.0-51-generic [4.4.0-51.72]
Purg linux-image-extra-4.4.0-51-generic [4.4.0-51.72]
Purg linux-image-4.4.0-51-generic [4.4.0-51.72]
Purg linux-tools-4.4.0-36-generic [4.4.0-36.55]
Purg linux-tools-4.4.0-36 [4.4.0-36.55]
Purg linux-tools-4.4.0-38-generic [4.4.0-38.57]
Purg linux-tools-4.4.0-38 [4.4.0-38.57]
Purg linux-tools-4.4.0-45-generic [4.4.0-45.66]
Purg linux-tools-4.4.0-45 [4.4.0-45.66]
Purg linux-tools-4.4.0-47-generic [4.4.0-47.68]
Purg linux-tools-4.4.0-47 [4.4.0-47.68]

4.4.0-36,38,45,47,51の5つのバージョンが選択されていることを確認します。

(4)パッケージを削除する

”--dry-run”オプションを外して削除実行します。

$ sudo apt-get autoremove --purge linux-{headers,image}-4.4.0-{36,38,45,47,51}

(5)削除されたか確認

4.4.0-51以外のバージョンのカーネル削除されたか確認します。

$ dpkg --get-selections |grep linux-
linux-base					install
linux-cloud-tools-4.4.0-51			install
linux-cloud-tools-4.4.0-51-generic		install
linux-cloud-tools-common			install
linux-cloud-tools-generic			install
linux-firmware					install
linux-generic					install
linux-headers-4.4.0-59				install
linux-headers-4.4.0-59-generic			install
linux-headers-generic				install
linux-image-4.4.0-59-generic			install
linux-image-extra-4.4.0-59-generic		install
linux-image-extra-virtual			install
linux-image-generic				install
linux-libc-dev:amd64				install
linux-signed-generic				install
linux-signed-image-4.4.0-59-generic		install
linux-signed-image-generic			install
linux-sound-base				install
linux-tools-4.4.0-51				install
linux-tools-4.4.0-51-generic			install
linux-tools-common				install
linux-tools-generic				install
syslinux-common					install
syslinux-legacy					install

ansibleのベストプラクティスなplaybookレイアウトを作るシェル

ansibleのベストプラクティスなplaybookディスクレイアウトがあります。

このディレクトリを手動で作成するのが面倒なので簡単なシェルを作成しました。
こんなディレクトリレイアウトとmain.ymlの空ファイルを作成します。

group_vars/
host_vars/
site.yml                  # master playbook
roles/
    RoleName1/               # this hierarchy represents a "role"
        tasks/            #
            main.yml      #  <-- tasks file can include smaller files if warranted
        handlers/         #
            main.yml      #  <-- handlers file
        templates/        #  <-- files for use with the template resource
        files/            #
        vars/             #
            main.yml      #  <-- variables associated with this role
        defaults/         #
            main.yml      #  <-- default lower priority variables for this role
        meta/             #
            main.yml      #  <-- role dependencies

コードはこちら。