Ansible でのコマンド実行について
Ansible においてコマンドを実行するためのモジュールとしては、主に command モジュールと shell モジュールがあります。
■ command モジュールの特徴
- シェルを通さない
- 環境変数を読めない
- &、パイプ、リダイレクトが使えない
- シェルを通さないのでユーザ環境の影響を受けにくい
■ shell モジュールの特徴
- シェルを通す
- 環境変数を読める
- &、パイプ、リダイレクトが使える
■ コマンド実行とべき等性に関する留意点
- 実行するコマンドによってはべき等性が保証できない
- Ansible ではシステムのあるべき「状態」を設計するというのが基本的な考え方だが、コマンド実行については実行後の状態が明確に決まらない場合がある
以下では command モジュールについて説明しますが、shell モジュールも大体使い方は同じです。
主なパラメータ
パラメータ | 必須 | 選択肢/デフォルト | 説明 |
cmd | ● | 実行するコマンド | |
creates | ファイルパスまたはglobパターンを指定 指定したファイルが存在する場合はコマンドを実行しない | ||
chdir | コマンド実行前にカレントディレクトリを 変更したい場合はパスを指定 |
使用例
作業環境
- CentOS 8.0
- Python 3.7.7
- Ansible 2.9.6
使用例
- /root/dir/test.txt を /root/dir/test2.txt としてコピーする
■ Ansible 実行前の /root/dir
# ls -l dir
total 0
-rw-r--r-- 1 root root 0 Apr 20 07:39 test.txt
■ playbook.yml
- hosts: all
become: yes
tasks:
- name: Command test
command:
cmd: 'cp -p test.txt test2.txt'
chdir: /root/dir
■ Ansible 実行後の /root/dir
# ls -l dir
total 0
-rw-r--r-- 1 root root 0 Apr 20 07:39 test.txt
-rw-r--r-- 1 root root 0 Apr 20 07:39 test2.txt
注意点
command モジュールで cp コマンドを実行する場合について、以下の条件に該当するとします。
- モジュールの create オプションを使用しない場合、または
- create オプションを使用していて、かつ create オプションで指定したパスが存在しない場合
この場合は、cp のコピー先ファイルが存在している場合でも強制的に上書きがされるため注意してください。上書きをさせたくない場合は、command モジュールの create オプションにコピー先のパスを指定してください。
―――――――――――――