4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AnsibleAdvent Calendar 2024

Day 10

Ansibleの実行時間を短縮させるための小ネタ

Last updated at Posted at 2024-12-09

概要

 シングルテナントの自社クラウドサービスをAnsibleで運用しているが、テナント数が増えるのに比例して実行時間も増えるようになってきました。AWXクラスターで運用しているが、それでも一斉実行するとそれなりに時間がかかります。
今回はだれでも手軽に実行時間を短縮できる方法として「タスク数を減らす」を紹介したいと思います。

さっそく結論

タスク数を減らすために複数のタスクをShellスクリプトに置き換える。
Shellスクリプトとしましたが、考え方としてはタスク数が増えるとその分実行時間が増えるので、1つのタスクに複数の処理をまとめることで実行時間を短縮できればなんでもよいです。
ただし、スクリプトに置き換えたときは冪等性の担保も忘れずに!

実験結果

/home/from/にあるファイルを/home/to/にコピーするタスクをShellスクリプトに置き換えた実験結果になります。
すべて同じ処理ですが、あくまでもタスク数を減らすとこれだけの効果が得られるを紹介するのが目的なのでご了承ください。

タスクをまとめた時の実行時間:0:00:00.258 <<<< 従来通りのタスクを1つずつ実行した時の実行時間:0:00:01.580
処理をまとめたほうが圧勝でした。

今回は非常にシンプルな処理で実験しましたが、タスクのI/Oは塵積でバカにならないと思いますので、興味を持った方は是非一度チャレンジしてみてください。

結果詳細(実行ログ)

タスクをまとめた場合

PLAY [Test] *************************************************************************

TASK [ansible.builtin.shell] *******************************************************************************************
Saturday 07 December 2024  17:49:47 +0900 (0:00:00.024)       0:00:00.024 ***** 
changed: [localhost]

PLAY RECAP *******************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

Saturday 07 December 2024  17:49:47 +0900 (0:00:00.234)       0:00:00.258 ***** 
=============================================================================== 
ansible.builtin.shell --------------------------------------------------------------- 0.23s

1つずつタスクで実行した場合

PLAY [Test2] *****************************************************************

TASK [copy file1] ************************************************************
Saturday 07 December 2024  17:11:50 +0900 (0:00:00.025) 0:00:00.025 ***** changed: [localhost]

TASK [copy file2] ***********************************************************************************
Saturday 07 December 2024  17:11:50 +0900 (0:00:00.403) 0:00:00.429 ***** changed: [localhost]

TASK [copy file3] *********************************************************************************
Saturday 07 December 2024  17:11:51 +0900 (0:00:00.284)  0:00:00.713 ***** changed: [localhost]

TASK [copy file4] *************************************************************************************
Saturday 07 December 2024  17:11:51 +0900 (0:00:00.280)  0:00:00.994 ***** changed: [localhost]

TASK [copy file5] **************************************************************************************
Saturday 07 December 2024  17:11:51 +0900 (0:00:00.279) 0:00:01.273 ***** changed: [localhost]

PLAY RECAP ******************************************************************************************
localhost: ok=5    changed=5    unreachable=0    failed=0    skipped=0  rescued=0  ignored=0   

Saturday 07 December 2024  17:11:52 +0900 (0:00:00.306)       0:00:01.580 ***** 
=============================================================================== 
copy file1 ------ 0.40s
copy file5 ------ 0.31s
copy file2 ------ 0.28s
copy file3 ------ 0.28s
copy file4 ------ 0.28s

実験環境

ansible [core 2.15.9]
  config file = /root/.ansible.cfg
  configured module search path = ['/ansible/ansible/playbooks/library']
  ansible python module location = /usr/local/lib/python3.9/site-packages/ansible
  ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/local/bin/ansible
  python version = 3.9.16 (main, Jul  5 2024, 00:00:00) [GCC 11.4.1 20230605 (Red Hat 11.4.1-2)] (/usr/bin/python3)
  jinja version = 3.1.4
  libyaml = True

サンプルコード

#!/bin/bash

# コピー先の冪等性は担保していない
if [ -f "/home/from/file1" ]; then cp /home/from/file1 /home/to/; fi
if [ -f "/home/from/file2" ]; then cp /home/from/file2 /home/to/; fi
if [ -f "/home/from/file3" ]; then cp /home/from/file3 /home/to/; fi
if [ -f "/home/from/file4" ]; then cp /home/from/file4 /home/to/; fi
if [ -f "/home/from/file5" ]; then cp /home/from/file5 /home/to/; fi

# シェルスクリプトでまとめて処理
- name: Test
  hosts: localhost
  gather_facts: False
  tasks:
    - ansible.builtin.shell: "/home/copy.sh"
      args:
        executable: /bin/bash
# タスクで1つずつ処理
---
- name: Test2
  hosts: localhost
  gather_facts: False
  tasks:
    - name: copy file1
      ansible.builtin.copy:
        src: "/home/from/file1"
        dest: "/home/to/"
    - name: copy file2
      ansible.builtin.copy:
        src: "/home/from/file2"
        dest: "/home/to/"
    - name: copy file3
      ansible.builtin.copy:
        src: "/home/from/file3"
        dest: "/home/to/"
    - name: copy file4
      ansible.builtin.copy:
        src: "/home/from/file4"
        dest: "/home/to/"
    - name: copy file5
      ansible.builtin.copy:
        src: "/home/from/file5"
        dest: "/home/to/"
4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?