※当サイトの記事には、広告・プロモーションが含まれます。

LinuxのシェルスクリプトのコマンドとAnsibleのモジュールの対応が知りたい...

gigazine.net

第2次トランプ政権が発足した2025年1月に、MetaAmazon多様性・公平性・包括性(DEI)に関する方針を一部撤回するなど、それまでDEIを推進していたアメリカ企業の間で取り組みを見直す動きが出ています。新たに、Googleが少数派の従業員の採用に関する数値目標を撤廃し、DEIプログラムを段階的に縮小することがわかりました。

ついにGoogleもDEIプログラムを放棄、「リスクが高く効果がなかった」と社内文書 - GIGAZINE

⇧「多様性」は「リスクヘッジ」に寄与している、言わば「保険」のようなものなので、「生産性」の観点で評価するのは間違っている気がするが...

『みんな同じ行動を取っていたら全滅するようなケース』を回避するような話で効果を発揮すると思いますしな...

イノベーション」的な領域で何かが起こるかもしれない可能性は、様々な視点の考察が活きてくる気がするので、そういったフィールドにおいて「多様性」は真価を発揮すると思うが、「イノベーション」は滅多に起こらないからなぁ...

Ansibleのモジュールとは

公式のドキュメントによりますと、

docs.ansible.com

モジュールの概要

モジュール (「タスクプラグイン」または「ライブラリープラグイン」とも呼ばれます) は、コマンドラインまたは Playbook タスクで使用可能なコードの個別単位です。Ansible は、通常のリモートターゲットノードで各モジュールを実行し、戻り値を収集します。

https://docs.ansible.com/ansible/2.9_ja/user_guide/modules_intro.html

⇧ とありますと。

「Playbook」の構成については、

automation.ap-com.co.jp

⇧ 上記サイト様で紹介されているような感じで「セクション」という概念があるらしく、

  • Playbook
    • play
      • Targets
      • Vars
      • Tasks
      • Handlers

が最小構成らしい。

 Playbook: play = 1: N

ということらしいが...

で、「Ansible」の「モジュール」が大量に用意されているのだそう。

LinuxシェルスクリプトのコマンドとAnsibleのモジュールの対応が知りたい...

で、「シェルスクリプト」のコマンドに限らず、別の何かに置き換えるということはままあることだとは思うのですが、「Ansible」の「モジュール」との対応が全く分からないので、とりあえず、ChatGPTに質問してみたところ、以下のような回答が返ってきた。

「Playbook」の「Tasks」の「セクション」で利用する「モジュール」に相当すると思われるが。

No シェルコマンド Ansible モジュール / 構文 モジュールの用途
1 echo "text" ansible.builtin.debug 出力を表示
2 cat file ansible.builtin.slurp ファイルを読み込む、バイナリファイルをBase64で取得
3 mkdir dir ansible.builtin.file ディレクトリを作成
4 rm -rf dir ansible.builtin.file ディレクトリまたはファイルを削除
5 cp file1 file2 ansible.builtin.copy ファイルをコピー
6 mv file1 file2 ansible.builtin.command or ansible.builtin.rename ファイルを移動または名前変更
7 chmod 755 file ansible.builtin.file ファイルやディレクトリのパーミッション変更
8 chown user:group file ansible.builtin.file ファイルの所有者とグループを変更
9 ps aux ansible.builtin.command or ansible.builtin.shell プロセスの確認
10 kill pid ansible.builtin.kill プロセスを終了
11 for i in list; do ... done loop リストや配列の要素を繰り返し処理(for の代替)
12 while condition; do ... done until 条件が満たされるまで繰り返し処理(while の代替)
13 if condition; then ... fi when 条件付きタスク 条件付きでタスクを実行
14 echo $VAR ansible.builtin.debug 変数の出力
15 grep "pattern" file ansible.builtin.shell(または ansible.builtin.command パターン検索
16 `cat file grep "pattern"` ansible.builtin.shell(または ansible.builtin.command
17 sed 's/old/new/' file ansible.builtin.lineinfile 行を置き換える(sed の代替)
18 awk '{print $1}' file ansible.builtin.shell(または ansible.builtin.command ファイル内の特定の列を操作(awk の代替)
19 tar -czf archive.tar.gz file ansible.builtin.archive ファイルの圧縮
20 tar -xzf archive.tar.gz ansible.builtin.unarchive ファイルの解凍
21 curl -O url ansible.builtin.get_url URLからファイルをダウンロード
22 wget url ansible.builtin.get_url URLからファイルをダウンロード
23 scp file user@host:/path ansible.builtin.copy SSH経由でリモートホストにファイルをコピー
24 rsync -avz source destination ansible.builtin.copyansible.builtin.synchronize リモートホスト間でファイルを同期(rsyncの代替)
25 docker build -t image . community.docker.docker_image Dockerイメージをビルド
26 docker pull image community.docker.docker_image Dockerイメージをプル
27 docker run -d --name container image community.docker.docker_container Dockerコンテナを起動
28 docker ps community.docker.docker_container_info 実行中のDockerコンテナ情報を取得
29 docker stop container community.docker.docker_container Dockerコンテナを停止
30 docker rm container community.docker.docker_container Dockerコンテナを削除
31 docker exec container command community.docker.docker_container_exec Dockerコンテナ内でコマンドを実行
32 docker-compose up community.docker.docker_compose Docker Composeを使って複数コンテナを立ち上げ
33 docker volume create volume_name community.docker.docker_volume Dockerボリュームを作成
34 docker network create network_name community.docker.docker_network Dockerネットワークを作成
35 docker login community.docker.docker_login Dockerレジストリにログイン
36 docker logout community.docker.docker_login Dockerレジストリからログアウト
37 docker push image community.docker.docker_image DockerイメージをリモートのDockerレジストリにプッシュ
38 http POST ansible.builtin.uri POSTリクエストを送信
39 http PUT ansible.builtin.uri PUTリクエストを送信
40 http DELETE ansible.builtin.uri DELETEリクエストを送信
41 http GET ansible.builtin.uri GETリクエストを送信(デフォルトのHTTPメソッド)
42 jq community.general.jq JSONデータのフィルタリング、抽出(jqの代替)
43 pwd ansible.builtin.command または ansible.builtin.shell カレントディレクトリを取得(pwd の代替)
44 diff file1 file2 ansible.builtin.command または ansible.builtin.shell ファイルの差分を比較(diff の代替)
45 xargs loop(または with_items 標準入力から複数の引数を取りコマンドを繰り返し実行
46 trap 'commands' SIGNAL block, rescue, always エラーハンドリングとリソースのクリーンアップ(trap の代替)
47 sshpass -p "password" ssh user@host ansible_ssh_pass パラメータ(または ansible.builtin.command SSHパスワードで接続(sshpass の代替)
48 ssh user@host 自動的にSSH接続ansible_ssh_user, ansible_ssh_key SSH経由でリモートホストに接続
49 ssh user@host -J jump_host ansible_ssh_common_args: '-o ProxyCommand="ssh -W %h:%p user@jump_host"' 踏み台サーバー(ジャンプホスト)を経由したSSH接続
50 ls -la ansible.builtin.find または ansible.builtin.stat ファイルやディレクトリの詳細情報をリスト表示
51 find /path -name "file" ansible.builtin.find ファイルを検索(find の代替)
52 file /path ansible.builtin.file ファイルの種類を判定

他にも、「Linux ディストリビューション」の「パッケージ管理ツール」のコマンドなどにも対応していたりしますと。

「systemctl」などにも対応してると思われますが。

シェルスクリプト」で実現できていたことを「Ansible」のどの「モジュール」が対応しているのかの翻訳作業が中々に辛い...

「実現したいこと」で逆引きができないのが厳しいよね...

とりあえず、「Ansible」の「モジュール」は最終的に「Python」の処理に変換されると聞いたので、せめて、「Python」でどのような処理になるのかの対応表は公式のドキュメントに載せて欲しいですな...

ちなみに、

qiita.com

qiita.com

at-sushi.com

⇧ 踏み台サーバーを経由する多段SSHにも対応してはいるっぽい。

Azureのbastionとか経由させる必要があるとすると、

zenn.dev

zenn.dev

zenn.dev

⇧ ややこしくなってきそう...

ChatGPTに質問してみたところ、以下のような回答が返ってきた。

■playbook

---
- name: SCP file to Azure VM② via Bastion and VM①
  hosts: target_vm
  gather_facts: no
  vars:
    bastion_ip: "{{ hostvars['vm1']['ansible_host'] }}"
    bastion_user: "{{ hostvars['vm1']['ansible_user'] }}"
    bastion_password: "{{ hostvars['vm1']['ansible_password'] }}"
    vm2_user: "{{ hostvars['vm2']['vm2_user'] }}"
    vm2_password: "{{ hostvars['vm2']['vm2_password'] }}"
    local_file_path: "/path/to/local/file"
    remote_file_path: "/path/to/target/directory"
    vm2_port: "{{ hostvars['vm2']['vm2_port'] }}"

  tasks:
    - name: Install sshpass on the bastion (VM1)
      become: yes
      apt:
        name: sshpass
        state: present

    - name: Transfer file from Bastion to Target VM (VM2)
      ansible.builtin.copy:
        src: "{{ local_file_path }}"
        dest: "{{ remote_file_path }}"
      vars:
        ansible_ssh_user: "{{ vm2_user }}"
        ansible_ssh_pass: "{{ vm2_password }}"
        # ansible_ssh_common_args はインベントリファイルで設定済み
    

GitHub Actionsのワークフロー

name: SCP file to Azure VM② via Bastion and VM① using Ansible

on:
  push:
    branches:
      - main

jobs:
  scp_to_azure_vm2_via_vm1:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout the repository
        uses: actions/checkout@v2

      - name: Set up Python for Ansible
        uses: actions/setup-python@v2
        with:
          python-version: '3.x'

      - name: Install Ansible and dependencies
        run: |
          sudo apt-get update
          sudo apt-get install -y ansible sshpass azure-cli

      - name: Login to Azure
        uses: azure/login@v1
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}

      - name: Set up Bastion tunnel
        run: |
          # Bastionトンネルを作成
          az network bastion tunnel --name "${{ secrets.BASTION_NAME }}" --resource-group "${{ secrets.RESOURCE_GROUP_NAME }}" --target-resource-id "${{ secrets.VM1_RESOURCE_ID }}" --resource-port 22 --port 2222 &

      - name: Wait for tunnel to be ready
        run: sleep 10

      - name: Setup Ansible inventory dynamically
        run: |
          echo "[bastion]" > inventory
          echo "vm1 ansible_host=${{ secrets.VM1_PUBLIC_IP }}" >> inventory
          echo "[target_vm]" >> inventory
          echo "vm2 ansible_host=127.0.0.1" >> inventory
          echo "vm2_port=2222" >> inventory
          echo "[all:vars]" >> inventory
          echo "ansible_user=${{ secrets.BASTION_SSH_USER }}" >> inventory
          echo "ansible_password=${{ secrets.BASTION_SSH_PASSWORD }}" >> inventory
          echo "vm2_user=${{ secrets.VM2_SSH_USER }}" >> inventory
          echo "vm2_password=${{ secrets.VM2_SSH_PASSWORD }}" >> inventory
          echo "ansible_ssh_common_args='-o ProxyJump=${{ secrets.BASTION_SSH_USER }}@${{ secrets.VM1_PUBLIC_IP }} -o StrictHostKeyChecking=no'" >> inventory

      - name: Run Ansible Playbook
        run: |
          ansible-playbook -i inventory scp_via_bastion.yml
    

⇧ う~む、正解かどうかの判断の仕様がないんだが...

毎度モヤモヤ感が半端ない…

今回はこのへんで。