ubuntu24.04にansibleをpipxでインストールする

こんにちは
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

今回はUbuntu24.04にansibleをインストールしていきたいと思います。

# 環境
```
shota@shota-20f5a2v5jp:~$ cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.1 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=noble
LOGO=ubuntu-logo
```

# 手順
公式サイトを元にインストールをしていきます。

https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#selecting-an-ansible-package-and-version-to-install

まずpythonとpipがインストール済みであることを確認します。
もしインストールされていなければ先にインストールしましょう
```
shota@shota-20f5a2v5jp:~$ python3 -V
Python 3.12.3
shota@shota-20f5a2v5jp:~$ pip3 -V
pip 24.0 from /usr/lib/python3/dist-packages/pip (python 3.12
```

この後、以下pipコマンドでAnsibleをインストールしようとしたところ、次の警告が出てきました。
hintのところにPEP668があるのでこれを見てみますと、pipでインストールすることによってシステム全体に影響を与えないように制限がかけられているようです。
```
shota@shota-20f5a2v5jp:~$ pip3 install --user ansible
error: externally-managed-environment

× This environment is externally managed
mq> To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.

    If you wish to install a non-Debian-packaged Python package,
    create a virtual environment using python3 -m venv path/to/venv.
    Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
    sure you have python3-full installed.

    If you wish to install a non-Debian packaged Python application,
    it may be easiest to use pipx install xyz, which will manage a
    virtual environment for you. Make sure you have pipx installed.

    See /usr/share/doc/python3.12/README.venv for more information.

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.
```

PEP668について

https://peps.python.org/pep-0668/

この制限を無視することも出来るのですが、制限に沿ってubuntuにAnsibleをインストールしていく場合、aptを使う/venvを使う/pipxを使うの3つの方法があるようです。

- apt
OSのパッケージ管理ツールなので安定感がある。一方インストールされるansibleが少し古い可能性がある様子。今回は除外。
- venv
個別に仮想環境を作り、これもシステム全体に影響を与えることは無い。但し仮想環境をつどつどアクティブ（source myenv/bin/activateみたいなコマンドを打つこと）にする必要があるので面倒。今回は除外
- pipx
venvと同じで仮想環境を作るがつどつどアクティブにする必要もなく自動的にやってくれるらしい。<font color=red>`pipx` が仮想環境内のコマンドをシステムのPATHに直接リンクして登録してくれるから、venvの時のようにわざわざ仮想環境をアクティブにしなくても良い</font>

今回は勉強がてらpipxを使ってみることにします。
（数年前にpythonを集中的に勉強する期間があったのだが、その時はpipxなんて聞いたことが無かった。2018年位にリリースされたものっぽい？venvに関しては当時からよく聞いたのだが・・・）

私の環境にはpipxが入っていなかったので、コマンド使ってインストール。
改めてコマンドを実行して認識していることを確認します。
```
shota@shota-20f5a2v5jp:~$ pipx
コマンド 'pipx' が見つかりません。次の方法でインストールできます:
sudo apt install pipx

shota@shota-20f5a2v5jp:~$ sudo apt install pipx
shota@shota-20f5a2v5jp:~$ pipx --version
1.4.3
```
公式に用意されている以下のコマンドを実行。
ansible自体は問題なくインストール出来たが、コマンドはエラーを吐いてきました。
・・・あれ？PATH通してくれるから、実行できるんじゃないのか・・・
```
shota@shota-20f5a2v5jp:~$ pipx install --include-deps ansible
  installed package ansible 11.1.0, installed using Python 3.12.3
  These apps are now globally available
    - ansible
    - ansible-community
    - ansible-config
    - ansible-console
    - ansible-doc
    - ansible-galaxy
    - ansible-inventory
    - ansible-playbook
    - ansible-pull
    - ansible-test
    - ansible-vault
⚠️  Note: '/home/shota/.local/bin' is not on your PATH environment variable. These apps will not be globally
    accessible until your PATH is updated. Run `pipx ensurepath` to automatically add it, or manually modify your
    PATH in your shell's config file (i.e. ~/.bashrc).
done! ✨ 🌟 ✨

shota@shota-20f5a2v5jp:~$ ansible --version
コマンド 'ansible' が見つかりません。次の方法でインストールできます:
sudo apt install ansible-core
```

pipxのNoteの内容を見てみると以下のようにありますが、これが先ほどちらっと出てきた「pipx が仮想環境内にインストールされたコマンドをシステムの PATH に登録してくれる」仕組み。この”pipx ensurepath”コマンドを実行すると仮想環境内にインストールされたコマンドをシステムの PATH に登録してくれるらしい。
```
⚠️  Note: '/home/shota/.local/bin' is not on your PATH environment variable. These apps will not be globally
    accessible until your PATH is updated. Run `pipx ensurepath` to automatically add it
```

実行してみます。
/home/shota/.local/binにPATHを追加したらしいです。
```
shota@shota-20f5a2v5jp:~$ pipx ensurepath
Success! Added /home/shota/.local/bin to the PATH environment variable.

Consider adding shell completions for pipx. Run 'pipx completions' for instructions.

You will need to open a new terminal or re-login for the PATH changes to take effect.

Otherwise pipx is ready to go! ✨ 🌟 ✨
```

この時PATH変数の内容を見てみると以下のようになっていました。
変数に上記のファイルの記載が無いので追加してあげないといけないです。
```
shota@shota-20f5a2v5jp:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
```
以下のコマンドを実行します。
最終行にpipxで"export PATH～"という記載が記載されていることを確認します。
pipxが自動で追加してくれているんですね～
万が一記載が無かったら記載してあげてください。
```
shota@shota-20f5a2v5jp:~$ cat ~/.bashrc

～～～最終行～～～
# Created by `pipx` on 2025-01-24 09:04:36
export PATH="$PATH:/home/shota/.local/bin"
```
上記確認が取れたらsourceコマンドを実行して設定変更を反映します。
反映したら今度はansibleコマンドが実行できるはずです。
```
shota@shota-20f5a2v5jp:~$ source ~/.bashrc
shota@shota-20f5a2v5jp:~$ ansible --version
ansible [core 2.18.1]
  config file = None
  configured module search path = ['/home/shota/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/shota/.local/share/pipx/venvs/ansible/lib/python3.12/site-packages/ansible
  ansible collection location = /home/shota/.ansible/collections:/usr/share/ansible/collections
  executable location = /home/shota/.local/bin/ansible
  python version = 3.12.3 (main, Jan 17 2025, 18:03:48) [GCC 13.3.0] (/home/shota/.local/share/pipx/venvs/ansible/bin/python)
  jinja version = 3.1.5
  libyaml = True
```