2017-12-08 23 views
1

私は今Anardsに手を出して、自分でいくつかのものを試してみました。私は以下のコード実行しています:コマンドが存在しない場合はどうすればいいですか

--- 
- hosts: test-server 
    remote_user: root 
    tasks: 
    - name: install java 8 
    apt: name=openjdk-7-jdk update-cache=yes force=yes 
    - name: add group 
    command: addgroup hadoop 

をし、以下のエラーを取得: -

fatal: [10.150.0.3]: FAILED! => {"changed": true, "cmd": ["addgroup", "hadoop"], "delta": "0:00:00.033669", "end": "2017-12-08 12:50:15.342671", "msg": "non-zero return code", "rc": 1, "start": "2017-12-08 12:50:15.309002", "stderr": "addgroup: The group `hadoop' already exists.", "stderr_lines": ["addgroup: The group 'hadoop' already exists."], "stdout": "", "stdout_lines": []}
to retry, use: --limit @/root/hdp1.retry

私が先に行くと、グループ「のHadoop」を削除して、もう一度コードを試してみて、それが成功したことになることができます。しかし、コード内にいくつかの状態を作りたいので、グループがすでに存在する場合は、そのステップは無視されます。私はそれについて研究し、when: stat_result.stat.exists == Falseのようないくつかのstat_resultを使うことができることを発見しました。しかし、コードに組み込む方法がわかりません。

答えて

6

これはではありません。あなたはコードを書くべきです。

Ansibleは、宣言型言語であり、あなたは冪等性を提供ネイティブmodule groupを使用する必要があります。

- name: Ensure 'hadoop' group exists 
    group: 
    name: hadoop 
    state: present 

あなたが何かを確認する必要はありませんこの方法です。同じタスクで新しいグループ(ステータスchanged)を作成するか、グループがすでに存在することを報告します(ステータスok)。実行後の状態は同じです:グループhadoopが存在します。

は、残念ながら、あなたが実行するすべてのアクションがcommandモジュールが存在する理由です、ネイティブモジュールとして実装されていません。しかし、それは最後の手段として使われるべきです。

+0

ニースの回答。 idempotenceや説明へのリンクに短い説明を追加してください。これは、devopを初めて使うユーザーのための新しい用語かもしれません。 – Michael

関連する問題