Ansible Moleculeをローカルに導入せずにコンテナ上で使用する例

aliasで対応しようとしたがうまくいかなかったのでスクリプトで対応した

# 環境
- Fedora Linux 36 (Workstation Edition)
- podman version 4.2.1
- sudoにてpodmanコマンドがパスワードなしで実行できる


# 課題
- カレントディレクトリー、および ~/.cache/molecule/<role名> への実行ユーザーでのアクセスが必要
    - 実行ユーザー権限で読み書きができ、作成されたファイルも実行ユーザー所有である必要がある
    - コンテナ外のホームディレクトリーをコンテナ内でもホームディレクトリーとして認識できる必要がある

# スクリプト例

```:~/bin/mo
#! /usr/bin/bash

set -x

sudo podman run -it --rm \
-u "$(id -u):$(id -g)" \
-v "${PWD}:${PWD}" \
-w "${PWD}" \
-v "${HOME}:${HOME}" \
-e HOME="${HOME}" \
--entrypoint="" \
quay.io/ansible/creator-ee:v0.10.4 bash <<__EOC__
molecule $@
exit
__EOC__

```

- `set -x`は、デバック用途
- `sudo`がないと-v にて共有したディレクトリーがroot所有として認識され書き込みができなかった
- `-it`は、The input device is not a TTYとワーニングが出力されているが、`-i`のみ、`-t`のみ、`-d`などを試したがうまくいっていないのでこのまま-itで使用
- `-u "$(id -u):$(id -g)"`によりコンテナ内でもコンテナ外の実行ユーザーID、実行グループIDにて実行する
    - 1000:1000などならばバッティングはしないが、小さい数値の場合には注意
- `-v "${PWD}:${PWD}"`によりmolerule init role などでのカレントディレクトリーへの書き込みを許容
- `-w "${PWD}"`によりコンテナ内でのワーキングディレクトリーをコンテナ外でのカレントディレクトリーに合わせる
- `-v "${HOME}:${HOME}"`により、~/.cache/molecule/<role名> へのアクセスを許容する
    - よりアクセスを制限するなら、あらかじめ~/.cache/molecule/を作っておいて、`-v "${HOME}/.cache/molecule:${HOME}/.cache/molecule"`とすれば動作できるはず
- `-e HOME="${HOME}"`により、~/.cache/molecule/<role名> へのアクセスを実際のパスと合わせる
- エントリーポイントの設定を確認するのが面倒であったので、`--entrypoint=""`により、エントリーポイントを上書き無効化
- `bash <<__EOC__;...;__EOC__`によりヒアドキュメントを用いてbashにコマンドを流し込む
- 実行するコマンドはmolecule $@;exit
- 個人的な使用用途ではdockerやpodmanのdriverは使用していないので、DooDなどさらに内部からコンテナを立ち上げるための対応はしていない。


# 実行例

```
$ which mo
~/bin/mo

$ cd ~/repo

$ mo init role role01 
++ id -u
++ id -g
+ sudo podman run -it --rm -u 1000:1000 -v /home/hoge/repo:/home/hoge/repo -w /home/hoge/repo -v /home/hoge:/home/hoge -e HOME=/home/hoge --entrypoint= quay.io/ansible/creator-ee:v0.10.4 bash
WARN[0000] The input device is not a TTY. The --tty and --interactive flags might not work properly 
molecule init role role01
exit
[1000@a966d8c90151 repo]$ molecule init role role01
INFO     Initializing new role role01...
No config file found; using defaults
- Role role01 was created successfully
INFO     Initialized role in /home/hoge/repo/role01 successfully.
[1000@a966d8c90151 repo]$ exit
exit

$ tree ./role01/
./role01/
├── README.md
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── molecule
│   └── default
│       ├── INSTALL.rst
│       ├── converge.yml
│       ├── create.yml
│       ├── destroy.yml
│       ├── molecule.yml
│       └── verify.yml
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

10 directories, 14 files

$ cd role01/

$ molecule list 
INFO     Running default > list
                ╷             ╷                  ╷               ╷         ╷            
  Instance Name │ Driver Name │ Provisioner Name │ Scenario Name │ Created │ Converged  
╶───────────────┼─────────────┼──────────────────┼───────────────┼─────────┼───────────╴
  instance      │ delegated   │ ansible          │ default       │ false   │ false      
                ╵             ╵                  ╵               ╵         ╵            

$ tree ~/.cache/molecule/role01/
/home/hoge/.cache/molecule/role01/
└── default
    ├── ansible.cfg
    ├── inventory
    │   └── ansible_inventory.yml
    ├── molecule.yml
    └── state.yml

2 directories, 4 files
```