概要
ansibleでループ処理を実行するplaybookを紹介します。
処理内容
以下の2つのループ処理を実行するスクリプトです。
- スクリプト内で定義した配列変数(loop_vars)をforeach ループする
- コントロールノード側のファイル(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