オフラインのWindows10環境にAnsibleを導入する方法
- はじめに
- 検証環境
- 事前準備
- 導入手順
- おわりに
- 参考にしたサイト
はじめに
2019年7月4日、5日に開催されたHardening II SUという大会に参加してきました。
大会の中で、オフライン環境のWindiws10にAnsibleをインストールしなければならない機会がありました。 AnsibleをWindows10環境で動作させるためには、大まかに以下の3つの手順が必要です。
オフライン環境に導入するためには、少し面倒くさい手順が必要です。 大会当日に準備できなかった人が多かったみたいだったので、導入手順を紹介します。
検証環境
- Windows10 バージョン 1903(OSビルド 18362.207)
- Debian 9.5(WSL用のDebianディストリビューション 1-1-3-0_x64)
- Ansible 2.2.1.0
事前準備
オンライン環境で事前にパッケージをダウンロードしておく必要があります。 Ansibleやpywinrmは、依存しているパッケージがたくさんあり、準備だけでもかなり面倒くさいです。
1. WSL用のDebianディストリビューションパッケージのダウンロード
- 以下のコマンドでダウンロードする
PS1> Invoke-WebRequest -Uri https://aka.ms/wsl-debian-gnulinux -OutFile DeianGNULinux.Appx -UseBasicParsing
- もしくは、以下のリンク先にある Debian GNU/Linux からダウンロードする。 docs.microsoft.com
2. Ansibleに必要なパッケージのダウンロード
2-1. 依存パッケージをすべてダウンロードするためのスクリプトを用意する
Ubuntu 16.04: 依存パッケージを含めたdebパッケージをダウンロードする - Narrow Escape を参考にしました。
- apt-rdepends(依存パッケージを表示するツール)をインストールする。
$ sudo apt-get install apt-rdepends
- 依存パッケージをすべてダウンロードするためのスクリプト(download_deb_package.sh)を用意する。
#!/bin/sh if [ $# -ne 1 ]; then prog=`basename ${0}` echo "usage: ${prog} <package>" exit 1 fi TMP=`mktemp -t a.sh.XXXXXX` trap "rm $TMP* 2>/dev/null" 0 check_virtual_package() { apt show $1 2> /dev/null | grep "not a real package" > /dev/null return $? } get_provide_package() { apt install -s $1 > ${TMP} 2> /dev/null local state=0 local pkgs="" while read line; do if [ "${line}x" = "Package $1 is a virtual package provided by:x" ]; then state=1 elif [ ${state} -eq 1 -a -n "${line}" ]; then pkg=`echo ${line} | awk '{ print $1 }'` echo ${pkg} | grep -v ':i386' > /dev/null && pkgs="${pkg} ${pkgs}" fi done < ${TMP} echo "${pkgs}" } get_depend_package() { local pkgs="" local pkg="" for pkg in `apt-rdepends $1 2> /dev/null | grep -v "^ "`; do check_virtual_package ${pkg} if [ $? -eq 0 ]; then pkg=`get_provide_package ${pkg}` fi pkgs="${pkgs} ${pkg}" done echo "${pkgs}" } download_deb_package() { local pkgs="" pkgs=`get_depend_package $1` apt download ${pkgs} } download_deb_package $1
- 上記のスクリプトに実行権限を付与する。
$ chmod +x ./download_deb_package
2-2. ansibleに必要なパッケージをダウンロードする
(debパッケージ)
- ansible(必須)
$ mkdir ansible_deb_packages $ cd ansible_deb_packages $ sudo ../download_deb_package ansible
- python-pip(AnsibleでWindowsも制御したい場合のみ)
$ mkdir python-pip_deb_packages $ cd python-pip_deb_packages $ sudo ../download_deb_package python-pip
- gcc(AnsibleでWindowsも制御したい場合のみ)
$ mkdir gcc_deb_packages $ cd gcc_deb_packages $ sudo ../download_deb_package gcc
- python2.7-dev(AnsibleでWindowsも制御したい場合のみ)
$ mkdir python2.7-dev_deb_packages $ cd python2.7-dev_deb_packages $ sudo ../download_deb_package python2.7-dev
- libffi-dev(AnsibleでWindowsも制御したい場合のみ)
$ mkdir libffi-dev_deb_packages $ cd libffi-dev_deb_packages $ sudo ../download_deb_package libffi-dev
- libssl-dev(AnsibleでWindowsも制御したい場合のみ)
$ mkdir libssl-dev_deb_packages $ cd libssl-dev_deb_packages $ sudo ../download_deb_package libssl-dev
2-3. ansibleに必要なパッケージをダウンロードする
(pipパッケージ)
- setuptools(AnsibleでWindowsも制御したい場合のみ)
$ mkdir setuptools_pip_packages $ cd setuptools_pip_packages $ pip download -d . --no-binary :all: setuptools
- wheel(AnsibleでWindowsも制御したい場合のみ)
$ mkdir wheel_pip_packages $ cd wheel_pip_packages $ pip download -d . --no-binary :all: wheel
- pywinrm(AnsibleでWindowsも制御したい場合のみ)
$ mkdir pywinrm_pip_packages $ cd pywinrm_pip_packages $ pip download -d . --no-binary :all: pywinrm
導入手順
1. WSLのインストール
1-1. WSL(Windows Subsystem for Linux)を有効にする
- 管理者モードでPowerShellを開き、以下のコマンドを入力する。
PS> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
- コンピュータを再起動する。
1-2. WSL用のDebianを起動する
- 事前に用意したDebianディストリビューションパッケージを持ってくる。
- PowerShellで以下のコマンドを実行し、Debianを起動する。
PS> Rename-Item DebianGNULinux.Appx DebianGNULinux.zip PS> Expand-Archive DebianGNULinux.zip PS> .\DebianGNULinux\debian.exe
- ユーザ名とパスワードを設定する。
2. Ansibleのインストール
- 事前に用意したAnsible用のdebパッケージを持ってくる。
- debパッケージをすべてインストールする。
$ cd ansible_deb_packages $ sudo dpkg -i --force-depends *.deb
3. python-pipのインストール
(AnsibleでWindowsも制御したい場合のみ)
3-1. python-pipをインストールする
- 事前に用意したpython-pip用のdebパッケージを持ってくる。
- debパッケージをすべてインストールする。
$ cd python-pip_deb_packages $ sudo dpkg -i --force-depends *.deb
3-2. setuptoolsをアップデートする
- 事前に用意したsetuptoolsのpipパッケージを持ってくる。
- setuptoolsをアップデートする。
$ sudo pip install --upgrade setuptools-41.0.1.zip
※ ちなみにアップデートしないと、以下のようなエラーが出てしまいます。Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-3l_UOj-build/
4. winrmのインストール
(AnsibleでWindowsも制御したい場合のみ)
4-1. wheelをインストールする
- 事前に用意したwheelのpipパッケージを持ってくる。
- wheelをインストールする。
$ pip install wheel-0.33.4.tar.gz
4-2. gccをインストールする
- 事前に用意したgccのdebパッケージを持ってくる。
- debパッケージをすべてインストールする。
$ cd gcc_deb_packages $ sudo dpkg -i --force-depends *.deb
4-3. python2.7-devをインストールする
- 事前に用意したpython2.7-devのdebパッケージを持ってくる。
- debパッケージをすべてインストールする。
$ cd python2.7-dev_deb_packages $ sudo dpkg -i --force-depends *.deb
4-4. libffi-devをインストールする
- 事前に用意したlibffi-devのdebパッケージを持ってくる。
- debパッケージをすべてインストールする。
$ cd libffi-dev_deb_packages $ sudo dpkg -i --force-depends *.deb
4-5. libssl-devをインストールする
- 事前に用意したlibssl-devのdebパッケージを持ってくる。
- debパッケージをすべてインストールする。
$ cd libssl-dev_deb_packages $ sudo dpkg -i --force-depends *.deb
4-6. pywinrmをインストールする
- 事前に用意したpywinrmのpipパッケージを持ってくる。
- pipパッケージをすべてインストールする。
$ cd pywinrm_pip_packages $ pip install --no-index --find-links . *
おわりに
今回は、オフラインのWindows10環境にAnsibleを導入する手順について紹介しました。 ここまでやって、やっとAnsibleを使用するためのスタートラインに立つことができます。
大会当日は、手動で導入作業していたため、Ansibleが使用できるようになるまでに約40分掛かってしまいました。 このようにオフライン環境に一から導入するには、結構時間がかかってしまいます。 Ansibleの用途にもよりますが、単純なものであれば、シンプルなシェルスクリプトなどで代用することも検討に入れたほうがいいと思います。
参考にしたサイト
- Install the Linux Subsystem on Windows Server | Microsoft Docs
- Manually download Windows Subsystem for Linux (WSL) Distros | Microsoft Docs
- Ubuntu 16.04: 依存パッケージを含めたdebパッケージをダウンロードする - Narrow Escape
- pip - Python Packages Offline Installation - Stack Overflow
- Gou Home | Blog Archive | 【 dpkg 】 debパッケージのインストール・アンインストールを行う