以下の内容はhttps://zaki-hmkc.hatenablog.com/entry/2025/12/13/002900より取得しました。


mise + uv構成で外部と分離されたAnsible環境の構築

本エントリは「Ansible Advent Calendar 2025」の13日目のエントリです。
ちなみにEmacs育ちなのでCtrl-a/e/n/pなどの基本的なカーソル移動は(bashでも使うので)当然、Ctrl-x 4 aでChangelogドキュメントの自動作成など、たいていの操作は(脳は忘れてるけど)指が覚えています。

Ansibleアドカレ、枠が空いていたので、久しぶりの投稿として、以前まとめた「miseを使ってAnsible環境を用意する」をuv連携させてみました。

zaki-hmkc.hatenablog.com

このエントリを書いたときはuvをまだ触ったことがなかったため、uv抜きのmise + Python venvの機能のみの構成でしたが、今回は、上記にuvを使ったパッケージ管理を組み込んだ構成について。

uv自体にはPython自体を仮想環境へインストールする機能もあるが、Python自体は今回はmiseでインストールします。(uvmiseでインストール)
(Pythonパッケージ管理のみuvで行う構成)

環境定義

Pythonとuvの指定

Pythonもuvもmiseでインストールできるので、プロジェクトディレクトリ(Ansibleで作業するディレクトリ)のトップで以下実行。

mise use python@3.13.5
mise use uv@0.9.17

これでカレントディレクトリにmise.tomlファイルが生成され、このディレクトリ配下で有効になる。

[tools]
python = "3.13.5"
uv = "0.9.17"

あとは前回と同じようにこのファイルに設定追加していく。

venv設定

Python自体のvenv機能の有効化と若干変更があり、uv用のvenv有効化のsettingsセクションの設定を追加。
envセクションのvenvの作成についてはuv無しの場合と同等。
試してはないけれど、uv用のオプションを追加する場合はuv_create_argsに指定すれば良いと思われ。

[settings]
python.uv_venv_auto = true

[env]
_.python.venv = { path = ".venv", create = true }

Ansibleコレクションパス

ここから先はuv無しの前回と同じ内容。
コレクションパスはデフォルトでは$HOME/.ansible以下へインストールされてPythonの仮想環境を貫通してしまうため、プロジェクトのディレクトリにいるときだけ有効になるmiseの環境変数設定を使って、プロジェクトディレクトリ直下の.ansibleディレクトリを使うようにする。

[env]
ANSIBLE_COLLECTIONS_PATH = "{{ config_root }}/.ansible"

Ansibleと追加パッケージとコレクションのインストール

これも前回と同様、requirements.txtrequirements.ymlに集約した上で、uv pip install -ransible-galaxy collection install -rをタスクランナーに設定しておき、コマンド一発でセットアップできるようにする。

[tasks.install]
description = "install prerequisites"
alias = "i"
run = """
uv pip install -r requirements.txt
ansible-galaxy collection install -r requirements.yml
"""

これでmise runしてUIからinstallを選ぶか、mise run installmise r iを実行すれば、requirementsに指定したパッケージ類を一括でインストールできる。

自分で作ったmise.tomlでなくgit cloneとかエディタで作成した場合

以前書いた通りmise.tomlファイルのあるディレクトリでmise trustで承認する。

まとめ(mise.toml)

mise.tomlは以下の通り。(Pythonとuvのバージョンは2025.12.12時点の最新)

[tools]
python = "3.13.5"
uv = "0.9.17"

[settings]
python.uv_venv_auto = true

[env]
PROJECT_NAME = "{{ config_root | basename }}"
_.python.venv = { path = ".venv", create = true }
ANSIBLE_COLLECTIONS_PATH = "{{ config_root }}/.ansible"

[tasks.install]
description = "install prerequisites"
alias = "i"
run = """
uv pip install -r requirements.txt
ansible-galaxy collection install -r requirements.yml
"""

requirements.txtは以下の通り (ansible-core以外はサンプル)

ansible-core==2.20.1
proxmoxer==2.2.0
requests==2.32.3

requirements.ymlは以下の通り。(記述例)

---
collections:
- name: community.general
  version: 10.7.3

(おまけ) uvとpipの速度比較

これ以降はおまけ。

uvpipに比べて高速とは言われてるけど、どれくらい速いのかせっかくなので実際に試してみた。
結論としては「マジはえぇ、どうなってんの??」で、使えるのならuvの方がそりゃええわ、でした。

atmarkit.itmedia.co.jp

題材は、依存含めてそこそこ処理時間のかかるであろうansibleのインストール(ansible-coreではなく)

time pip install ansible==13

従来のpipを使ったインストールは、5回(インストール処理時間を計測したらvenv毎削除・再作成して再インストールの計測を)実行してrealの値は以下の通り。

回数 実行時間
1 26.476s
2 20.832s
3 21.050s
4 18.938s
5 21.295s
ave. 21.7182s

time uv pip install ansible==13

一方でuvを使ってインストールすると、、、初回

real    0m7.624s
user    0m1.868s
sys     0m5.061s

意味の分からない処理時間をたたき出した。速すぎる。

venvを削除して再実行…

real    0m0.561s
user    0m0.068s
sys     0m0.646s

おそろしく速いインストール。オレでなきゃ見逃しちゃうね。

キャッシュ?

ホームディレクトリを漁った感じでは、$HOME/.cache/uvにありそう。
一度セットアップしたことがあるバージョンのパッケージはここに溜まっているので再セットアップでさらに高速化できている…のかも?

とはいえ初回の実行から高速なので、繰り返し実行しない場合でも十分恩恵がありそう。

どういうときに利点がある?

CIのように何度も実行するような環境、かつ場合によっては処理時間に対して課金が発生するケースとかかな。
miseと組み合わせるのはVM上の開発環境のような場合なので、CI/CDでの実行ならuvを直接使う方が良いような気もする。


まとめ

uvは良いぞ。
まだ全然使いこなしてはいないけど、処理速度は確かに驚くほど高速。

あともちろん、miseも便利。やっぱりタスクランナーが便利。

miseはちょこちょことネタ投下してるので、興味があったらぜひ。

zaki-hmkc.hatenablog.com

mise.jdx.dev

miseの推しポイントを挙げるとするとパッケージ管理だけでなく、venvの作成と有効化や環境変数の設定がプロジェクトのディレクトリに移動すれば自動で設定されるので「準備の作業漏れの心配がない」ことや、定型作業をタスク登録しておけば簡単に実行できることとその定義がmise.tomlに集約されるのでタスクの内容の確認も容易なところ。とかですかね。




以上の内容はhttps://zaki-hmkc.hatenablog.com/entry/2025/12/13/002900より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14