作成日:2021/12/30 更新日:2022/01/30

概要

ansibleでループ処理を実行するplaybookを紹介します。

処理内容

以下の2つのループ処理を実行するスクリプトです。

  1. スクリプト内で定義した配列変数(loop_vars)をforeach ループする
  2. コントロールノード側のファイル(loopContent.txt)を読み込み1行ずつループする

実行方法

ansible-playbook -i hosts --private-key="<yourPrivateKey>" 0_loop.yml

※<yourPrivateKey>はssh接続時の秘密鍵ファイルを指定する

hosts
[servers]
150.230.205.203 # 環境に合わせて変更する

[servers:vars]
remote_user=ubuntu # 環境に合わせて変更する
0_loop.yml
---
- hosts: servers
  remote_user: "{{ remote_user }}"
  vars:
    - loop_vars: 
      - "date"
      - "pwd"
      - "ls -l"
    - file_contents: "{{lookup('file', './loopContent.txt')}}" # コントロールノード側のファイルが参照される

  tasks:
  - name: "リスト変数loop_varsを一つずつ処理する"
    shell: "{{ item }}"
    delegate_to: localhost
    with_items: "{{ loop_vars }}"
    register: command_result

  - name: "実行結果表示"
    debug: msg="cmd->{{ item.cmd }} stdout_lines->{{ item.stdout_lines }}"
    with_items: "{{ command_result.results }}"
    loop_control:  # labelでログ出力を絞る(デフォルトだとitemの全属性が出力され見にくいのでcmdのみに絞る)
      label: "{{ item.cmd }}" 

  - name: "ファイル内容を1行ずつループし、行をカンマ分割した値をfirstVal、lastValにセット"
    debug: msg="firstVal->{{ firstVal }} lastVal->{{ lastVal }}"
    vars:
      firstVal: "{{ item.split(',')|first }}"
      lastVal: "{{ item.split(',')|last }}"
    with_items: "{{ file_contents.splitlines() }}"
loopContent.txt
./file11.txt,./file12.txt
./file21.txt,./file22.txt

実行ログ

$ ansible-playbook -i hosts  --private-key="$HOME/OCI_ubuntu" 0_loop.yml
[WARNING]: ansible.utils.display.initialize_locale has not been called, this may result in incorrectly calculated text
widths that can cause Display to print incorrect line lengths

PLAY [servers] *********************************************************************************************************

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

TASK [リスト変数loop_varsを一つずつ処理する] ***************************************************************************
changed: [150.230.205.203] => (item=date)
changed: [150.230.205.203] => (item=pwd)
changed: [150.230.205.203] => (item=ls -l)

TASK [実行結果表示] ****************************************************************************************************
ok: [150.230.205.203] => (item=date) => {
    "msg": "cmd->date stdout_lines->['Thu Dec 30 10:34:04 UTC 2021']"
}
ok: [150.230.205.203] => (item=pwd) => {
    "msg": "cmd->pwd stdout_lines->['/home/ubuntu']"
}
ok: [150.230.205.203] => (item=ls -l) => {
    "msg": "cmd->ls -l stdout_lines->['total 78484', 'drwxrwxr-x 3 ubuntu ubuntu     4096 Dec 16 06:43 instantclient_21_4', '-rw-rw-r-- 1 ubuntu ubuntu 80340972 Dec 16 06:45 instantclient_21_4.tar.gz', '-rw-rw-r-- 1 ubuntu ubuntu       53 Dec 30 10:27 loopContent.txt', '-rw------- 1 root   root          3 Dec  9 05:22 nano.save', 'drwxrwxr-x 3 ubuntu ubuntu     4096 Dec 16 06:20 oradiag_ubuntu', 'drwxrwxr-x 7 ubuntu ubuntu     4096 Dec  9 04:39 web', 'drwxrwxr-x 3 ubuntu ubuntu     4096 Dec 22 04:54 work']"
}

TASK [ファイル内容を1行ずつループし、行をカンマ分割した値をfirstVal、lastValにセット] **********************************
ok: [150.230.205.203] => (item=./file11.txt,./file12.txt) => {
    "msg": "firstVal->./file11.txt lastVal->./file12.txt"
}
ok: [150.230.205.203] => (item=./file21.txt,./file22.txt) => {
    "msg": "firstVal->./file21.txt lastVal->./file22.txt"
}

PLAY RECAP *************************************************************************************************************
150.230.205.203            : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
★ORACLE案件承ります