本エントリは「Ansible Advent Calendar 2025」の13日目のエントリです。
ちなみにEmacs育ちなのでCtrl-a/e/n/pなどの基本的なカーソル移動は(bashでも使うので)当然、Ctrl-x 4 aでChangelogドキュメントの自動作成など、たいていの操作は(脳は忘れてるけど)指が覚えています。
Ansibleアドカレ、枠が空いていたので、久しぶりの投稿として、以前まとめた「miseを使ってAnsible環境を用意する」をuv連携させてみました。
このエントリを書いたときはuvをまだ触ったことがなかったため、uv抜きのmise + Python venvの機能のみの構成でしたが、今回は、上記にuvを使ったパッケージ管理を組み込んだ構成について。
uv自体にはPython自体を仮想環境へインストールする機能もあるが、Python自体は今回はmiseでインストールします。(uvもmiseでインストール)
(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.txtとrequirements.ymlに集約した上で、uv pip install -rとansible-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 installやmise 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の速度比較
これ以降はおまけ。
uvはpipに比べて高速とは言われてるけど、どれくらい速いのかせっかくなので実際に試してみた。
結論としては「マジはえぇ、どうなってんの??」で、使えるのならuvの方がそりゃええわ、でした。
題材は、依存含めてそこそこ処理時間のかかるであろう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はちょこちょことネタ投下してるので、興味があったらぜひ。
miseの推しポイントを挙げるとするとパッケージ管理だけでなく、venvの作成と有効化や環境変数の設定がプロジェクトのディレクトリに移動すれば自動で設定されるので「準備の作業漏れの心配がない」ことや、定型作業をタスク登録しておけば簡単に実行できることとその定義がmise.tomlに集約されるのでタスクの内容の確認も容易なところ。とかですかね。