技術関連の覚書

案件でやったり自宅で試したことの覚書

OpenStack

OpenStackとは、IaaS(Infrastructure as a Service)を構成するためのクラウド管理ソフトウェアで、仮想マシン管理のためのアプリケーションの集合体のことで、複数のアプリケーションから成り立っています。

構成するものとしては、コンピューティングリソース(仮想マシンを動かす仕組み)、ネットワークリソース(仮想ルータや仮想マシン間をつなぐネットワーク構成)、ストレージリソース(仮想的なHDDやリムーバブルディスクなど)でマルチテナント型クラウド(それぞれのユーザが同じ仮想ホストの中で別々のネットワークを構成すること)を提供します。

これはもともと、米Rackspaceが自社開発で利用していた「Swift」(S3相当の機能を提供)と、NASAが開発していた「Nova」(EC2相当の機能を提供)をオープンソース化したもので、2010年にOpenStackの開発を支える公式の非営利団体である「OpenStack Foundation」が設立された。これらに対して、多くの利用者や企業がさまざまなコードを寄与することにより、継続的な機能拡張・改善が行われている。

OpenStackを構成するコンポーネント

プロジェクト名 機能 特徴
Nova コンピュート 仮想マシン管理やハイパーバイザとの接続を提供
Swift オブジェクトストレージ オブジェクトストレージサービスを提供
Glance イメージ 仮想マシンの起動イメージサービスを提供
Horizon ダッシュボード GUIのダッシュボードを提供
KeyStone 認証 認証サービスを提供
Neutron ネットワーク L2/L3ネットワークと、ファイアウォールのネットワークサービスを提供
Cinder ブロックストレージ 永続的なブロックストレージサービスを提供
Heat 自動化 スクリプトによる仮想マシンの作成からアプリのインストール等を自動化
Ceilometer メータリング 各サーバからシステム情報を定期的に収集して保存
Trove データベース データベースに関わるサービスを提供
Sahara ビッグデータ ビッグデータに関わるサービスを提供 (Hadoop、Spark)

これらのコマンドで実行した値はhttpプロトコルjson形式でサーバに送られる

Docker

Docker概要

コンテナ型の仮想化

「Docker」とは、Docker社(旧dotCloud)が開発するオープンソースコンテナー管理ソフトウェアの1つです。

  • アプリケーションを「コンテナ」にパッケージングとデプロイを行い実行する
  • 1度ビルドすればどこでも動く
  • Dockerfileで再現可能
  • コンテナ仮想化により、高速にビルド、デプロイができる
  • 仮想OSのオーバーヘッドがない
  • 試験環境で動いているものをそのまま本番環境へ持っていける
  • コンテナごとに固有のIDがあり、成功したものから保存していく
  • 動かなかった場合は失敗した時点に戻ってやり直せる
  • 依存関係ごとにバージョン切り替えとロールバックできる
  • コンテナは1プロセスで動作する

Dockerのインストール

Debian

aptインストール

sudo apt-get install docker.io

apt-getでは最新版にならないので最新版をインストールする場合は

wget -q0- https://get.docker.com/ | sh

アップデートは

wget -N https://get.docker.com | sh

ユーザをdockerグループに追加する

dockerのソケットファイルにアクセスするためにrootかdockerグループのユーザである必要があるためdockerを使用するユーザに対してグループに追加する

sudo usermod -aG docker $USER

動作確認

コンテナの作成(例)

docker run -i ubuntu:15.10 /bin/bash

以下の様になればOK

root@ubuntu:/#

Dockerfile

Dockerfileの書き方

FROM centos:7

# subversion,apache,mod_dav_svnのインストール
RUN yum -y install subversion httpd mod_dav_svn

# ポート80開放
EXPOSE 80

# コンテナでの起動設定
ENTRYPOINT []

Dockerイメージの起動

runコマンド

docker run [オプション] イメージ [コマンド] [コマンドパラメータ]

主なオプション

オプション オプション(短縮形) オプションのパラメータ 内容
–ip –ip IPv4アドレス IPv4のアドレスを設定する。指定しない場合はホストマシンのIPアドレスでNATする。
–ip6 –ip6 IPv6のアドレスを指定する。指定しない場合はホストマシンのIPアドレスでNATする。
–publis -p –publis=ホスト側のポート:コンテナ側のポート 開放するポートを指定する

docker-compose

dockerのコンポーネントをまとめて実行するためのモジュール 例えば、Redmineを立ち上げるためには、MySQLredmine(Ruby on rails)、httpdを立ち上げる必要がある。

これらを1つのファイルにまとめて管理するのがdocker-componentである。

システムの終了、再起動などもまとめて1つで管理することができる。

docker-composeの後に続けるオプション

オプション 内容
build YAMLにbuild:があればそのイメージをまとめてビルドする
pull YAMLにimage:があれば素のイメージをまとめてプルする
up -d docker-compose build, docker-compose pullをした後にdocker runを実行
up -d サービス 個別のサービスを指定して実行。依存関係がある場合は関係するコンテナすべてが起動する。
logs 関係するすべての出力を表示
stpo 関係するコンテナをまとめて終了
rm 関係するコンテナをまとめて削除

docker-compose.ymlの例

# MySQL
mysql:
  restart: always
  #MySQLイメージpull
  image: mysql:latest
   #コンテナ内の環境変数設定
  environment:
   DB_USER=mysql
   DB_PASS=mysqladmin
   DB_NAME=redmine
   #ボリューム(ディスク)指定 ホスト:コンテナ[:アクセスモード]
    volumes:
      - /srv/docker/mysql:/var/lib/mysql
    # ポート指定(ホスト:コンテナ)
    ports:
      - "3306:3306" 

redmine:
  image: sameersbn/redmine:3.2.3
  # mysqlとリンク(依存関係)
  links:
    - mysql:mysql
  environment:
    - TZ=Asia/Tokyo
    - REDMINE_PORT=10083
    - REDMINE_HTTPS=false
    - REDMINE_RELATIVE_URL_ROOT=
    - REDMINE_SECRET_TOKEN=
    - REDMINE_SUDO_MODE_ENABLED=false
    - REDMINE_SUDO_MODE_TIMEOUT=15

    - REDMINE_CONCURRENT_UPLOADS=2

    - REDMINE_BACKUP_SCHEDULE=
    - REDMINE_BACKUP_EXPIRY=
    - REDMINE_BACKUP_TIME=

    - SMTP_ENABLED=false
    - SMTP_METHOD=smtp
    - SMTP_DOMAIN=www.gmail.com
    - SMTP_HOST=smtp.gmail.com
    - SMTP_PORT=587
    - SMTP_USER=redmine@wing-sol.co.jp
    - SMTP_PASS=password
    - SMTP_STARTTLS=true
    - SMTP_AUTHENTICATION=:login

    - IMAP_ENABLED=false
    - IMAP_HOST=imap.gmail.com
    - IMAP_PORT=993
    - IMAP_USER=redmine@wing-sol.co.jp
    - IMAP_PASS=password
    - IMAP_SSL=true
    - IMAP_INTERVAL=30

  ports:
    - "10083:80" 
  volumes:
    - /srv/docker/redmine/redmine:/home/redmine/data

Git

Gitのインストール

Redhat

yum -y install git

Debian

apt-get install git

サーバ用途としてのリポジトリの作成(共有リポジトリ)

Gitは分散型のファイル管理のため各マシンにリポジトリと実際に編集を行うファイルが存在するが、サーバ用途で使用する場合はリポジトリ飲みが存在することになる。 この様なリポジトリを ベアリポジトリ と呼ぶ。

ベアリポジトリへアクセスするためのグループの作成 複数ユーザに対して設定する場合はグループを設定してユーザをグループに所属させて運用する

# groupadd Gitにアクセスするグループ

ベアリポジトリへアクセスするためのユーザの作成

# useradd -g Gitにアクセスするグループ ユーザ

作成したユーザのパスワードを設定する

# passwd ユーザ

ベアリポジトリを作成するディレクトリの作成 慣例的に末尾を.gitにする

# mkdir -p リポジトリ用ディレクトリ.git

ベアリポジトリの作成 gitアクセスユーザにsuする

# su - ユーザ

$ cd リポジトリ用ディレクトリ.git

ベアリポジトリの作成

–bare ベアリポジトリの作成 –shared ベアリポジトリの作成を行ったユーザが所属するグループに対して書き込み権限を付与する

$ git init --bare --shared

ベアリポジトリへの接続方法

Gitサーバへアクセスするプロトコルはgit、http、httpssshがある。 そのうち、読み書きのできるプロトコルsshとなる。 sshへの接続法法は、sshへアクセスできるユーザを作成してそのユーザで認証する方式と、ssh公開鍵を利用して接続する方法がある。

sshでの接続方法

git clone ssh://サーバ:[ポート]/リポジトリパス.git

GitLabのインストール

事前準備

httpdの停止

systemctl stop httpd.service
systemctl disable.httpd.service

https://about.gitlab.comからダウンロード このページをブラウザで開き、OSを選択して書かれているとおりにコンソールへコピペするとインストールができます。

Gitを使ったファイル管理

Gitの特徴である分散型ファイル管理の方法では必ず競合の問題が関わってくるが、それを克服すれば中央管理型のファイル管理よりも高速で、ローカル内でエラーを気にすることなく管理することができるツールとなる。

中央管理型(SVNなど)でリモートリポジトリとローカルリポジトリを作成して管理する場合、それぞれのリポジトリは別のものであり、それをマージすることは困難(そもそも別リポジトリでのマージはサポートされていないので不可能と言ってもいい)になるが、 分散管理型の場合、リモートとローカルとの同期(プル、プッシュ)やブランチ間のマージ機能が強化されているため通常はmasterをマージしてからコミットすればほとんど競合を起こすことなくマージリクエストを出すことが可能となります。

Gitを使った管理方法

テスト時に接続するDBの設定が違う場合に設定ファイルを書き直さなければならなかったり、状況に応じて設定を変えたい場合などは、ローカルのみでブランチを作成してそこでファイルを管理して、チェックアウト後や一時的にリモートに合わせてコミットしたファイルを戻すときに楽になります

マージ

ローカルリポジトリとリモートリポジトリが分かれているためGitえかマージ作業が必要不可欠です。 ローカルで管理しているリポジトリとリモートリポジトリとの同期をとる作業がプルやプッシュ、ブランチとマスターとの同期をとる作業がマージとなります。

Gitの基本的な運用はmasterを主としてファイルを管理し、それぞれの担当者がブランチを作成して、 それをローカルリポジトリで管理しながら作成後にmasterへのマージリクエストを出してリリースします。 まずはプルしてリモートのブランチと同期をとり、そのあとmasterとマージしておけばマージリクエストでの競合を防ぐことが出来ます。

Subversionのインストール

サーバ準備

firewallでhttpdのアクセスを許可

firewall-cmd --zone=public --add-service=http --permanent

subversion関連のインストール

subversionapache、mod_dav_svnのインストール

yum -y install subversion httpd mod_dav_svn

/etc/httpd/conf.module.d/10-subversion.conf を編集

LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so
LoadModule dontdothat_module  modules/mod_dontdothat.so

Alias /svn/repos /home/manage/svn/repos

<Location /svn/repos>
    DAV svn
    SVNParentPath /home/manage/svn/repos/
    AuthType Basic
    AuthName "Subversion repositories" 
    AuthUserFile /etc/svn-auth-users
    Require valid-user
</Location>

Digest認証の場合

LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so
LoadModule dontdothat_module  modules/mod_dontdothat.so

Alias /svn/repos /home/manage/svn/repos

<Location /svn/repos>
    DAV svn
    SVNParentPath /home/manage/svn/repos/
    AuthType Digest
    AuthName "Subversion repositories" 
    AuthUserFile /etc/svn-auth-users
    Require valid-user
</Location>

htdigest -c 認証ファイル AuthNameで書いてある文字 ユーザ名

バックアップ

svnadmin dump リポジトリパス > ダンプファイル名

リストア

svnadmin load 新リポジトリパス < ダンプファイル名

httpsの設定

OpenSSL,mod_sslのインストール

yum -y install openssl mod_ssl

秘密鍵の設定

# cd /etc/httpd/conf
# openssl genrsa -aes128 1024 >server.key
Generating RSA private key, 1024 bit long modulus
........++++++
.....++++++
e is 65537 (0x10001)
Enter pass phrase: ←パスフレーズ入力
Verifying - Enter pass phrase: ←同じパスフレーズを入力
公開鍵ファイルの作成
# openssl req -new -key server.key > server.csr
Enter pass phrase for server.key: ←秘密鍵作成で入力したパスフレーズを入力
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Minato
Organization Name (eg, company) [Default Company Ltd]:examples
Organizational Unit Name (eg, section) []:1S
Common Name (eg, your name or your server's hostname) []:example.com
Email Address []:info@example.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ←そのままEnterでOK
An optional company name []: ←そのままEnterでOK

firewallの設定

# firewall-cmd --add-service=https --zone=public --permanent 
firewallの再起動
# firewall-cmd --reload

CentOS7

CentOS6からの変更点

内容 CentOS6 CentOS7
デフォルトファイルシステム ext4 xfs
ブートローダ GRUB GRUB2
セキュリティ設定 iptables firewall+iptables
サービス起動 service サービス名 start systemctl start ユニット名[.service]
サービス再起動 service サービス名 restart systemctl restart ユニット名[.service]
サービス停止 service サービス名 stop systemctl stop ユニット名[.service]
サービス自動起動設定 chkconfig スクリプト名 on systemctl enable ユニット名
サービス自動起動停止 chkconfig スクリプト名 off systemctl disable ユニット名
サービス状態確認 chkconfig –list systemctl list-util-files
ホスト名変更 hostname ホスト名 hostnamectl set-hostname ホスト名
ネットワーク設定 /etc/sysconfig/network-script/ifcfg-ethXの変更とnetwork restart nmtui(GUI)
nmcli(コマンド)
ネットワーク状態確認 netstat ip n
ネットワークインタフェースの状態 netstat -i ip -s l
ネットワークインタフェースの起動 ifup eth0 nmcli c up eno0
ネットワークインタフェースの停止 ifdown eth0 nmcli c down eno0

プロキシを経由する場合の設定

yum /etc/yum.confにproxyの設定を記述

proxy=http://ホスト:ポート
proxy_username=ユーザ
proxy_password=パスワード

curl

~/.curlrc ファイルを編集する

proxy="http://ホスト:ポート