Ansible 2.6 — replace モジュールを使って置換する

replace module を使うことでファイル内の文字列を置換できる。

## パラメータ

### 基本

|パラメータ|説明|
|---|---|
|path|リモートマシン上のファイルパス|
|regexp|マッチさせる正規表現<br>https://docs.python.org/2/library/re.html<br><br>行頭マッチ `^` と行末マッチ `$`を使うことで1行ごとの置換ができる|
|replace|置換後の文字列<br>指定なしの場合はマッチした文字列を削除する|

### 応用

|パラメータ|説明|
|---|---|
|backup|yes を指定した場合は置換前のバックアップが取られる<br>例: `people_source.txt.772.2018-08-01@12:00:28~`|
|unsafe_writes|デフォルトではnoでアトミックに置換処理をおこなうが、yesにして非アトミックな処理に変えることも出来る<br>(モジュールドキュメントではdockerでのマウントファイルの場合が挙げられている)|
|encoding|ファイルを読み書きするエンコード<br>デフォルトは utf-8|

## Playbookの例

```01_replace_playbook.yml
- hosts:
    - localhost

  tasks:
    - name: copy
      copy:
        src: people_source.txt
        dest: people_replaced.txt

    # Replace "Alice" to "Alice is lady" in all line
    - name: replace
      replace:
        path: people_replaced.txt
        regexp: '^Alice$'
        replace: Alice is a lady

    # Replace "Bob (Lastname)" to "Bob (Lastname) is gentleman" in all line
    - name: replace
      replace:
        path: people_replaced.txt
        # () is capture of regular expression
        regexp: '^Bob ([a-zA-Z]+)$'
        # \1 is replaced by first captured strings
        replace: 'Bob \1 is a gentleman'

    - name: check replaced file
      slurp:
        src: people_replaced.txt
      register: replaced_file

    - name: check replaced file body
      debug:
        msg: "{{ replaced_file.content | b64decode }}"
```

## 元ファイル

```people_source.txt
Alice
Bob Marley
Carol
Alice
Bob Wills
Carol
Alice
Bob Horper
Carol
```


## 置換後のファイル

```people_replaced.txt
Alice is a lady
Bob Marley is a gentleman
Carol
Alice is a lady
Bob Wills is a gentleman
Carol
Alice is a lady
Bob Horper is a gentleman
Carol
```


## 実行例

```

PLAY [localhost] **************************************************************************************************************************

TASK [Gathering Facts] ********************************************************************************************************************
ok: [localhost]

TASK [copy] *******************************************************************************************************************************
changed: [localhost]

TASK [replace] ****************************************************************************************************************************
changed: [localhost]

TASK [replace] ****************************************************************************************************************************
changed: [localhost]

TASK [check replaced file] ****************************************************************************************************************
ok: [localhost]

TASK [check replaced file body] ***********************************************************************************************************
ok: [localhost] => {
    "msg": "Alice is a lady\nBob Marley is a gentleman\nCarol\nAlice is a lady\nBob Wills is a gentleman\nCarol\nAlice is a lady\nBob Horper is a gentleman\nCarol\n"
}

PLAY RECAP ********************************************************************************************************************************
localhost                  : ok=6    changed=3    unreachable=0    failed=0   
```

## Gist

- [Ansible2.6— replace module example](https://gist.github.com/YumaInaura/592121dd8dc2a71b796591ccc4564f31)

# 参考

- [Ansibleの新モジュール replace(置換)を使ってみた。 - Qiita](https://qiita.com/volanja/items/54a7dbc75b909e89d8fc)
  - Ansible 1.6 での module 登場時の記事
- [Ansible—リモートマシンのファイルの中身を読む - Qiita](https://qiita.com/YumaInaura/items/6fd98d50067c8f47917a)
- [replace - Replace all instances of a particular string in a file using a back-referenced regular expression. — Ansible Documentation](https://docs.ansible.com/ansible/2.6/modules/replace_module.html)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->