jujuの検証でハマったこと


# はじめに
この記事は、[MicroAd Advent Calendar 2020](https://qiita.com/advent-calendar/2020/microad)の9日目の記事です。

ここでハマったこととして書いている内容は、**インターネットへのアクセスが限定された環境**で起きたもので、
通常の使い方でハマる内容ではありませんのでご注意ください。

# Jujuとは
![juju_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20794/1ee8c03b-bd44-981a-77fd-ebc1ce96a9f4.png)


Jujuは、Canonicalが提供しているアプリケーションの構成管理ツールです。
Ansibleとの違いは、各種クラウド基盤と連携しOSのデプロイからアプリのインストール・設定までを一括して管理します。

詳しくは[Juju](https://jaas.ai/)を見ていただくと良いと思います。

# Jujuでやりたかったこと
Jujuは、クラウド基盤と連携してアプリのデプロイや構成管理ができるため、Ansibleと比較してどういう使い方ができるのかと思って検証してみることにしました。

Jujuは、AWSなどのパブリッククラウド以外にもLDXやMAASにも対応しているので、
単一ホスト上のLXDでテストしたり、MAASで複数のベアメタルサーバにデプロイしたりと比較的手軽に試すことができます。

その上で、検証を通して手軽にOpenStackの構築ができないかということを試したいと思っていました。


# 検証用に作った環境
以下のような図の構成で検証環境を作りました。
MAASサーバ１台だけがInternetへ直接アクセスできるという制限のある環境です。
MAAS管理下にあるノードはMAASサーバのProxyを使用してInternetにアクセスするように設定しています。

![Juju構成図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20794/b828020f-ac40-a14f-c5d8-fe3552c27b8d.png)

この環境を使って、まずはNode01のみでLXDを使いjujuの検証を行います。
その後、MAASとJujuを連携させて他のNodeも使いCephのクラスターやOpenStackのクラスターを作ってみようと思っています。

# Proxy環境での問題と対策

## snapでのjujuインストールが失敗する
まずはノード１台でLXDを使って手軽にjujuを試してみることにしました。
しかし、jujuをsnapでインストールする際に問題がおきました。

snapコマンドを使ってjujuをインストールしようとしましたが、環境変数で設定しているProxyを使ってくれませんでした。

### snapdの設定を変更する
snapdの設定を変更して、snap installでproxyを使えるようにします。

```
ubuntu@node01:~$ sudo systemctl edit snapd.service
```

> [Service]
> Environment=http_proxy=http://192.168.100.1:8000
> Environment=https_proxy=http://192.168.100.1:8000

### snapdを再起動

設定変更を反映してsnapdを再起動します。

```
ubuntu@node01:~$ sudo systemctl daemon-reload
ubuntu@node01:~$ sudo systemctl restart snapd.service
```

snapdを再起動したら、snapコマンドを使ってjujuをインストールします。
問題なくインストールできたら、引き続きsnapコマンドでLXDをインストールします。

### PATHの設定
snapでインストールすると/snap/bin配下にコマンドがインストールされるので、
PATHが通るように環境設定しておきます。

```
ubuntu@node01:~$ export PATH=/snap/bin:$PATH
```
※.bashrcに設定しておく

## LXDでjuju bootstrapがコケる

jujuとLXDが無事にインストールできたのもつかの間、jujuコントローラをセットアップするため
``juju bootstrap``を実行するもエラーとなって設定できず。。

### LXDにProxyの設定をする

snapでLXDをインストールしている場合、Proxyを設定する際に以下のように設定する必要があります。

```
ubuntu@node01:~$ sudo systemctl edit snap.lxd.daemon.service
```
※すでにLXDがaptでインストールされている場合は削除しておくと良いです

> [Service]
> Environment=http_proxy=http://192.168.100.1:8000
> Environment=https_proxy=http://192.168.100.1:8000
 
### 設定の反映
lxdの再起動を行い設定を反映させます。

```
ubuntu@node01:~$ sudo systemctl daemon-reload
ubuntu@node01:~$ sudo systemctl restart snap.lxd.daemon.service
```

## PROXY_HTTP等の環境変数を設定

LXDにProxyの設定をしてもjujuのbootstrapがコケてしまいます。
jujuのコマンド実行時に、PROXYの設定を付けて実行する必要があるため、
環境変数を設定します。

### PROXY_HTTP,PROXY_HTTPS,PROXY_NOを設定
環境変数を設定してjujuコマンド時に実行しやすいよう設定しておきます。
※.bashrcに設定しておきます

> PROXY_HTTP=http://192.168.100.1:8000
> PROXY_HTTPS=http://192.168.100.1:8000
> PROXY_NO=$(echo localhost 127.0.0.1 192.168.100.{1..255} 10.216.37.{1..255} | sed 's/ /,/g')

ここではlocalhost、127.0.0.1と192.168.100.XX(接続しているNWのアドレス)、
10.216.37.XX（LXDで設定されたコンテナ用のネットワークアドレス帯域）は、PROXYを使わない接続先として変数に登録しておきます。

```
export http_proxy=$PROXY_HTTP
export https_proxy=$PROXY_HTTP
export no_proxy=$PROXY_NO
export HTTP_PROXY=$PROXY_HTTP
export HTTPS_PROXY=$PROXY_HTTP
export NO_PROXY=$PROXY_NO
export JUJU_CHARM_HTTP_PROXY=$PROXY_HTTP
export JUJU_CHARM_HTTPS_PROXY=$PROXY_HTTP
export JUJU_CHARM_NO_PROXY=$PROXY_NO
```

ここまでの設定で、インターネットにProxy越しにしかアクセスできない環境でも
jujuを試せる状態になりました。

## juju bootstrapコマンドの実行

```
ubuntu@node01:~$ juju bootstrap localhost overlord --model-default apt-http-proxy=$PROXY_HTTP --model-default apt-https-proxy=$PROXY_HTTPS --model-default http-proxy=$PROXY_HTTP --model-default https-proxy=$PROXY_HTTPS --model-default no-proxy=$NO_PROXY
```

上記のbootstrapコマンドにより、ローカルのLXD上にjujuのコントローラが設定されました。
あとは、juju deployでアプリをデプロイすることが可能です。

# 終わりに

インターネットにそのままアクセスできるような環境では、ここで書いているようなProxyの設定は不要です。
ですが、社内の検証環境で万が一に備えてネットワークを分けておきたい場合など、
どうしてもProxyを使う必要があったりします。
そういった環境でjujuを使う際の参考になれば幸いです。