Ansible lineinfile(空白と状態の変更)

Ansible lineinfile(空白と状態の変更)

私たちは理解に時間を費やしたユニークな問題がありますが、私たちが取っているアプローチが本当に正しいかどうかはわかりません。私たちの目標は、特定のUNIXシステムファイル/etc/login.defとそのファイルの特定の値を確認することです。

強化要件のためにPASS_MAX_DAYS構成ファイルにキャプチャし、そのlogins.defステータスを(緑色のOK)または(赤色または黄色)として報告しようとしています。これは追加の確認が必要であることを意味します。私たちの目標はいいえ変更を実行しますが、その構成ファイルの状況をキャプチャーします。

以下はコードスニペットです。


---
- name: My Machine
  hosts: localhost
  gather_facts: true

  tasks:
    - name: "PASS_MAX_DAYS - 90 Days - Validator"
      become: yes
      become_user: ansible
      tags: PASS_MAX_DAYS
      lineinfile:
        path: /etc/login.defs
        regex: '^PASS_MAX_DAYS\s+'
        line: 'PASS_MAX_DAYS    90'
        state: present
      check_mode: yes
      register: PASS_MAX_DAYS_output

これに関するアイデアは簡単です。ファイルがPASS_MAX_DAYS90日に設定されていることを確認し、そうであれば(緑色のOK)と報告したりスキップしても問題ありません。値が90日の値から外れた場合は、問題(赤またはオレンジ)でマークし、値をキャプチャし(登録/デバッグを使用)、ランチャーに意味のあるメッセージを出力し、値をファイルにキャプチャします。 。

注:条件を確認しましたが、when利用可能かどうかはわかりません。 「行が置き換えられました」というメッセージとともに、出力ステータスが「変更済み」に設定されている問題が常に発生します。

注:一部のシステム管理者は単一のスペースを使用し、他のシステム管理者はタブを使用し、他のシステム管理者は複数のスペースを使用するため、正規表現をできるだけ一般的にする必要があります(なぜかと尋ねることができます)。したがって、これらの値を一致させようとしているため、各値の間にいくつかの空白があるかどうか気にしません。

答え1

私は "raw"モジュールを使用し、単に次のようなものを使用します:

- name: fetch PASS_MAX_DAYS
  raw: awk '/^PASS_MAX_DAYS/ {print $2}' /etc/login.defs
  register: PASS_MAX_DAYS_output
- name: check PASS_MAX_DAYS ok
  assert:
    that:
      - "PASS_MAX_DAYS_output.stdout != 90"
    msg: "PASS_MAX_DAYS is not 90"

これは、他の検査に簡単に適応できるほど柔軟です。

答え2

尋ねる:「PASS_MAX_DAYSファイルが90日に設定されていることを確認してください。そうである場合は、報告(緑色のOK)またはスキップしてください。問題ありません。値が90日の値を超えている場合は、問題を引き続き表示してください(赤またはオレンジ)。」

回答:Ansibleモジュールの冪等性はコアパラダイムです。この点で、Ansibleコードはプロセスではなく状態の定義として見なければなりません。したがって、Ansibleコードを実行するだけで、定義されたシステム状態が設定されます。たとえば、スクリプト

$ cat test.yml 
- hosts: localhost
  gather_facts: false
  tasks:
    - lineinfile:
        path: /scratch/tmp/login.defs
        regex: '^PASS_MAX_DAYS\s+'
        line: 'PASS_MAX_DAYS    90'

ジョブが変更されたことを報告します(設定したい色で)。ANSIBLE_COLOR_CHANGED)

$ ansible-playbook test.yml 

PLAY [localhost]
TASK [lineinfile] 
changed: [localhost]
PLAY RECAP 
localhost: ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
$ cat /scratch/tmp/login.defs 
PASS_MAX_DAYS    90

プレイブックを再実行して、1つのタスクが正常であることを報告します(設定したいすべての色で)。ANSIBLE_COLOR_OK)

PLAY RECAP
localhost: ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

審査

システムを変更せずに潜在的な違いのみを見つけるには、確認モードでプレイブックを実行してください。

-C, --check
    don't make any changes; instead, try to predict some of the changes that may occur

たとえば、スクリプト

$ cat login.defs 
PASS_MAX_DAYS    80
$ ansible-playbook test.yml --check

1つのことが変更される予定であると報告します。つまり、レビューに失敗しました。

PLAY [localhost]
TASK [lineinfile] 
changed: [localhost]
PLAY RECAP
localhost: ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

レポート

かなりたくさんありますコールバックプラグイン書くことができる。どちらもあなたの目的に合わない場合は、カスタムプラグインを作成するか、次のものを使用できます。アンサーブルランナーそして分析する文化遺物Pythonモジュール利用可能。


尋ねる:「/etc/login.defsファイルにはファイルにタブ値があります。Unixプラットフォームで同じテストを実行すると、ansible PlayBookの実行状態が常に変更されたときに返されることがわかります。」

答え:それはあなたの選択です。間隔を変更したり、間隔を同じにしたいです。スペースとタブは login.defs で有効な区切り文字です。利用できる逆参照regexスペースを変更してそのままにしてくださいline。たとえば、次のタスク

    - lineinfile:
        path: /scratch/tmp/login.defs
        regex: '^PASS_MAX_DAYS(\s+)(\S*)$'
        line: 'PASS_MAX_DAYS\g<1>90'
        backrefs: true

〜しないだろう「いつも変わって帰ってください」

関連情報