※当サイトの記事には、広告・プロモーションが含まれます。

Ansibleのタスクで共通的な処理ってどこに配置すれば良いのか

www.itmedia.co.jp

 3月17日から20日(現地時間)にかけてドイツで開催される技術イベント「CloudFest」で、サーバを人力で投げ、その飛距離を競う大会「World Server Throwing Championship 2025」(WSTC 2025)が併催される。18日には男子、19日には女子予選を実施。20日には予選勝者が24年の前回王者などと対戦する「グランドファイナル」を開催する。

「世界サーバ投げ選手権」今年もドイツで開催 「インフラ業界で最もオタク的でエキサイティング」 - ITmedia NEWS

⇧ サーバーに感情というものは無いのだけれど、もし、感情が与えられたと仮定した場合、どういう気持ちなのだろうか...

感謝の気持ちを込めてスローイングしてると信じましょう(小声)

role毎にタスクを分けるのAnsibleの流儀っぽいが...

Ansibleの公式のドキュメントによりますと、

docs.ansible.com

 

https://docs.ansible.com/ansible/2.9_ja/user_guide/playbooks_best_practices.html#directory-layout

production # inventory file for production servers staging # inventory file for staging environment

group_vars/
  group1.yml # here we assign variables to particular groups group2.yml
host_vars/
  hostname1.yml # here we assign variables to particular systems hostname2.yml
library/ # if any custom modules, put them here (optional) module_utils/ # if any custom module_utils to support modules, put them here (optional) filter_plugins/ # if any custom filter plugins, put them here (optional)

site.yml # master playbook webservers.yml # playbook for webserver tier dbservers.yml # playbook for dbserver tier

roles/
  common/ # this hierarchy represents a “role”
    tasks/ #
      main.yml # <– tasks file can include smaller files if warranted
    handlers/ #
      main.yml # <– handlers file
    templates/ # <– files for use with the template resource
      ntp.conf.j2 # <——- templates end in .j2
    files/ #
      bar.txt # <– files for use with the copy resource foo.sh # <– script files for use with the script resource
    vars/ #
      main.yml # <– variables associated with this role
    defaults/ #
      main.yml # <– default lower priority variables for this role
    meta/ #
      main.yml # <– role dependencies
  library/ # roles can also include custom modules module_utils/ # roles can also include custom module_utils lookup_plugins/ # or other types of plugins, like lookup in this case

webtier/ # same kind of structure as “common” was above, done for the webtier role monitoring/ # “” fooapp/ # “”

⇧ と言った感じで、「roles」ディレクトリ配下に「ロール」毎のディレクトリを用意して、「tasks」ディレクトリにタスクのYAMLファイルを配置する感じになりますと。

で、そも「Ansible」における「ロール」とは何なのか?

docs.ansible.com

ロール

ロールは、既知のファイル構造に基づいて特定の vars_files、タスク、およびハンドラーを自動的に読み込む方法です。 ロールでコンテンツをグループ化すると、他のユーザーとのロールの共有が容易になります。

https://docs.ansible.com/ansible/2.9_ja/user_guide/playbooks_reuse_roles.html

⇧ うむ、全く分らん。

Red Hatの公開しているドキュメントによりますと、

www.redhat.com

Ansible Playbook の代わりに Ansible Role を使用する理由

Ansible Role と Ansible Playbook は、どちらも自動化タスクを整理して実行するためのツールですが、それぞれの目的は異なります。Ansible Role を作成するか、すべてのタスクを Ansible Playbook に記述するかは、ユースケースと Ansible の経験値によって決まります。

https://www.redhat.com/ja/topics/automation/what-is-an-ansible-role

⇧ とあり、「Playbook」に全てのタスクを書き込むのでも問題はないらしいのだが、

再利用性と共有

ロールは自動化の再利用可能なユニットとして設計されています。ロールは、1 つの play または Playbook のコンテキストから自動化タスクの論理的なグループ化を分離するのに役立つため、複数の play または Playbook 全体で再利用したり、共有して他のプロジェクトで再利用したりすることができます。

https://www.redhat.com/ja/topics/automation/what-is-an-ansible-role

⇧「ロール」にタスクを切り出すことで、使い回しが可能になるということみたい。

とりあえず、

www.coachdevops.com

⇧ 上図のような感じで、「ロール」に切り出して「Playbook」から呼び出せる形にしておくのが良さそうではある。

が、「ロール」の粒度をどうすれば良いのかがいまいち、分からんのよね...

公式のドキュメントを見た感じだと、

  • common
  • webserbers
  • apache
  • postgres

とか何かバラバラなんよね...

Ansibleのタスクで共通的な処理ってどこに配置すれば良いのか

で、気になるのが、全てで利用する処理ではないが、使い回しができそうな処理とかを共通化したいことって、プログラミングの世界だとあるあるなのだが、「Ansible」のような「IaC(Infrastructure as Code)」の世界ではどうなのか?

ネットの情報を漁っていたところ、

urapico.hatenablog.com

⇧ 上記サイト様にありますように、正解は無いっぽいですと。

そもそも、このあたりの話に言及している情報がほぼ無いというね...

そして、

www.wantanblog.com

roles/ディレクトリ配下に呼び出しに使用する任意のロール名(ここではhello)のディレクトリ、その下にtasksディレクトリ、処理を記述するmain.ymlファイルになります。
tasksディレクトリとmain.ymlファイルの命名は固定のようです。

【Ansible】入門⑤ Ansibleロール(roles)について - SEワンタンの独学備忘録

⇧ まさかの命名ルールの縛りがあるという...

公式のドキュメントを見てみると、

docs.ansible.com

ロールは、ファイルが特定のディレクトリー名にあることを想定しています。ロールには上記のディレクトリーのいずれかを含める必要がありますが、使用されていないものは除外しても問題はありません。使用中、それぞれのディレクトリーには、関連するコンテンツが含まれている main.yml ファイルが含まれている必要があります。

  • tasks - このロールによって実行される主なタスクの一覧が含まれます。
  • handlers - このロールによって使用される可能性のあるハンドラーや、このロールの外でも使用できるハンドラーが含まれます。
  • defaults - ロールのデフォルト変数です (詳細は 変数の使用 を参照)。
  • vars - ロールの他の変数です (詳細は 変数の使用 を参照)。
  • files - このロールでデプロイできるファイルが含まれます。
  • templates - このロールでデプロイできるテンプレートが含まれます。
  • meta - このロールのメタデータを定義します。詳細は、以下を参照してください。

https://docs.ansible.com/ansible/2.9_ja/user_guide/playbooks_reuse_roles.html

⇧ 確かに、「main.yml」固定になるらしい...

う~む、ディレクトリに複数のYAMLファイルを配置できないということは、

  1. ディレクトリを増やす
  2. main.ymlにタスクをまとめる

のどちらかになるということか...

「ロール名」のディレクトリ配下をサブディレクトリにする、所謂、ネストした「ロール」が実現できるのかも分からないですし...

何やら、

dtnavi.tcdigital.jp

⇧ 上記サイト様によりますと、「ロール名」のディレクトリに階層構造を持たせることができるらしい。

公式のドキュメントに記載しておいて欲しいよね...

プログラミング的には、

qiita.com

⇧ 上記サイト様にありますように、「2. main.ymlにタスクをまとめる」のアプローチは避けたいところではありますが...

「Ansible」のような「IaC(Infrastructure as Code)」の世界の思想が分からないので何とも言えないのですが...

毎度モヤモヤ感が半端ない…

今回はこのへんで。