Ansible のターゲットノード上で任意のコマンドを実行するには、次のような組み込みモジュールを使用します。
- ansible.builtin.command モジュール
- 任意のコマンドを実行します。 シェルを経由せず、指定したコマンドを直接実行するので、シェル特有の機能は使えません。 Windows の場合は代わりに ansible.builtin.win_command を使用します。
- ansible.builtin.shell モジュール
- シェル (
/bin/sh
) で任意のコマンドを実行します。 シェルの機能($HOSTNAME
のような変数展開や*
によるファイルグロブ、>
によるリダイレクトなど)を使用することができます。 Windows の場合は代わりに ansible.builtin.win_shell を使用します。
command モジュールの基本
指定したコマンドを実行したいときは、command
モジュールの cmd
パラメーターでそのコマンド(と引数)を指定します。
- name: Run command
ansible.builtin.command:
cmd: cat /etc/hostname
上記のような簡単なコマンドであれば、次のように省略して記述できます。
- name: Run command
ansible.builtin.command: cat /etc/hostname
実行するコマンドの引数として "user name"
のようなスペースを含む値を渡したいときは、次のように argv
を使ってコマンドと各引数を分割して指定します(この場合、cmd
パラメーターは使用しません)。
- name: Run command
ansible.builtin.command:
argv:
- /usr/bin/add_user_to_db.sh
- user name
- database name
ファイルの有無で実行するかどうか制御する (creates/removes)
command
モジュールで指定したコマンドは、デフォルトで毎回実行されますが、creates
および removes
パラメーターを使用すると、特定のファイルの有無によってコマンドを実行するかしないかを制御することができます。
creates パラメーター
creates
パラメーターでファイル名を指定しておくと、そのファイルが存在しない場合だけタスクを実行します。
つまり、そのファイルを生成するようなコマンドを実行することを示唆します。
- name: Create an empty database
ansible.builtin.command:
cmd: /usr/bin/make_database.sh
creates: /path/to/database
removes パラメーター
逆に、特定のファイルが存在する場合だけコマンドを実行したいときは、removes
パラメーターでそのファイル名を指定します。
リダイレクトやパイプなどのシェル機能を利用する
リダイレクト (>
) やパイプ (|
) はシェル特有の機能なので、これらの機能を使う場合は、command
モジュールの代わりに shell
モジュールを使用する必要があります。
- name: List all entries in etc
ansible.builtin.shell:
cmd: ls /etc > files.txt
creates: files.txt
shell
モジュールで指定可能なパラメーターは、command
モジュールとほぼ同様です。
コマンドを複数行に分けて記述する
長いコマンドは複数行に分けて記述した方が見やすくなります。
これは Ansible というより YAML の構文ですが、次のようにして cmd
パラメーターの値を複数行に分けて記述できます。
- name: Multi-line command
ansible.builtin.shell:
cmd: >
echo AAA > aaa.txt &&
echo BBB > bbb.txt &&
echo CCC > ccc.txt
末尾の >
は、複数行にわたるテキストをスペースで結合するという意味を持っています。
関連記事
- Ansible タスク例: Docker と Docker Compose をインストールする
- Ansible タスク例: 空のディレクトリを作成する (ansible.builtin.file)
- Ansible タスク例: 空のファイルを作成する (ansible.builtin.file)
- Ansible で VPS を設定するための準備
- Ansible で SSH サーバーをセキュアにする (ansible.builtin.lineinfile, ansible.builtin.service)
- Ansible タスク例: APT パッケージをインストールする (ansible.builtin.apt)
- Ansible タスク例: UFW でファイアウォールを設定する (community.general.ufw)