序章

データと運用要件をあるサーバーから別のサーバーに移動しなければならないシナリオはたくさんあります。 ソリューションを新しいデータセンターに実装するか、より大きなマシンにアップグレードするか、新しいハードウェアまたは新しいVPSプロバイダーに移行する必要がある場合があります。

理由が何であれ、あるシステムから別のシステムに移行する際には、さまざまな考慮事項を考慮する必要があります。 Chef、Puppet、Ansibleなどの構成管理ソリューションを使用していない場合、機能的に同等の構成を取得するのは難しい場合があります。 データを転送するだけでなく、新しいマシンでも同じように動作するようにサービスを構成する必要があります。

前回の記事では、サーバーをデータ移行用に準備しました。 この時点で、ターゲットシステムとソースシステムは通信できるはずです—ターゲットシステムはソースシステムへのSSHアクセスを持っている必要があります。 また、バージョン番号を含む、転送する必要のあるソフトウェアとサービスのリストが必要です。 このガイドでは、中断したところから続行し、新しいサーバーへの実際の移行を開始します。

注:ここでの一般的な考え方は、ターゲットシステムを可能な限りクリーンに保ちながら、関連するすべての情報を転送することです。 一部の移行戦略では、ルートパーティションを完全に複製したり、ソースマシンのルートでコピー操作を開始したりしながら、競合の原因となることがわかっているいくつかのファイルを手動で除外する場合があります。 ただし、大量のシステムデータを稼働中のオペレーティングシステムに移行すると、予期しない結果が発生したり、運用要件に関連しなくなったファイルで新しいシステムが不必要に乱雑になったりする可能性があります。 このチュートリアルでは、代わりに、除外ではなく包含によって選択的に移行して、より良い最終結果を作成します。

ステップ1-移行スクリプトの作成

このチュートリアルと次のチュートリアルでは、移行の作成と追加に焦点を当てます。 bash 進むにつれてシェルスクリプト。 多数の低レベルのLinuxツールを使用し、それらをすべてインタラクティブに実行するのではなく、サーバー構成の関連部分をキャプチャできる再現可能な一連の手順を実行することを目標にする必要があります。

このスクリプトを作成すると、作業を進めながらスクリプトを繰り返し実行できるようになります。 このチュートリアルで使用されるほとんどのツール(次のような) rsyncは、前回の実行以降に変更された場合にのみデータを転送するため、コマンドを冗長にすることを心配することなく、コマンドを安全に繰り返すことができます。 新しい(ターゲット)サーバーから original (ソース)マシンへの接続を有効にするようにSSHを構成したため、このチュートリアル全体を通してターゲットサーバーから作業する必要があります。

このスクリプトは、を使用してホームディレクトリに作成できます。 nano またはお気に入りのテキストエディタ:

  1. nano ~/sync.sh

ファイルの最初の行に、スクリプトの見出しを追加します。これは、 shebang. これは、デフォルトでどのインタープリターを実行するかをスクリプトに指示します。 #!/bin/bash スクリプトがデフォルトで bash シェル。これは、ほとんどのシステムで利用できる最も強力で広くサポートされているシェルです。

〜/ sync.sh
#!/bin/bash

今のところ、ファイルを保存して閉じます。 使用している場合 nano、 押す Ctrl+X、プロンプトが表示されたら、 Y その後 Enter.

コマンドラインに戻り、次を使用してスクリプトを実行可能にします。 chmod:

  1. chmod 700 ~/sync.sh

方法の詳細な概要については chmod Linuxパーミッションが機能する場合は、Linuxパーミッションの概要を参照してください。

スクリプトを実行可能にし、シバンを追加したら、スクリプトを直接呼び出すことで実行できます。

  1. ~/sync.sh

スクリプトが空であるため、まだ出力は生成されません。 必要に応じて、このチュートリアルのrestを使用してスクリプトを定期的にテストする必要があります。 このシリーズの前のチュートリアルと同様に、次のコマンドで実行する必要がある場合があります。 sudo スクリプトに追加するステップに応じて、権限。

ステップ2–必要なプログラムとサービスのインストール

移行スクリプトに追加する最初のステップは、前のチュートリアルで移行用にマークしたパッケージを復元することです。

追加のリポジトリを追加する

その前に、別の端末で original (ソース)サーバーに再度接続して、サードパーティのリポジトリからソフトウェアがインストールされているかどうかを確認する必要があります。 その場合、最初にこれらの追加のパッケージソースを構成しない限り、これらのパッケージを新しい環境に再インストールすることはできません。

UbuntuおよびDebian環境では、いくつかの場所を調査することで、ソースシステムに代替リポジトリが存在するかどうかを確認できます。

  1. cat /etc/apt/sources.list
Output
… ## Uncomment the following two lines to add software from Canonical's ## 'partner' repository. ## This software is not part of Ubuntu, but is offered by Canonical and the ## respective vendors as a service to Ubuntu users. # deb http://archive.canonical.com/ubuntu impish partner # deb-src http://archive.canonical.com/ubuntu impish partner deb http://security.ubuntu.com/ubuntu impish-security main restricted # deb-src http://security.ubuntu.com/ubuntu impish-security main restricted deb http://security.ubuntu.com/ubuntu impish-security universe # deb-src http://security.ubuntu.com/ubuntu impish-security universe deb http://security.ubuntu.com/ubuntu impish-security multiverse # deb-src http://security.ubuntu.com/ubuntu impish-security multiverse

これはメインのパッケージソースリストです—単一のファイルであるため、次を使用できます cat その内容を出力します。 ファイルの最後の行に ubuntu.com アドレスの場合、おそらくこのファイルにサードパーティのリポジトリを追加していません。 追加のリポジトリもリストすることができます sources.list.d ディレクトリ:

  1. ls /etc/apt/sources.list.d
Output
droplet-agent.list elastic-7.x.list nodesource.list

このディレクトリが空でない場合は、次のことができます cat 各リポジトリをチェックするための個々のファイル:

  1. cat /etc/apt/sources.list.d/elastic-7.x.list
Output
deb https://artifacts.elastic.co/packages/7.x/apt stable main

これにより、ターゲットマシンに再度追加する必要があるリポジトリのURLがわかります。 ほとんどの場合、あなたはそれを行うことができます add-apt-repository 指図:

  1. sudo add-apt-repository repo_url

RHEL、Rocky、またはFedora Linuxでは、代わりに使用できます dnf サーバー用に構成されたリポジトリーをリストするには、次のようにします。

  1. dnf repolist enabled

次に、を使用してターゲットシステムにリポジトリを追加できます。 dnf config-manager:

  1. sudo dnf config-manager --add-repo repo_url

ソースリストに変更を加えた場合は、ターゲットシステムの移行スクリプトの上部にコメントとして追加します。 このように、新規インストールから開始する必要がある場合は、新しい移行を試行する前に、どのような手順を実行する必要があるかがわかります。

  1. nano ~/sync.sh
〜/ sync.sh
#!/bin/bash

#############
# Prep Steps
#############

# Add additional repositories to /etc/apt/source.list
#       deb http://example.repo.com/linux/deb stable main non-free

次に、ファイルを保存して閉じます。

バージョン制約の指定とインストール

これで、ソースマシンと一致するようにターゲットマシンでパッケージソースが更新されました。

UbuntuまたはDebianマシンでは、次のように入力することで、ターゲットマシンに必要なバージョンのソフトウェアをインストールできます。

  1. sudo apt update
  2. sudo apt install package_name=version_number

照合しようとしているパッケージのバージョンが数か月以上前のものである場合は、公式リポジトリから削除されている可能性があります。 この場合、古いバージョンの .deb パッケージ(たとえば、古いアップストリームリポジトリまたはサードパーティのPPAを参照して)とその依存関係を参照し、次のコマンドを使用して手動でインストールします。

  1. sudo dpkg -i package.deb

ただし、バージョンの不一致があるパッケージが多すぎる状況を回避するために、これは非常に慎重に行う必要があります。 古いバージョンのソフトウェアがすぐに利用できない場合は、最初に利用可能な最新のリリースをテストして、それらがまだニーズを満たしているかどうかを確認し、古い要件を課さないようにします。

RHEL、Rocky、またはFedora Linuxの場合、次のように入力して特定のバージョンのソフトウェアをインストールできます。

  1. Sudo dnf install package_name-version_number

新しいバージョンを優先してリポジトリから削除されたrpmファイルを探す必要がある場合は、次のコマンドを使用してインストールできます。 dnf :

  1. dnf install package_name.rpm

ここでも、実行している操作を追跡します。 作成するスクリプトにコメントとして含めることができます。

  1. nano ~/sync.sh
〜/ sync.sh
#!/bin/bash

#############
# Prep Steps
#############

# Add additional repositories to /etc/apt/source.list
#       deb http://example.repo.com/linux/deb stable main non-free

# Install necessary software and versions
#       apt-get update
#       apt-get install apache2=2.2.22-1ubuntu1.4 mysql-server=5.5.35-0ubuntu0.12.04.2 libapache2-mod-auth-mysql=4.3.9-13ubuntu3 php5-mysql=5.3.10-1ubuntu3.9 php5=5.3.10-1ubuntu3.9 libapache2-mod-php5=5.3.10-1ubuntu3.9 php5-mcrypt=5.3.5-0ubuntu1

もう一度、ファイルを保存して閉じます。

ステップ3–データの転送を開始する

データの実際の転送は、通常、移行の中で最も労働集約的な部分ではありませんが、最も時間のかかる部分になる可能性があります。 大量のデータを含むサーバーを移行する場合は、後でではなく、より早くデータの転送を開始することをお勧めします。

Rsyncは、チェックサム検証やその他の機能が組み込まれた、さまざまな環境でファイルやディレクトリを複製するためのさまざまなオプションを提供する強力なツールです。 データを転送するディレクトリを特定し、追加します rsync 移行スクリプトへのコマンド。

サンプル rsync コマンドは次のようになります。

  1. rsync -azvP --progress source_server:/path/to/directory/to/transfer /path/to/local/directory

-azvP Rsyncオプションの典型的なセットです。 それらのそれぞれが行うことの内訳として:

  • a このコピー操作で「アーカイブモード」を有効にします。これにより、ファイルの変更時間や所有者などが保持されます。 また、それぞれを提供することと同等です。 -rlptgoD オプションを個別に(はい、本当に)。 特に、 -r オプションは、ネストされたファイルとフォルダーもコピーするためにサブディレクトリに再帰するようにRsyncに指示します。 このオプションは、次のような他の多くのコピー操作に共通です。 cpscp.
  • z 可能であれば、転送自体の間にデータを圧縮します。 これは、低速接続を介した転送、特にログやその他のテキストなど、非常に効果的に圧縮されるデータを転送する場合に役立ちます。
  • v 詳細モードを有効にするので、転送の進行中に転送の詳細を読むことができます。
  • P 転送を後で再開できるように、完全に転送されないファイルの部分的なコピーを保持するようにRsyncに指示します。

適切な作成方法について詳しく知ることができます rsync この記事を読んでコマンドを実行します。 場合によっては、実行する前に、ターゲットの宛先につながる親ディレクトリを作成する必要があります。 rsync .

の追加で rsync コマンドを実行すると、同期スクリプトは次のようになります。

〜/ sync.sh
#!/bin/bash

#############
# Prep Steps
#############

# Add additional repositories to /etc/apt/source.list
#       deb http://example.repo.com/linux/deb stable main non-free

# Install necessary software and versions
#       apt-get update
#       apt-get install apache2=2.2.22-1ubuntu1.4 mysql-server=5.5.35-0ubuntu0.12.04.2 libapache2-mod-auth-mysql=4.3.9-13ubuntu3 php5-mysql=5.3.10-1ubuntu3.9 php5=5.3.10-1ubuntu3.9 libapache2-mod-php5=5.3.10-1ubuntu3.9 php5-mcrypt=5.3.5-0ubuntu1

#############
# File Transfer
#############


# Rsync web root
rsync -azvP --progress source_server:/var/www/site1 /var/www/

# Rsync home directories
. . .

これらのコマンドは再実行でき、ソースファイルが変更されない限り新しいデータを転送しないため、テスト中にこのスクリプトに段階的に追加できることに注意してください。 どのディレクトリを含めるかについては、保守的かつ反復的にしてください。

データベースおよびその他の非ファイルデータの移行

を使用してすべてのデータを必ずしもコピーできるとは限らないことに注意してください rsync 追加の準備なし。 データベースなどの多くのアプリケーションは、データベースシャーディングなどの手法を使用してアクセスを最適化するために、関連データをファイルシステム内の複数の実際の「ファイル」に保存します。 これらのファイルは通常、そのままアクセスまたはコピーすることを意図したものではありません。 データベースは、代わりにクエリインターフェイスを介してデータを公開します。

幸い、独自のストレージを実装するほとんどすべてのアプリケーションには、データを通常のファイルにエクスポートおよびインポートするメカニズムが含まれているため、このような移行中に通常どおりコピーできます。 たとえば、MySQLを使用している場合は、データベースのインポートとエクスポートの方法を確認できます。 次に、これらのエクスポートをサーバー間で転送できます。 rsync また scp.

ステップ4–構成ファイルの変更

一部のソフトウェアは、関連する構成の詳細とデータを元のサーバーから転送した後、正常に動作を再開しますが、多くの構成を変更する必要があります。

これは、同期スクリプトにわずかな問題をもたらします。 スクリプトを実行してデータを同期し、新しい宛先の正しい情報を反映するように値を変更すると、次にスクリプトを実行したときにこれらの変更が消去されます。 この問題を解決するために、スクリプトに追加の手順を追加して、転送後にそのデータを所定の場所に変更することができます。

Linuxには、この種のテキストスクリプトに非常に役立つコアユーティリティがいくつか含まれています。 これらのうちの2つは sedawk. 一般に、 sed 正規表現を使用して非構造化テキストに変更を加える場合は、より簡単に使用できます。 awk フォーマットされたテキストまたは表形式のデータのより複雑な解析に役立ちます。 このチュートリアル以外にも、 sed の使用方法の詳細、またはawkの使用方法の詳細を学ぶことができます。

このようにして、同期スクリプトを実行できます sed また awk 直後のコマンド rsync、転送後に必要に応じてファイルが自動的に変更されるようにします。

sed 構文は次のようになります。

  1. sed -i 's/string_to_match/string_to_replace_it_with/g' file_to_edit

The -i フラグは、個別の出力ファイルを作成するのではなく、ファイルがその場で変更されることを意味します。 The sg 変更せず、定期的です sed 大会。 string_to_match内で正規表現を使用することもできます。 追加してみてください sed あなたへのコマンド sync.sh:

〜/ sync.sh
rsync -avz --progress source_server:/etc/mysql/* /etc/mysql/

# Change socket to '/mysqld/mysqld.sock'
sed -i 's/\/var\/run\/mysqld\/mysqld.sock/\/mysqld\/mysqld.sock/g' /etc/mysql/my.cnf

これにより、のすべてのインスタンスが変更されます /var/run/mysqld/mysqld.sock/etc/mysql/my.cnf/mysqld/mysqld.sock/g. The \ 文字は、 / それ以外の場合は、文字の終わりとして解析されるため、文字 sed 表現。 これは、エスケープ特殊文字として知られています。 あなたの sed コマンドは後に rsync コマンド。

使用できます awk 使用したのと同じ方法でフォーマットされたテキストの場合 sed 非構造化テキストの場合。 たとえば、 /etc/shadow ファイルは、コロン(:)文字で区切られたタブに分割されます。これは次のようになります。

/ etc / shadow
vault:!:18941::::::
stunnel4:!:18968:0:99999:7:::
sammy:$6$bscTWIVxvy.KhkO8$NJNhpABhJoybG/vDiRzQ2y9OFEd6XtqgCUG4qkuWfld97VEXH8/jUtc7oMtOC34V47VE7HjdpMMv37Aftdb7C/:18981:0:99999:7:::

あなたが使うことができます awk 2番目の「列」からデータを削除します(つまり、最初と2番目の間) : 文字)、そのように:

  1. awk 'BEGIN { OFS=FS=":"; } $1=="root" { $2=""; } { print; }' /etc/shadow > shadow.tmp && mv shadow.tmp /etc/shadow

このコマンドは、入力と出力の両方の区切り文字を次のように解析する必要があることをawkに通知しています。 :. 次に、列1が「ルート」に等しい場合、列2を空の文字列に設定する必要があることを指定します。 ようではない sed, awk は、インプレースでのファイルの編集を直接サポートしていないため、このスクリプトは、一時ファイルに書き込んでから使用するのと同等の手順を実行します。 mv 元の入力を一時ファイルで上書きします。

注: sed 正規表現を柔軟に操作できるため、今でも非常に広く普及しています。 awk 現代の標準ではやや難解であると見なされており、その構文を学ぶのは難しい場合があります。 カンマ区切りのファイルを使用している場合は、csvkitなどの最新のツールの使用を検討してください。

移行スクリプトにはいつでもコメントを追加できます(前の行にコメントを追加できます) #)ファイルに対する進行中の修正または変更を文書化します。

結論

これで、アプリケーション環境とデータを新しいサーバーに移行するために必要なすべての情報が得られます。 また、スタックを新しいシステムに再デプロイする必要が生じた場合に備えて、このプロセスに関する再現性の高い優れたドキュメントが必要です。

このシリーズの最終チュートリアルでは、新しいサーバーで長引くシステムサービスを転送してテストする方法を確認します。