Win10でネイティブにAnsibleを実行したかった件

f:id:yassan0627:20210508153841p:plain

結論

Windows Frequently Asked Questions · ansible/ansible にある通り、現状、Windowsから直接Ansibleは実行出来ない(但し、WSL経由ならいける)。

Can Ansible run on Windows? No, Ansible can only manage Windows hosts. Ansible cannot run on a Windows host natively, though it can run under the Windows Subsystem for Linux (WSL).

環境

-- --
エディション Windows 10 Pro
バージョン 21H1
インストール日 2020/08/23
OS ビルド 19043.964
エクスペリエンス Windows Feature Experience Pack 120.2212.3740.0

モチベ

Win10 Homeで、VagrantHyper-V使ってVM起動する際に、 初回の作業(特定のユーザ作ってSSH鍵追加したり、dnf updateとか)がダルいので自動化したい、、、

んで、Provisionerにちょうどよいのないかなぁとドキュメント読んでたら、 VagrantのProvisionerにAnsibleが使えるって事で試そうとした。

www.vagrantup.com

やった事

pythonのインストール

以下にある通り、パッケージをDLってインストール。 www.python.jp

仮想環境の作成&ansibleのインストール

ansibleがwinネイティブに使えるなら他にも使いたいので、venvを使って環境を分ける。

❯ py -m venv --without-pip .venv
❯ .venv\Scripts\activate.ps1
❯ curl https://bootstrap.pypa.io/get-pip.py
❯ py get-pip.py
❯ py -m pip install -r requirements.txt

requirements.txt

flake8
pytest
cryptography
jmespath == 0.9.5
PyYAML >= 5.4.1

ansible-base <2.11,>=2.10.7
yamllint >=1.25.0
ansible-lint >=5.0.0
python-vagrant >= 0.5.15

上手くいくかと思ったけど、以下のエラー

❯ py -m pip install ansible-base==2.10.9
Collecting ansible-base==2.10.9
  Using cached ansible-base-2.10.9.tar.gz (6.0 MB)
Requirement already satisfied: jinja2 in c:\users\yassan\vargant\hoge\.venv\lib\site-packages (from ansible-base==2.10.9) (2.11.3)
Requirement already satisfied: PyYAML in c:\users\yassan\vargant\hoge\.venv\lib\site-packages (from ansible-base==2.10.9) (5.4.1)
Requirement already satisfied: cryptography in c:\users\yassan\vargant\hoge\.venv\lib\site-packages (from ansible-base==2.10.9) (3.4.7)
Requirement already satisfied: packaging in c:\users\yassan\vargant\hoge\.venv\lib\site-packages (from ansible-base==2.10.9) (20.9)
Requirement already satisfied: cffi>=1.12 in c:\users\yassan\vargant\hoge\.venv\lib\site-packages (from cryptography->ansible-base==2.10.9) (1.14.5)
Requirement already satisfied: pycparser in c:\users\yassan\vargant\hoge\.venv\lib\site-packages (from cffi>=1.12->cryptography->ansible-base==2.10.9) (2.20)
Requirement already satisfied: MarkupSafe>=0.23 in c:\users\yassan\vargant\hoge\.venv\lib\site-packages (from jinja2->ansible-base==2.10.9) (1.1.1)
Requirement already satisfied: pyparsing>=2.0.2 in c:\users\yassan\vargant\hoge\.venv\lib\site-packages (from packaging->ansible-base==2.10.9) (2.4.7)
Building wheels for collected packages: ansible-base
  Building wheel for ansible-base (setup.py) ... error
  ERROR: Command errored out with exit status 1:
   command: 'C:\Users\yassan\vargant\hoge\.venv\Scripts\python.exe' -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\yassan\\AppData\\Local\\Temp\\pip-install-4p46nnmv\\ansible-base_68e8945aa34749959f5671f4bb8c4177\\setup.py'"'"'; __file__='"'"'C:\\Users\\yassan\\AppData\\Local\\Temp\\pip-install-4p46nnmv\\ansible-base_68e8945aa34749959f5671f4bb8c4177\\setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d 'C:\Users\yassan\AppData\Local\Temp\pip-wheel-tymwpqt_'
       cwd: C:\Users\yassan\AppData\Local\Temp\pip-install-4p46nnmv\ansible-base_68e8945aa34749959f5671f4bb8c4177\
  Complete output (951 lines):
  running bdist_wheel
   :
  creating build\lib\ansible_test\_data\sanity\yamllint
  copying test\lib\ansible_test\_data\sanity\yamllint\yamllinter.py -> build\lib\ansible_test\_data\sanity\yamllint
  creating build\lib\ansible_test\_data\sanity\yamllint\config
  copying test\lib\ansible_test\_data\sanity\yamllint\config\default.yml -> build\lib\ansible_test\_data\sanity\yamllint\config
  copying test\lib\ansible_test\_data\sanity\yamllint\config\modules.yml -> build\lib\ansible_test\_data\sanity\yamllint\config
  copying test\lib\ansible_test\_data\sanity\yamllint\config\plugins.yml -> build\lib\ansible_test\_data\sanity\yamllint\config
  creating build\lib\ansible_test\_data\setup
  copying test\lib\ansible_test\_data\setup\ConfigureRemotingForAnsible.ps1 -> build\lib\ansible_test\_data\setup
  copying test\lib\ansible_test\_data\setup\docker.sh -> build\lib\ansible_test\_data\setup
  copying test\lib\ansible_test\_data\setup\remote.sh -> build\lib\ansible_test\_data\setup
  copying test\lib\ansible_test\_data\setup\windows-httptester.ps1 -> build\lib\ansible_test\_data\setup
  creating build\lib\ansible_test\config
  copying test\lib\ansible_test\config\cloud-config-aws.ini.template -> build\lib\ansible_test\config
  copying test\lib\ansible_test\config\cloud-config-azure.ini.template -> build\lib\ansible_test\config
  copying test\lib\ansible_test\config\cloud-config-cloudscale.ini.template -> build\lib\ansible_test\config
  copying test\lib\ansible_test\config\cloud-config-cs.ini.template -> build\lib\ansible_test\config
  copying test\lib\ansible_test\config\cloud-config-gcp.ini.template -> build\lib\ansible_test\config
  copying test\lib\ansible_test\config\cloud-config-hcloud.ini.template -> build\lib\ansible_test\config
  copying test\lib\ansible_test\config\cloud-config-opennebula.ini.template -> build\lib\ansible_test\config
  copying test\lib\ansible_test\config\cloud-config-openshift.kubeconfig.template -> build\lib\ansible_test\config
  copying test\lib\ansible_test\config\cloud-config-scaleway.ini.template -> build\lib\ansible_test\config
  copying test\lib\ansible_test\config\cloud-config-tower.ini.template -> build\lib\ansible_test\config
  copying test\lib\ansible_test\config\cloud-config-vcenter.ini.template -> build\lib\ansible_test\config
  copying test\lib\ansible_test\config\cloud-config-vultr.ini.template -> build\lib\ansible_test\config
  copying test\lib\ansible_test\config\inventory.networking.template -> build\lib\ansible_test\config
   :
  copying test\lib\ansible_test\config\inventory.winrm.template -> build\lib\ansible_test\config
  error: symbolic link privilege not held
  ----------------------------------------
  ERROR: Failed building wheel for ansible-base
  Running setup.py clean for ansible-base
Failed to build ansible-base
Installing collected packages: ansible-base
    Running setup.py install for ansible-base ... error
    ERROR: Command errored out with exit status 1:
     command: 'C:\Users\yassan\vargant\hoge\.venv\Scripts\python.exe' -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\yassan\\AppData\\Local\\Temp\\pip-install-4p46nnmv\\ansible-base_68e8945aa34749959f5671f4bb8c4177\\setup.py'"'"'; __file__='"'"'C:\\Users\\yassan\\AppData\\Local\\Temp\\pip-install-4p46nnmv\\ansible-base_68e8945aa34749959f5671f4bb8c4177\\setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record 'C:\Users\yassan\AppData\Local\Temp\pip-record-9tp3_0q8\install-record.txt' --single-version-externally-managed --compile --install-headers 'C:\Users\yassan\vargant\hoge\.venv\include\site\python3.6\ansible-base'
         cwd: C:\Users\yassan\AppData\Local\Temp\pip-install-4p46nnmv\ansible-base_68e8945aa34749959f5671f4bb8c4177\
    Complete output (949 lines):
    running install
    running build
    running build_py
    creating build
    creating build\lib
      :
    copying test\lib\ansible_test\config\inventory.winrm.template -> build\lib\ansible_test\config
    error: symbolic link privilege not held
    ----------------------------------------
ERROR: Command errored out with exit status 1: 'C:\Users\yassan\vargant\hoge\.venv\Scripts\python.exe' -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\yassan\\AppData\\Local\\Temp\\pip-install-4p46nnmv\\ansible-base_68e8945aa34749959f5671f4bb8c4177\\setup.py'"'"'; __file__='"'"'C:\\Users\\yassan\\AppData\\Local\\Temp\\pip-install-4p46nnmv\\ansible-base_68e8945aa34749959f5671f4bb8c4177\\setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record 'C:\Users\yassan\AppData\Local\Temp\pip-record-9tp3_0q8\install-record.txt' --single-version-externally-managed --compile --install-headers 'C:\Users\yassan\vargant\hoge\.venv\include\site\python3.6\ansible-base' Check the logs for full command output.

結論にある通り、FAQ見たら動かないとの事。。残念。

Can Ansible run on Windows? No, Ansible can only manage Windows hosts. Ansible cannot run on a Windows host natively, though it can run under the Windows Subsystem for Linux (WSL).

参考

スマイルゼミタブレット3をAndroidタブレット化&ファミリーリンク対象にする話

子供がスマイルゼミをやってたのだけど、4月から辞めることにしたので、Androidタブレット化して使おうって事でやってみたがハマりどころがあったのでメモ。

前提

型番: SZJ-JS201 のスマイルゼミタブレット3

Androidタブレット化する

Androidタブレット化するのはむっちゃ簡単。
以下の通りにやったら良いだけ。

smile-zemi.jp

ファミリーリンクの対象となるように子供のアカウントを使う

ここでハマった。
おそらくスマイルゼミタブレット3のAndroid OSのバージョンが、 v5.1 系で有ることが一番の原因だろう(Justsystemさん、updateしてくれないかなぁ)。

何も対策しない状態だと、子供のアカウントを追加しようとして、保護者アカウントで承認する辺りでコケる。
対処方法は、以下。

  1. 保護者のアカウントで一旦、アカウントを追加。
  2. Google Play 開発者サービス」を含む、スマイルゼミタブレット3にあるアプリをすべてアップデート
  3. 設定→ユーザー設定→アカウントから、今使っている保護者のアカウントを削除
  4. 子供のアカウントでログイン

詳細は 以下の「お子様のアカウントでログインできない場合」って箇所を参照。

お子様の Android デバイスでのログイン - Google For Families ヘルプ

Androidタブレット化してみて

OSが古いのでいつまで使えるかなぁ感が否めない。
また、タブレットとしてのスペックもメモリ 2GB LPDDR3、フラッシュメモリ 16GBとそこまで期待出来ない。

実は、Z会に乗り換えたのだけど、Z会側のスペックを満たしてなかったので、使い回し出来なかったのが残念。。

KVMスイッチ サンワサプライ 400-SW032 の使用メモ

在宅勤務が今後も続くって事で、以下の状態だったので、

んで、実際に買ってみてのメモ。 amzn.to

結論

使えるかどうかって話だと、Windows10(自作マシン)とUbuntu 20.04LTS(ThinkPad T480s)の環境で使ってますが、問題なく使えています。

利用環境

キーボードは Lenovo のワイヤレスのUSキーボードを使ってます。 www.lenovo.com

マウスは、Logicoolの MX Master 2S

amzn.to

ただ、KVMに指してるのは、キーボードだけ。
理由は、マウスがUnifyingレシーバーを使っているのでこのKVMスイッチでは対応していないためです。
とは言え、MX Master 2S自身に、切り替えボタンがあるので特に困ってない(対応してれば便利ですが)。

注意点(というか忘れやすいのでメモ)

切り替えキー変更の際は、 IMEオフにして Ctrl+F12 → Tキー
🚨 IMEオンの際は、変更出来ない

まとめ

  • (メーカー動作保証外だけど)Windows10↔Ubuntu20.04で利用可能
  • 切り替えキーは、 デフォルト Ctrl2回だが、ScrLock2回に変更も可能
    • 変更の際は、IMEオフにするのを忘れない事
  • BluetoothやUnifyingには非対応
  • 標準じゃないキー、いわゆるメディアキー(ボリュームUPとか)は使えない
  • 特にタイピングに追いつかないとかの現象は、Win/Ubuntuどっちでも発生してない

切り替えキーで切り替え出来るのはホント便利。
有線マウスとかならマウスも込みで切り替え出来るのでもっと便利そう。

まぁ、以下の機能のあるお値段手頃なキーボードあればそっち使うかも。 * Win/Linuxで切り替え機能 * US配列 * ワイヤレス * テンキーレス(矢印キーやHome、とかは分離してるテンキーだけ無い こういうの ) * ミュートON/OFFとかメディアキー有り

やっさん的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で運用出来ないか検討してみる

qiita.com

1日遅れになってしまいましたが、、、
この記事は MicroAd (マイクロアド) Advent Calendar 2020 - Qiita20日目の記事です。

昨日は dai08srhg - Qiita のEmbulkの話でした。
(´-`).。oO(EmbulkはHiveやHDFS系のプラグインがアップデートあると嬉しいなぁと思う今日この頃) qiita.com

さて、本題ですが、今回はHueとDockerを使った話です。 Cloudera Hueは、 CDHに含まれているコンポーネントの一つ ですが、Hueは他のコンポーネントに比べて他のコンポーネントと協調して動作するものではなく基本的にクラスタのクライアントな立ち位置となります。

gethue.com

また、Hueはこのところ積極的なアップデートがあるので常に最新を使いたい!が、CDHはその都度追従してくれるわけでも無い状態です。そこで今回は、CDHから切り離して、Hue On Dockerで代わりが出来ないか考えてみます。

Hue自身については、12/23の以下のアドカレでアップデート情報があるので気になる方はご覧になって下さい。

qiita.com

  • 前提
  • 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対応は今回対象外とする(検証環境を用意するには時間が足りないので…)
  • LDAPSAML認証については、対象外(検証環境を用意するには時間が足りないので…)
  • HueでつかうSparkについては、Livyが用意出来なかったので見送り
  • Kubernetesでの稼働は見送り(時間足らんかった…)

  • CDHにHueを入れてるけど、最新のHueに上げたくてウズウズしている

Docker でHueを動かしてみる

hue/tools/docker/hue at master · cloudera/huedocker-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:

※全てのサンプルファイルは全てGithubに置いてます2

起動時の注意

実行する手順は、 初回だけ以下の様にdatabaseだけ先に起動して、初回起動時にHueのデータベースを作成してからHueを起動します。

$ docker-compose up --no-start
$ docker-compose start database
$ docker-compose up -d

2回目以降は、 docker-compose up -d のみでOKです。

では、Docker Composeを見ていきます。

続きを読む

所属していないクラスタに対してDispCpやhdfs dfsを使う場合のTips

f:id:yassan0627:20201211005710p:plain この記事は Distributed computing (Apache Spark, Hadoop, Kafka, ...) Advent Calendar 2020 の11日目の記事です。

qiita.com

クラスタ間でHDFSファイルを移動したいというのは割とよくある話です。 そこでHDFSファイルを大量に移動する際は、DistCpを使うことになります。

ただ、移動元も移動先にも所属していないクライアントから通常DistCpは使えません(クラスタの設定情報がないので)。

設定をどうにかして渡せば、多分出来るだろうなぁと思いつつも「まぁ移動先のクラスタクライアントにSSHしたらいいか。」で後回しにしてましたが、自分のPCからDocker使ってやりたいなぁって事で調べました。

DistCpそのものについては、以下の最高の記事があるのでそこを参照下さい。 shiumachi.hatenablog.com

前提

以下のCloudera Enterpriseが対象です。

続きを読む

お手軽・簡単?!Cloud Storage Connectorを使ってHadoopクラスタからGCS・S3にデータを移動する

qiita.com

この記事は MicroAd (マイクロアド) Advent Calendar 2020 - Qiita の3日目の記事です。

昨日は Kotlin大好き? wrongwrong の以下のGitHub ActionsでJava/Kotlin製ライブラリ(ビルドツールはgradle)のCI環境構築する話でした。 qiita.com

3日目の記事は、Hadoopネタです。

HDFSに貯めたデータをクラウドストレージに持っていってクラウド上で何かをしたい(BigQueryから参照させたいetc)。 また、バックアップ先としてクラウドストレージを使いたい、クラウドストレージのデータをHadoopクラスタから参照したい。。。

など、Hadoopクラスタからクラウドへ、また、その逆についてもやりたいケースがありますが、その為にローカルに落として aws s3gsutil などを使って都度都度データを移動するのはとても億劫です。

そこで、今回はHadoopクラスタからHadoopクラスタ外に楽にデータを移動する事が出来るCloud Storage Connectorを紹介します。
Cloud Storage Connectorを使うとGoogle Cloud Storage(GCS)、Amazon S3Microsoft 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 について
  • 環境の用意
  • 動作確認
    • hdoopコマンド使えるか(HadoopクラスタからGCSバケットを操作できるか確認)
    • HiveからSQLでGCSにデータを入れられるか
      • テーブルのLocationに指定するパスをGCSバケットにフォルダを作成する
      • テーブル作成
      • データの挿入
    • DistCp使ってみる
    • Sparkを使ってみる(割愛)
  • 注意事項
  • 補足
  • 最後に

前提条件

今回は以下を前提とします。

  • CDH v6.3.21
  • Cloud Storage Connectorは GCS のものを利用
続きを読む