web-dev-qa-db-ja.com

コマンドモジュールとファイルモジュールによるAnsibleのべき等性

私はansibleにかなり慣れていないので、今ではべき等なタスクを作成する方法を理解できません。例えば。 file。単にcreatesまたはremovesがありません。 commandモジュールにはcreatesがありますが、プロビジョナーを実行してファイル(シンボリックリンク)が存在する場合は常に、ansibleはコマンドを「スキップ」ではなく「ok」としてマークします。

これがcommandモジュールの例です

- name: Firefox | link
  command: ln -s /opt/firefox/firefox /usr/local/bin/firefox creates=/usr/local/bin/firefox

常に実行されます。

ノードの状態が最初の実行ですでに達成されている場合、コマンドが2回以上実行されないようにするにはどうすればよいですか?

ありがとうございました!

1
nkamm

それはうまくいくはずです。

実際にチェックしましたが、ほとんど機能します(後述)。テストに使用した完全なプレイブックは次のとおりです(Firefoxを使用していませんが、概念は同じです)。

---
- hosts: localhost
  tasks:
  - name: Test | link & idempotency
    command: ln -s /tmp/ans/from /tmp/ans/to creates=/tmp/ans/to

詳細:

  • リンクが存在しない場合、正しく作成されます
  • リンクが存在する場合、何も変更されません。リンクが間違ったファイルを指している場合でも。

ただし、警告が表示されます。

[WARNING]: Consider using file module with state=link rather than running ln

リンクが正しいことを確認し、必要な場合にのみ(したがってべき等に)「正しい」方法でリンクを変更したい場合、ansibleの警告はファイルモジュールを使用することです。例を次に示します。

---
- hosts: localhost
  tasks:
  - name: Test | link & idempotency
    file: src=/tmp/ans/from dest=/tmp/ans/to state=link
3
Fredi