Ansibleのlookupプラグインでローカルファイルの内容を取得する


実現したいこと

Ansibleのlookupプラグインを使用してローカルファイルの内容を取得し、利用できるようにします。
パスワードを記載したファイルをローカルに配置し、その内容をlookupで取得して、リモートマシンのユーザパスワードを変更します。

※Ansibleの環境については過去の記事をご参照ください。

ローカルファイル

使用するファイルはpassword.txtとします。
ランダムで生成した12文字のパスワードを設定します。

password.txt
6u&tEbSg#%-!

Ansible設定

main.ymlを作成します。
①lookupプラグインでファイルからパスワードを取得して変数に入れる。
②リモートマシンのユーザパスワードを変更する。
③確認のため、設定したパスワードを表示する。

main.yml
- hosts: targets
  become: yes
  gather_facts: no
  vars:
    changed_password: "{{lookup('file', './password.txt')}}"
  tasks:
    ##################################################
    # Change password
    ##################################################
    - name: Change password
      user:
        name: test-user
        password: "{{ changed_password | password_hash('sha512') }}"

    ##################################################
    # Show password
    ##################################################
    - name: show password
      debug:
        msg: '{{ changed_password }}'

実行結果

パスワードが変更できました。

$ ansible-playbook -i ./inventory ./main.yml

PLAY [targets] ******************************************************************************************

TASK [Change password] **********************************************************************************
changed: [10.0.1.100]

TASK [show password] ************************************************************************************
ok: [10.0.1.100] => {
    "msg": "6u&tEbSg#%-!"
}

PLAY RECAP **********************************************************************************************
10.0.1.100    : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

lookupとregex_searchを組み合わせる

正規表現を使ってファイルの内容を取得する場合は、regex_searchを組み合わせます。
以下のpassword.txtからパスワードを取得することを想定します。

password.txt
password=6u&tEbSg#%-!

main.ymlのvarsの記載を変更します。

main.yml
  vars:
    changed_password: "{{ lookup('file', './password.txt') | regex_search('(?<=password=).{12}') }}"