web-dev-qa-db-ja.com

Ansible-文字列がファイルに存在するかどうかを確認します

私はAnsibleが初めてです

Ansibleを使用してファイルに文字列が存在するかどうかを確認することは可能ですか?.

確認したいのは、ユーザーがサーバーにアクセスできるかどうかです。これはcat /etc/passwd | grep usernameを使用してサーバーで実行できます

しかし、ユーザーがそこにいない場合は、Ansibleを停止してください。

私はlineinfileを使用しようとしましたが、それを返すことができないようです。

コード

 - name: find
   lineinfile: dest=/etc/passwd
               regexp=[user]
               state=present
               line="user"

上記のコードは、ユーザーがいない場合にユーザーをファイルに追加します。私がしたいのはチェックだけです。ファイルを変更したくないのですが、これは可能ですか

ありがとう。

11

たぶん 変数を登録して評価する でしょう。

次の簡単なプレイブックは私にとってはうまくいきます:

- hosts: localhost
  tasks:

  - name: read the passwd file
    Shell: cat /etc/passwd
    register: user_accts

  - name: a task that only happens if the user exists
    when: user_accts.stdout.find('hillsy') != -1
    debug: msg="user hillsy exists"
13
hillsy

トリッキーです。 lineinfileモジュールは、特にファイルの内容を変更することを目的としていますが、検証チェックにも使用できます。

- name: find
  lineinfile: 
    dest: /etc/passwd
    line: "user"
  check_mode: yes
  register: presence
  failed_when: presence.changed

check_modeは、ファイルを更新しないことを保証します。 registerは、前述のように変数を保存します。 failed_whenを使用すると、ファイルに見つからなかったためにユーザーを追加するなど、障害条件を設定できます。

これには複数の反復があり、動作をどのようにしたいかに基づいて使用できます。 lineinfilestateおよびregexpに関連する特定のドキュメントでは、存在または不在が失敗であるかどうかを判断できます。または、not presence.changedなど.


23
Jon Staples

ユーザーがいない場合に失敗したい場合:

tasks:
  - Shell: grep username /etc/passwd
    changed_when: false

デフォルトでは、コマンドの終了コードがゼロ以外の場合、Shellモジュールは失敗します。
ユーザー名が存在する場合はokが表示され、それ以外の場合は失敗します。
私が使う changed_when: false grepping時にchanged状態を防止します。

6