やっさん的Ansible role開発をmolecule使って始めるテンプレ
adventar.org この記事は、上記の6日目の記事です。
ロールを追加する際に、 molecule を使うと非常に便利です。テスト(verify)を書かないにしても、テストドライバーを使ってdockerやvagrantなどの仮想環境にroleを適用してみて途中でエラーになったり、templateの生成が想定が違うなどを実際に確認出来るので、まずははじめることをオススメします。
いつもroleを作成する際にやってる一連の流れを紹介。 XXは〇〇すると良いよ!など、アドバイスあれば教えて下さい!
- 前提
- 初期構築
- 仮想環境(venv)の用意
- 始めるとき
- roleのテンプレを使って初回分を作成
- roleにシナリオを追加する場合
- さいごに
- 参考
前提
OS:CentOS7 or Ubuntu 20.04 LTS
molecule 3.2.1 using python 3.8 ansible:2.10.4 delegated:3.2.1 from molecule docker:0.2.4 from molecule_docker vagrant:0.6.1 from molecule_vagrant
また、roleを含むリポジトリは Roles — Ansible Documentation にあるように以下の構成とします。
# playbooks site.yml group_vars/ group_xxx/ host_vars/ xxxx.example.com/ roles/ xxx/ defaults/ files/ handlers/ library/ meta/ tasks/ templates/ vars/ yyy/ :続きを読む
Cloudera Hue をCDHから切り離してDockerで運用出来ないか検討してみる
1日遅れになってしまいましたが、、、
この記事は MicroAd (マイクロアド) Advent Calendar 2020 - Qiita の20日目の記事です。
昨日は dai08srhg - Qiita のEmbulkの話でした。
(´-`).。oO(EmbulkはHiveやHDFS系のプラグインがアップデートあると嬉しいなぁと思う今日この頃)
qiita.com
さて、本題ですが、今回はHueとDockerを使った話です。 Cloudera Hueは、 CDHに含まれているコンポーネントの一つ ですが、Hueは他のコンポーネントに比べて他のコンポーネントと協調して動作するものではなく基本的にクラスタのクライアントな立ち位置となります。
また、Hueはこのところ積極的なアップデートがあるので常に最新を使いたい!が、CDHはその都度追従してくれるわけでも無い状態です。そこで今回は、CDHから切り離して、Hue On Dockerで代わりが出来ないか考えてみます。
Hue自身については、12/23の以下のアドカレでアップデート情報があるので気になる方はご覧になって下さい。
- 前提
- Docker でHueを動かしてみる
- 起動時の注意
- 利用するコンテナイメージについて
- Hueの設定ファイルの運用について
- /etc/hosts について
- Hueから参照する外部DBについて
- その他の考慮ポイント
- Hueの負荷分散について
- Hueの監視について
- Loggingについて
- Metricsについて
- Tracingについて
- さいごに
前提
- CDHを使っている(v6.3.2 を今回の題材にしているが、v5系でも良いはず)
- Hueを動かすDockerホストには管理者しかリモートログイン出来ず、利用者はWebUIのみとする
- Cloudera Navigator、Navigator Optimizerの利用は対象外(私が利用できないので検証出来ない為)
- HTTPS対応は今回対象外とする(検証環境を用意するには時間が足りないので…)
- LDAP、SAML認証については、対象外(検証環境を用意するには時間が足りないので…)
- この辺を参考にしたらよさそう→ Hue Security | 6.3.x | Cloudera Documentation
- HueでつかうSparkについては、Livyが用意出来なかったので見送り
Kubernetesでの稼働は見送り(時間足らんかった…)
- Helmは hue/tools/kubernetes at master · cloudera/hue にあるのでそちらを参考にしたら良さそう
CDHにHueを入れてるけど、最新のHueに上げたくてウズウズしている
Docker でHueを動かしてみる
hue/tools/docker/hue at master · cloudera/hue に docker-compose.yml
があるのでそちらを参考にします。
また、Dockerfileもあります1 が、 Makefile を読むと分かるように単純にdocker buildするだけではダメそうなので、今回はbuild済みのDockerHubにある コンテナイメージ を使う方向で進めます。
早速、Docker Composeは以下の様にしてます。
version: '3.8' services: hue: image: gethue/hue:20201215-135001 # ・・・★1 hostname: hue container_name: hue ports: - "8888:8888" volumes: - ./conf/hue/z-hue.ini:/usr/share/hue/desktop/conf/z-hue.ini # ・・・★2 - ./conf/hue/log.conf:/usr/share/hue/desktop/conf/log.conf - ./conf/hive-conf/:/etc/hive/conf/ # ・・・★3 depends_on: - database networks: - backend extra_hosts: # ・・・★4 - "my-cdh-namenode-vip.example.com:192.0.2.1" - "my-cdh-hiveserver2.example.com:192.0.2.2" - "my-cdh-m01.example.com:192.0.2.3" - "my-cdh-m02.example.com:192.0.2.4" - "my-cdh-m03.example.com:192.0.2.5" - "my-cdh-w01.example.com:192.0.2.6" # 外部RDBでもOK database: # ・・・★5 image: mysql:8.0 hostname: database container_name: database env_file: - ./env/database.env command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --init-connect='SET NAMES UTF8;' --innodb-flush-log-at-trx-commit=0 volumes: - ./db/data:/var/lib/mysql # ・・・★6 - ./db/sql:/docker-entrypoint-initdb.d # ・・・★7 # - ./db/my.cnf:/etc/mysql/conf.d/my.cnf # 必要ならここでチューニングしてください networks: - backend networks: backend:
起動時の注意
実行する手順は、 初回だけ以下の様にdatabaseだけ先に起動して、初回起動時にHueのデータベースを作成してからHueを起動します。
$ docker-compose up --no-start $ docker-compose start database $ docker-compose up -d
2回目以降は、 docker-compose up -d
のみでOKです。
では、Docker Composeを見ていきます。
-
Dockerfile やPython3版の Dockerfile.py3 が用意されています。↩
所属していないクラスタに対してDispCpやhdfs dfsを使う場合のTips
この記事は Distributed computing (Apache Spark, Hadoop, Kafka, ...) Advent Calendar 2020 の11日目の記事です。
クラスタ間でHDFSファイルを移動したいというのは割とよくある話です。 そこでHDFSファイルを大量に移動する際は、DistCpを使うことになります。
ただ、移動元も移動先にも所属していないクライアントから通常DistCpは使えません(クラスタの設定情報がないので)。
設定をどうにかして渡せば、多分出来るだろうなぁと思いつつも「まぁ移動先のクラスタクライアントにSSHしたらいいか。」で後回しにしてましたが、自分のPCからDocker使ってやりたいなぁって事で調べました。
DistCpそのものについては、以下の最高の記事があるのでそこを参照下さい。 shiumachi.hatenablog.com
前提
以下のCloudera Enterpriseが対象です。
続きを読むお手軽・簡単?!Cloud Storage Connectorを使ってHadoopクラスタからGCS・S3にデータを移動する
この記事は MicroAd (マイクロアド) Advent Calendar 2020 - Qiita の3日目の記事です。
昨日は Kotlin大好き? wrongwrong の以下のGitHub ActionsでJava/Kotlin製ライブラリ(ビルドツールはgradle)のCI環境構築する話でした。 qiita.com
3日目の記事は、Hadoopネタです。
HDFSに貯めたデータをクラウドストレージに持っていってクラウド上で何かをしたい(BigQueryから参照させたいetc)。 また、バックアップ先としてクラウドストレージを使いたい、クラウドストレージのデータをHadoopクラスタから参照したい。。。
など、Hadoopクラスタからクラウドへ、また、その逆についてもやりたいケースがありますが、その為にローカルに落として aws s3
や gsutil
などを使って都度都度データを移動するのはとても億劫です。
そこで、今回はHadoopクラスタからHadoopクラスタ外に楽にデータを移動する事が出来るCloud Storage Connectorを紹介します。
Cloud Storage Connectorを使うとGoogle Cloud Storage(GCS)、Amazon S3、Microsoft Azure Data Lake Storage (ADLS)といったパブリッククラウドに楽にデータを移動する事が出来ます。
利用イメージは、以下のようなことが出来る様になります。
# Hadoopクラスタからデータを参照 $ hadoop fs -ls gs://gcs-connector-bucket/user/hdfs/ # GCSバケットからデータを取得 $ hadoop distcp gs://gcs-connector-bucket/user/hdfs/db/table/ hdfs://name-node:8020/user/hdfs/db/table/
- 前提条件
- 利用するCloud Storage Connector について
- 環境の用意
- 動作確認
- 注意事項
- 補足
- 最後に
前提条件
今回は以下を前提とします。
- CDH v6.3.21
- Cloud Storage Connectorは GCS のものを利用
AWXで複数バージョンのAnsibleを実行出来るようカスタム仮想環境を用意する
前ふり
これの続き。
よこちさんに教えてもらったのでやってみた。
カスタムvirtualenvの作成なんですが、インストール時の inventory の custom_venv_dir って設定を有効にすると、コンテナにマウントしてくれるので、コンテナ内に直接作らなくってすみました!https://t.co/u3nwyRPy1M
— よこち(yokochi) (@akira6592) 2020年6月28日
前提環境
CentOS:7.8
Python:3.6.8
AWX:15.0.1
カスタム仮想環境のパス:/opt/awx-envs/
AWXはインストーラ使ってセットアップしたdocker-composeで稼働。管理用RDBはAWXと同じ Docker Compose内のServiceとする。
※今回はAWXがどうのこうのは関係ないのでセットアップについては割愛。詳細は、 awx/INSTALL.md at devel · ansible/awx を参照。
結論
出来たけど罠があるので注意。
仮想環境には pip で psutil を入れないとダメ。
詳細
正しい手順は awx/custom_virtualenvs.md at devel · ansible/awx となります。 おそらく、 Feature: custom virtual environment directories by vismay-golwala · Pull Request #3320 · ansible/awx にて仮想環境を変更出来る機能が追加されてたようです。
実施する前に、デフォルトの仮想環境でインストールしているpipをチェック。
$ docker-compose exec task bash bash-4.4# cat /var/lib/awx/venv/ansible/requirements.txt/requirements.txt jinja2 kubernetes ~= 11.0.0 python-string-utils ruamel.yaml >= 0.15 six
仮想環境の作成
作成したい仮想環境を作成
mkdir /opt/awx-envs/ cd /opt/awx-envs/ python3 -m venv ansible2-7 source ansible2-7/bin/activate
pip install向けに ansible2-7/requirements.txt を作成
cat ansible2-7/requirements.txt psutil ansible ~= 2.7.0 jinja2 python-string-utils ruamel.yaml >= 0.15 six
※ポイントは、最低でもpsutilとansibleは必要です。
pip install実施
pip install -r ansible2-7/requirements.txt
セットアップされたライブラリはこちら。
(ansible2-7) [root awx-envs]# pip freeze ansible==2.7.18 bcrypt==3.2.0 cffi==1.14.3 cryptography==3.2.1 Jinja2==2.11.2 MarkupSafe==1.1.1 paramiko==2.7.2 psutil==5.7.3 pycparser==2.20 PyNaCl==1.4.0 python-string-utils==1.0.0 PyYAML==5.3.1 ruamel.yaml==0.16.12 ruamel.yaml.clib==0.2.2 six==1.15.0
必要であれば、他にも同様にして、ansible ~= 2.9.0
にした ansible2-7
や ansible ~= 2.10.0
にした ansible2-10
なども作成する。
※他にも必要なライブラリがあれば入れる。
インストーラでcustom_venv_dirを利用するよう変更
AWXのインストーラの設定( awx/installer/inventory
)で、以下のように custom_venv_dir
をコメントアウトして、custom_venv_dir
の設定にフルパスで指定
# AWX custom virtual environment folder. Only usable for local install. # require: psutil -> sudo yum install gcc python3-devel custom_venv_dir="/opt/awx-envs/"
インストーラを実行して設定を反映。 AWXのインストール先のdocker-compose.ymlのwebとtaskのserviceに custom_venv_dir で指定したパスをマウントしているのが分かります。
(略) : web: image: ansible/awx:15.0.1 container_name: awx_web depends_on: - redis - postgres ports: - "80:8052" hostname: awxweb user: root restart: unless-stopped volumes: - supervisor-socket:/var/run/supervisor : - "/opt/awx-envs/:/opt/awx-envs/:rw" ・・・・★ : (略) task: image: ansible/awx:15.0.1 container_name: awx_task depends_on: - redis - web - postgres command: /usr/bin/launch_awx_task.sh hostname: awx user: root restart: unless-stopped volumes: - supervisor-socket:/var/run/supervisor : - "/opt/awx-envs/:/opt/awx-envs/:rw" ・・・・★ (略)
AWXの設定変更
AWXの起動後、AWXのWeb UIで設定。
AWXの「設定」→「システム」にて、下図のようにカスタム仮想環境のパスに /opt/awx-envs
を入れて、「保存」ボタンを押下して反映。
次に、設定したカスタム仮想環境を利用したいプロジェクトを選択して、下図のように、「ANSIBLE環境」から利用したいカスタム仮想環境を選択し、「保存」ボタンを押下して反映。
動作確認
使えるか確認。 テンプレートから設定したプロジェクトのジョブテンプレートを選択して実行。
環境がカスタム仮想環境になっているのが分かります。
最後に
これまでは、AWXのインストーラで指定する最新のAnsibleバージョンを使い続けなければならず、AWXの更新が大変でした。
今回のカスタム仮想環境を利用することで、実行するAnsibleのバージョンを固定出来るので、頻繁にAWXをアップデートする更新に追随するもの楽になると思います。
注意事項
custom_venv_dirは「フルパス」で1つだけ。
awx/docker-compose.yml.j2 at 17b5b531bf36e337995aa46735c1b598b2e686fb · ansible/awx · GitHub
をみると分かりますが
volumes: - supervisor-socket:/var/run/supervisor : {% if custom_venv_dir is defined %} - "{{ custom_venv_dir +':'+ custom_venv_dir +':rw' }}" ・・・★ {% endif %}
docker-composeのテンプレが上のとおり、custom_venv_dirをそのままマウントするのでフルパス指定が必要です。
下手にホームディレクトリのどっかを指定してしまうとハマるかも。無難に /opt
とか /var/lib
辺りに作成するのが良いかも。
cf. volumes - Compose file version 2 reference | Docker Documentation
おまけ
他のカスタム仮想環境の設定方法
http://XXXX/api/v2/settings/system/ にアクセスすると設定値が見えます。
おそらく下図の用に変更してもCUSTOM_VENV_PATHSの変更出来るはず。
awx/custom_virtualenvs.md at devel · ansible/awx · GitHub にあった
$ HTTP PATCH /api/v2/settings/system/ {'CUSTOM_VENV_PATHS': ["/opt/my-envs/"]}
あたりのくだりはそういう意味だったのね。。。
踏み台経由してWebUIにローカルからアクセスするメモ
たまにやりたい時に忘れてて探すのがだるいのでメモ。
あるサーバで稼働しているWebシステムにアクセスする際、 踏み台(jump host、jump server)を経由しなければならない場合のTips。
前提条件
http://webui.internal:5678 で稼働しているWebUIにアクセスしたいが踏み台経由しないとローカルからアクセス出来ない
実行イメージ
ローカルから http://localhost:1234 でアクセスしているけど、踏み台経由して http://webui.internal:5678 にアクセスしている
やり方
~/.ssh/config
の設定追加
~/.ssh/config
に以下を追加
# 踏み台の設定 Host jump HostName jump.example.com User yassan IdentityFile ~/.ssh/id_rsa # 踏み台を経由してアクセスしたいサーバ Host webui Hostname webui.internal User yassan Port 22 ProxyCommand ssh -W %h:%p nagatomi@jump LocalForward 1234 webui.internal:5678
踏み台経由してローカルとwebui.internalをつなぐ
アクセスしたい時にターミナルで以下を実行
$ ssh -N webui yassan@webui.internal's password: XXX # webui.internalのPWを入力
※ターミナルは起動しっぱなし
-N
: リモートコマンドを実行しない。単にポートの中継だけを行う。
ブラウザでアクセス
ブラウザにて以下の用にアクセス http://localhost:1234
止めたい場合
起動しているターミナルで Ctrl+C でsshをkillする。
おまけ
ssh -N webui
を実行する際に -f
を追加して、バックグランド実行してもOKだけど、探すのが面倒なのと消し忘れるのであえてやってない
補足
AWXの環境構築をもうちょい良い感じにしたいところ
公式の方法+αくらいで、Docker Composeで稼働するAWXのセットアップ方法をまとめてみた。
コンテナのログ見たら、公式そのままだとちらほらエラーが出てたので、色々対策をしてある。
後、AWXって長時間稼働するので、コンテナログが膨大になるので、Logging Driverでローテートするとか別で吐くとかしないとDiskフルで死亡するので注意が必要(あるある案件)。
ただ、この構成だと、AWXからAnsibleのバージョンを変えて実行とか出来ないので、この辺りは対策したいところ。
例えばカスタムvirtualenv 1 を使って、python2とpyhton3のroleを共存出来るようにしたい。
また、以下にあるとおり カスタムvirtualenv はAWXでも使えるらしい。
ただし、dockerで動かしている場合?、awx_webとawx_taskの両方に作成しないとダメっぽい 2
dockerコンテナに入ってから手動でやるのは微妙オブ微妙なので、Dockerfileいじって変更するかな。
ただ、その場合は、AWXのインストーラの設定でDocker registoryの設定を追加する必要あり 3 。
後、KubernetesでもHelmでインストール出来るようなので、 Rancher Labs の K3s を使ってやっても面白そう。
インターネット利用可能な精神と時の部屋無いですかね?
追記:公開後、ありがたい情報を よこちさん から共有いただいたので追記!
カスタムvirtualenvの作成なんですが、インストール時の inventory の custom_venv_dir って設定を有効にすると、コンテナにマウントしてくれるので、コンテナ内に直接作らなくってすみました!https://t.co/u3nwyRPy1M
— よこち(yokochi) (@akira6592) 2020年6月28日