はじめに
にて、Ansible の変数を command モジュールで実行しようとしたところ、1 行が 1 つの引数と判断されてしまうために、エラーとなってしまいました。
そこで、次の方法が思い当たりました。
(今回はダメだったけれども) Ansible タスクで変数の値をそのまま command モジュールで実行する方法
- -c オプションを付けて command モジュールに渡してやれば良い。
command: "bash -c {{ get_sdkman_io.content }}"
といった形になる。
ちなみに、shell モジュールを使用すれば、上記のようなやり方不要で、そのまま変数を指定すればよいのでした。
。。。なのですけれども、上記の方法はダメでした。
Ansible 変数の中身はシェルファイルなのですけれども、その中で使用している zip や sed が上手く実行できていませんでした。
(今回はダメだったけれども) Ansible タスクで変数の値をそのまま command モジュールで実行する例
--- - name: Fetch SDKMAN! uri: url: https://get.sdkman.io return_content: yes register: get_sdkman_io - name: Install SDKMAN! # # 1行が1引数とみなされ、エラー # command: "{{ get_sdkman_io.content }} | bash" # command: "bash {{ get_sdkman_io.content }}" # command: bash "{{ get_sdkman_io.content }}" # command: "{{ get_sdkman_io.content }}" # # エラーとはならないが、zip、unzip、sed などが無いと言われ、ダメ。 # command: "bash -c {{ get_sdkman_io.content }}" # command: bash -lc "{{ get_sdkman_io.content }}" # shell: "{{ get_sdkman_io.content }} | bash" # # 結局 shell モジュールの使用に落ち着いた shell: "{{ get_sdkman_io.content }}"
おわりに
次のページが参考になりました、ありがとうございます!
command モジュールは shell モジュールよりも安全なため推奨されているものの、command モジュールで bash -lc オプションを付けて実行するのは、オプション後の文字列を実行しているため本当に安全なのかどうか疑わしいようにも感じます(注意、未検証)。
であれば、shell モジュールを最初から使っておけばいいのでは、、、とふと思いました。
以上です。