まくろぐ
更新:
作成:

何をするか?

Ansible の実行環境は Python がインストールされている環境であれば比較的簡単にインストールできますが、Docker の実行環境があれば、ホスト環境に何もインストールせずに Ansible の実行環境を手に入れることができます(もちろんコンテナは作る必要はありますが)。

Docker Hub を見ると、Alpine Linux ベースの Ansible 実行環境用イメージ alpine/ansible があるようですが、ここでは Dockerfile を使って自分でイメージを作成することにします。

Ansible 実行環境用イメージを作成する

Dockerfile で Alpine Linux ベースの Ansible 実行環境を定義します。

Dockerfile
FROM alpine:3

WORKDIR /app

# --no-cache を付けることで /var/cache/apk 以下にキャッシュが残るのを防ぐ
# --update-cache を付けることで先に apk update するのと同じ効果になる
RUN apk --no-cache --update-cache add ansible openssh sshpass

APK (Alpine Package Keeper) で次のようなパッケージをインストールしています。

  • ansible … Ansible Community パッケージ(ansible コマンドや ansible-playbook コマンドなど)
  • opensshssh コマンドのため
  • sshpass … ターゲットホストにパスワード認証 (--ask-pass) で接続するときのため

Ansible Community パッケージ (ansible) ではなく、Ansible Core (ansible-core) を使うようにすれば、イメージサイズは 500MB 弱から 80MB 程度に削減できますが、サイズを気にしなくてよいなら Ansible Community パッケージを使っておいた方が楽です。

Dockerfile を記述したら、ビルドしてイメージを作成します。 ここではイメージ名はシンプルに ansible としています。

ansible という名前のイメージを作成
$ docker image build -t ansible .

イメージが作成できているか確認します。

$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
ansible      latest    224bbc474bf8   3 minutes ago   472MB

コンテナの ansible コマンドを実行する

ansible コンテナ内のコマンドを実行する

Ansible の各種コマンドをインストールした ansible イメージを作成したので、次のようにして ansible コマンドや ansible-playbook コマンドを実行できます。

## ansible コマンドの実行
$ docker container run --rm ansible ansible

## ansible-playbook コマンドの実行
$ docker container run --rm ansible ansible-playbook

--rm オプションを指定して実行しているので、コマンド実行後にコンテナはすぐに破棄されます。 でもよく考えたら ansible-galaxy による Ansible コレクションのインストールは適宜必要になるので、--rm オプションは外して使うことになるかもしれません。

☝️ コンテナのシェルを使う

必要に応じて、ansible コンテナの ash シェルを使って作業することもできます。

$ docker container run --rm -it ansible ash
/app # ansible --help
/app # exit

ansible エイリアス、ansible-playbook エイリアスを作成する

毎回 docker container run コマンドを入力するのは面倒ですし、このままだと、ホスト側のディレクトリにあるインベントリファイル (inventory) や Playbook ファイルを参照できないので、次のようなエイリアスを定義しておくと便利です。

alias-ansible.bashrc(source での読み込み用)
alias ansible='docker container run --rm -it --mount type=bind,src="$(pwd)",dst=/app ansible ansible'
alias ansible-playbook='docker container run --rm -it --mount type=bind,src="$(pwd)",dst=/app ansible ansible-playbook'

--mount オプションによって、ホスト側のカレントディレクトリを、コンテナの作業ディレクトリ (/app) にバインドマウントしています。 SSH キー用に --mount type=bind,src="$HOME/.ssh",dst=/root/.ssh も追加しておいた方がいいかもしれません。 これで、あたかもホストマシンに ansible コマンドや ansible-playbook コマンドがインストールされているかのように実行できます。

$ ansible localhost -m ping
[WARNING]: No inventory was parsed, only implicit localhost is available
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

もう少し実践的な使用例

example.com というホストに SSH 接続(パスワード認証)して ping モジュールを実行してみます。 まず、Ansible によるコントロール対象を記述したインベントリファイルを用意します。

inventory
example.com  ansible_ssh_common_args='-o StrictHostKeyChecking=no'

インベントリファイルでは、初回 SSH 接続時の known_hosts 未登録エラーを防ぐための StrictHostKeyChecking オプションを指定しています。

example.com | FAILED! => {
    "msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host."
}

root ユーザーでパスワード認証して ping モジュールを実行してみます。

$ ansible -i inventory example.com -u root --ask-pass -m ping
SSH password: (root ユーザーのパスワードを入力)
example.com | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

うまくいきました!

ansible-playbook コマンドも同様に実行できます。

関連記事

更新:
作成:

何をするか?

ConoHa の VPS を借りたので、そのときの設定手順をメモしておきます。 大体こんな感じのことをしています。

  1. ConoHa VPS を契約 して Ubuntu 22.04 を起動
  2. お名前.com で独自ドメインを取得
  3. 独自ドメインで ConoHa VPS にアクセスできるようにする(IPv6 も有効化)

ConoHa VPS はリーズナブルかつ API でのサーバー管理ができたりして、徐々に人気が高まってきてるみたいです。 安いプランであれば月額数百円で借りることができます。 Docker コンテナやデータベース (RDB) をホストするサーバーが欲しかったのですが、AWS や Azure はプライベートで使うには高すぎるので、今回は ConoHa VPS を採用しました。

VPS にはグローバル IP アドレスが割り当てられるので独自ドメインは必須ではないですが、やはりドメイン名でアクセスできた方がよいので、いつも通り お名前.com でドメイン取得しました。 ここでは、example.com というドメインを取得したものとして説明しています。

ConoHa のアカウントを作って VPS を契約

何はともあれ、まずは ConoHa のアカウントを作って ConoHa VPS を借ります。 ポチポチやってけば終わります。

/p/n5emu3a/img-001.png
図: ConoHa VPS での OS の選択

VPS の初期 OS として、Ubuntu 22.04 を選択しました。 上記は選択できる OS の一例ですが、他にもいろいろあります。

独自ドメインを取得する

ConoHa VPS に割り当てる独自ドメインを取得しておきます。 ドメインはどこで取得してもいいんですが、あまりいろいろな会社に散らばると面倒なので、わたしの場合はお名前.com に統一しています。 ConoHa でもドメイン取得できるので、そちらで取得しても大丈夫です。

ここでは、example.com というドメインを取得したとして説明していきます。 毎度のことなんですが、ドメイン名を考えるのが一番時間がかかりますねw ドメインの更新料金は 1 年ごとに数千円程度ですが、1 年目は数百円だったりします。

DNS サーバーを設定する

独自ドメインを取得したら、そのドメイン名で ConoHa VPS のサーバーにアクセスできるようにします。 つまり、example.com から 160.xxx.xxx.xxx のような IP アドレスを引けるようにします。

ネームサーバーを変更する

お名前.com でドメインを取得すると、そのドメインの IP アドレスは次のような DNS サーバーで管理するよう初期設定されています。

  • dns1.onamae.com / dns2.onamae.com

この状態で、Web ブラウザから独自ドメインにアクセス (http://example.com) すると、お名前.com の「ようこそ」的な Web ページが表示されるようになっています。 このままではダメなので、DNS サーバーを変更して、その DNS サーバーで正しい IP アドレスを関連づけてやります。 お名前.com が用意している次のような DNS サーバーを使うこともできますが、

  • 01.dnsv.jp / 02.dnsv.jp

今回はせっかくなので、ConoHa が提供している DNS サーバーを使ってみます。 お名前.com Navi にログインして、次のように使用する DNS サーバーを変更します。

/p/n5emu3a/img-002.png
図: お名前.com のネームサーバー変更
  1. ネームサーバーの設定ネームサーバーの設定 と選択する
  2. 取得したドメイン名 (example.com) を選択する
  3. 他のネームサーバーを利用 を選択して、次のような ConoHa 側の DNS サーバーを登録する
    • ns-a1.conoha.io
    • ns-a2.conoha.io
    • ns-a3.conoha.io

DNS に IP アドレス情報を設定する

次に、ConoHa 側のコントールパネル で DNS サーバーの設定をします。 ここで、ドメイン名と IP アドレスを関連付けます。 まず、コントロールパネルから VPS サーバー情報を開いて、割り当てられた IPv4 アドレス(160.xxx.xxx.xxx など)を確認しておきます。

また、そこで IPv6 として割り当て可能なアドレスのリストも確認できるので、一番上のアドレス(2400:8500:1801:XXX:XXX:XXX:XX:XX など)とゲートウェイのアドレスを控えておきます。 VPS に最初から 17 個の IPv6 アドレスが割り当てられているように見えますが、それは罠で、自分で VPS に設定しないといけません(後述)。 IP アドレスがわかったら、DNS の設定画面を開いて、A レコード(IPv4 アドレス)と AAAA レコード(IPv6 アドレス)として登録します。

/p/n5emu3a/img-003.png
図: DNS レコードの追加
  1. 取得したドメイン (example.com) を追加
  2. 編集ボタンを押して、A レコードとして IPv4 アドレスを追加します。
    • 例: 名称: @, TTL: 3600, VALUE: 160.xxx.xxx.xxx
  3. IPv6 アドレスも割り当てたい場合は、AAAA レコードも追加します。
    • 例: 名称: @, TTL: 3600, VALUE: 2400:8500:1801:XXX:XXX:XXX:XX:XX

以上の設定を終えて 10 分くらい待つと、ping examle.com が通るようになります。 ただし、デフォルトでは VPS に IPv6 のアドレスは割り当てられていないので、VPS の設定を変更して IPv6 を有効化します。

VPS に IPv6 アドレスを設定する

ConoHa VPS に IPv6 のアドレスを割り当てる方法として、下記のマニュアルが用意されていますが、これは CentOS 用のものみたいです(2022年6月現在)。 Ubuntu では Netplan でネットワーク設定するので、そのやり方をメモっておきます。

以下のファイル編集作業は、次のように SSH 接続するか、ConoHa コントロールパネルからコンソールを開いて行います。

$ ssh root@example.com

ConoHa VPS の Ubuntu 22.04 の初期設定では、Netplan の設定ファイルとして下記のファイルだけが入っています。 IPv4 は DHCP が有効になっていますが、うまく固定のアドレスが割り当てられているようです。

vi /etc/netplan/10-gmovps.yaml
network:
    ethernets:
        eth0:
            addresses: []
            dhcp4: true
            dhcp6: false
            accept-ra: false
            optional: true
    version: 2

このファイルを書き換えてもよいのですが、IPv6 設定用のファイルを別に用意することにします。

vi /etc/netplan/99-custom.yaml
network:
    ethernets:
        eth0:
            addresses:
            - "2400:8500:XXXX:XXX:XXX:XXX:XX:XX/64"  # IPv6 アドレスを設定
            dhcp6: false
            accept-ra: false
            optional: true
            routes:
            - to: default
              via: "2400:8500:XXXX:XXX::1"  # デフォルトゲートウェイを設定
    version: 2

あとは、次のように Netplan の設定を反映すれば、IPv6 の設定完了です。

# netplan apply

ip コマンド で IPv6 アドレスやデフォルトゲートウェイが正しく割り当てられているか確認しておきます。

IPv6 アドレスの確認
$ ip a show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 02:02:a0:fb:XX:XX brd ff:ff:ff:ff:ff:ff
    altname enp0s3
    altname ens3
    inet 160.XXX.XXX.XXX/23 metric 100 brd 160.XXX.XXX.255 scope global dynamic eth0
       valid_lft 5183492sec preferred_lft 5183492sec
    inet6 2400:8500:XXXX:XXX:XXX:XXX:XX:XX/64 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::2:a0ff:fefb:330a/64 scope link
       valid_lft forever preferred_lft forever
デフォルトゲートウェイの確認
$ ip -6 route
::1 dev lo proto kernel metric 256 pref medium
2400:8500:XXXX:XXX::/64 dev eth0 proto kernel metric 256 pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
default via 2400:8500:XXXX:XXX::1 dev eth0 proto static metric 1024 pref medium

IPv6 で外部サーバー (google.com) に ping6 できることも確認しておきます。

$ ping6 -c 3 -I eth0 google.com
PING google.com(nrt12s30-in-x0e.1e100.net (2404:6800:4004:812::200e)) from 2400:8500:XXXX:XXX:XXX:XXX:XX:XX eth0: 56 data bytes
64 bytes from nrt12s30-in-x0e.1e100.net (2404:6800:4004:812::200e): icmp_seq=1 ttl=56 time=1.03 ms
64 bytes from nrt12s30-in-x0e.1e100.net (2404:6800:4004:812::200e): icmp_seq=2 ttl=56 time=0.838 ms
64 bytes from nrt12s30-in-x0e.1e100.net (2404:6800:4004:812::200e): icmp_seq=3 ttl=56 time=0.833 ms

逆に、手元の PC から ConoHa VPS に ping6 できることも確認しておきます。

$ ping6 example.com
...(省略)...

これで、独自ドメインで ConoHa VPS にアクセスできるようになりました!

ConoHa VPS 広告

最後に、お得な広告を貼っておきます(^^

  • ConoHa VPS の申し込みはこちらから →
  • お名前.com での ドメイン取得 はこちらから →
VPS
更新:
作成:

José F. Romaniello 氏 (jfromaniello) が公開している NPM パッケージの url-join を使うと、バラバラになった URL のパスをうまいこと結合してくれます。

url-join のインストール
$ npm install url-join
使用例
import urlJoin from 'url-join'

urlJoin('https://example.com', 'a', '/b/c'))        //=> https://example.com/a/b/c
urlJoin('https://example.com/', '/a', '/b/c/'))     //=> https://example.com/a/b/c/
urlJoin('https://example.com', '/foo', '?q=123'))   //=> https://example.com/foo?q=123
urlJoin('https://example.com', 'foo/', '/?q=123'))  //=> https://example.com/foo?q=123

URL の末尾にクエリ文字列 (?q=123) があるときは、パス部分の末尾の / は消されちゃうみたいですね。

☝️ path.join は URL 結合には使えない path モジュールの path.join は、ローカルファイルシステム用のパス結合関数なので、URL の結合には使ってはいけません。 例えば、Windows 環境ではバックスラッシュが使われてしまったりします。

関連記事

メニュー

まくろぐ
サイトマップまくへのメッセージ