無能が苦悩したメモ

無能な著者が学んだことを忘れないための覚え書きです...

Ansible:プレイブック中の長い1行を複数行に分割する

*ansible 2.10.4で動作を確認しています

Ansibleのdebugやshellモジュールを使う際に1行が長くなりすぎたため改行したい、という場合があります。


ブロックスタイルを使えば、yamlの中で文字列を複数行にわたり記載できます。


yamlの記法では「フロースタイル」と「ブロックスタイル」が存在するそうです。(以下のサイトを参考させていただきました)

magazine.rubyist.net


フロースタイルの文字列はクォーテーションで囲まれた文字列です。ブロックスタイルは文字列を改行して記載します。以下のymlのdebugメッセージをブロックスタイルで記載しました。


---
- hosts: all
  tasks:
    - name: Pattern 1 [ | ]
      debug:
        # ブロックスタイル1
        # 各行の改行を保存
        msg: |
          aaaaa
          bbbbb
          ccccc

    - name: Pattern 2 [ |+ ]
      debug:
        # ブロックスタイル2
        # 各行の改行を保存、最終行の次の行の改行も保存
        msg: |+
          aaaaa
          bbbbb
          ccccc

    - name: Pattern 3 [ |- ]
      debug:
        # ブロックスタイル3
        # 各行の改行を保存、最終行の改行は取り除く
        msg: |-
          aaaaa
          bbbbb
          ccccc

    - name: Pattern 4 [ > ]
      debug:
        # ブロックスタイル4
        # 最終行以外の改行を半角スペースに置換
        msg: >
          aaaaa
          bbbbb
          ccccc

    - name: Pattern 5 [ >+ ]
      debug:
        # ブロックスタイル5
        # 最終行以外の改行を半角スペースに置換、最終行の次の行の改行も保存
        msg: >+
          aaaaa
          bbbbb
          ccccc

    - name: Pattern 6 [ >- ]
      debug:
        # ブロックスタイル6
        # 各行の改行を半角スペースに置換、最終行の改行は取り除く
        msg: >-
          aaaaa
          bbbbb
          ccccc


実行結果は以下になります。

# ansible-playbook -i hosts block_literal.yml

PLAY [all] **************************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************************
ok: [CentOS7.6]

TASK [Pattern 1 [ | ]] **************************************************************************************************************************************
ok: [CentOS7.6] => {
    "msg": "aaaaa\nbbbbb\nccccc\n"
}

TASK [Pattern 2 [ |+ ]] *************************************************************************************************************************************
ok: [CentOS7.6] => {
    "msg": "aaaaa\nbbbbb\nccccc\n\n"
}

TASK [Pattern 3 [ |- ]] *************************************************************************************************************************************
ok: [CentOS7.6] => {
    "msg": "aaaaa\nbbbbb\nccccc"
}

TASK [Pattern 4 [ > ]] **************************************************************************************************************************************
ok: [CentOS7.6] => {
    "msg": "aaaaa bbbbb ccccc\n"
}

TASK [Pattern 5 [ >+ ]] *************************************************************************************************************************************
ok: [CentOS7.6] => {
    "msg": "aaaaa bbbbb ccccc\n\n"
}

TASK [Pattern 6 [ >- ]] *************************************************************************************************************************************
ok: [CentOS7.6] => {
    "msg": "aaaaa bbbbb ccccc"
}

PLAY RECAP **************************************************************************************************************************************************
CentOS7.6                  : ok=7    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0


shellモジュールに渡すコマンドもブロックスタイルを使えば改行できます。他にも、jinja2の構文を使う際などに利用するとよさそうです。

---
- hosts: all
  tasks:
    - name: check root user
      shell: >-
        cat /etc/passwd
        | grep ^root
        | wc -l
      register: response

    - debug:
        msg: >-
          {% if response.stdout != "0" %}
          exist
          {% else %}
          not exist
          {% endif %}


# ansible-playbook -i hosts check_root_user.yml

PLAY [all] **************************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************************
ok: [CentOS7.6]

TASK [check root user] *******************************************************************************************************************************************
changed: [CentOS7.6]

TASK [debug] ************************************************************************************************************************************************
ok: [CentOS7.6] => {
    "msg": "exist "
}

PLAY RECAP **************************************************************************************************************************************************
CentOS7.6                  : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0