Ansible: Playbookの繰り返し制御の色々 (2)
今回もAnsible
のPlaybook
における繰り返し制御について、学んでいきます。
引き続き題材は本家のドキュメントから。
Ansible Documentation > Playbooks > Loops
シリーズはこちら。
https://blog.tacck.net/ansible-documents-translate/ansible-loops
Looping over Files
with_file
を使うことで、ファイルを使った繰り返しを実行できます。 かつ、指定したファイルの中身を結果として取り出して使うことになります。
実際に動作を確認してみましょう。
├── first_example_file
├── main.yml
└── second_example_file
hello world!
hello
world
!
- hosts: 127.0.0.1
connection: local
tasks:
- name: Show file contents
debug: msg="{{ item }}"
with_file:
- first_example_file
- second_example_file
こちらを実行すると、下記のようになります。
PLAY [127.0.0.1] ***************************************************************
TASK [setup] *******************************************************************
ok: [localhost]
TASK [Show file contents] ******************************************************
ok: [localhost] => (item=hello world!) => {
"item": "hello world!",
"msg": "hello world!"
}
ok: [localhost] => (item=hello
world
!) => {
"item": "hello\nworld\n!",
"msg": "hello\nworld\n!"
}
PLAY RECAP *********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0
指定したファイルの内容が順次表示されること、 内容が一行なら一行に、複数行なら改行が\n
となって、表示されていることが確認できました。
Looping over Fileglobs
次は with_fileglob
です。
これを使うと、特定のディレクトリ内のファイルを、再起せずに、パターンマッチングして利用することができるようです。 これも動作を見てみます。
├── files
│ ├── first_example_file
│ └── second_example_file
└── main.yml
hello world!
hello
world
!
- hosts: 127.0.0.1
connection: local
tasks:
- name: Show file contents
debug: msg="{{ item }}"
with_fileglob:
- files/*
こちらを実行すると、下記のようになります。
PLAY [127.0.0.1] ***************************************************************
TASK [setup] *******************************************************************
ok: [localhost]
TASK [Show file contents] ******************************************************
ok: [localhost] => (item=/Users/gray/ansible/blog/files/first_example_file) => {
"item": "/Users/gray/ansible/blog/files/first_example_file",
"msg": "/Users/gray/ansible/blog/files/first_example_file"
}
ok: [localhost] => (item=/Users/gray/ansible/blog/files/second_example_file) => {
"item": "/Users/gray/ansible/blog/files/second_example_file",
"msg": "/Users/gray/ansible/blog/files/second_example_file"
}
PLAY RECAP *********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0
上記のように、with_file
と異なり「ファイルの絶対パス」を参照することになります。
Looping over Parallel Sets of Data
次は with_together
というものです。
これは注意書きに「滅多に使わないものでしょう」と書かれていて、少し独特な動きをします。
これも、動きをみてみます。
- hosts: 127.0.0.1
connection: local
vars:
alpha: [ 'a', 'b', 'c', 'd' ]
numbers: [ 1, 2, 3, 4 ]
tasks:
- name: Show file contents
debug: msg="{{ item.0 }} and {{ item.1 }}"
with_together:
- "{{ alpha }}"
- "{{ numbers }}"
こちらを実行すると、下記のようになります。
PLAY [127.0.0.1] ***************************************************************
TASK [setup] *******************************************************************
ok: [localhost]
TASK [Show file contents] ******************************************************
ok: [localhost] => (item=[u'a', 1]) => {
"item": [
"a",
1
],
"msg": "a and 1"
}
ok: [localhost] => (item=[u'b', 2]) => {
"item": [
"b",
2
],
"msg": "b and 2"
}
ok: [localhost] => (item=[u'c', 3]) => {
"item": [
"c",
3
],
"msg": "c and 3"
}
ok: [localhost] => (item=[u'd', 4]) => {
"item": [
"d",
4
],
"msg": "d and 4"
}
PLAY RECAP *********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0
このように、複数の配列に対して同じ順番で値を取り出す、という動きをします。 最近のプログラムではあまりこういう書き方をしませんが、昔々のC言語あたりでは、このような書き方もしていたなぁ、という思い出があります。
まとめ
今回は、 with_file
、 with_fileglob
、 with_together
の内容を学びました。
この辺りも、まだそれほど難しいものでは無かったと思います。 引き続き、動かしながらの確認を続けてみたいと思います。