Ansible: Playbookの繰り返し制御の色々 (2)

投稿者: | 2017-03-09

今回もAnsiblePlaybookにおける繰り返し制御について、学んでいきます。

引き続き題材は本家のドキュメントから。

シリーズはこちら。

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_filewith_fileglobwith_together の内容を学びました。

この辺りも、まだそれほど難しいものでは無かったと思います。
引き続き、動かしながらの確認を続けてみたいと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください