
第2次トランプ政権が発足した2025年1月に、MetaやAmazonが多様性・公平性・包括性(DEI)に関する方針を一部撤回するなど、それまでDEIを推進していたアメリカ企業の間で取り組みを見直す動きが出ています。新たに、Googleが少数派の従業員の採用に関する数値目標を撤廃し、DEIプログラムを段階的に縮小することがわかりました。
⇧「多様性」は「リスクヘッジ」に寄与している、言わば「保険」のようなものなので、「生産性」の観点で評価するのは間違っている気がするが...
『みんな同じ行動を取っていたら全滅するようなケース』を回避するような話で効果を発揮すると思いますしな...
「イノベーション」的な領域で何かが起こるかもしれない可能性は、様々な視点の考察が活きてくる気がするので、そういったフィールドにおいて「多様性」は真価を発揮すると思うが、「イノベーション」は滅多に起こらないからなぁ...
Ansibleのモジュールとは
公式のドキュメントによりますと、
モジュールの概要
モジュール (「タスクプラグイン」または「ライブラリープラグイン」とも呼ばれます) は、コマンドラインまたは Playbook タスクで使用可能なコードの個別単位です。Ansible は、通常のリモートターゲットノードで各モジュールを実行し、戻り値を収集します。
https://docs.ansible.com/ansible/2.9_ja/user_guide/modules_intro.html
⇧ とありますと。
「Playbook」の構成については、
⇧ 上記サイト様で紹介されているような感じで「セクション」という概念があるらしく、
- Playbook
- play
- Targets
- Vars
- Tasks
- Handlers
- play
が最小構成らしい。
ということらしいが...
で、「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.copy(ansible.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」でどのような処理になるのかの対応表は公式のドキュメントに載せて欲しいですな...
ちなみに、
⇧ 踏み台サーバーを経由する多段SSHにも対応してはいるっぽい。
Azureのbastionとか経由させる必要があるとすると、
⇧ ややこしくなってきそう...
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
⇧ う~む、正解かどうかの判断の仕様がないんだが...
毎度モヤモヤ感が半端ない…
今回はこのへんで。
