はじめに
Ansibleを触ってたので、まとめとてみた。
基本的には初心者向け
Ansibleとは???
簡単に言うと、作業をコード化して、実行することができるツール。
例)httpdのインストール
dnf install -y httpd
これをansibleを使って実行するとこうなる
- name: httpd install
ansible.builtin.dnf:
name: httpd
state: latest
一見ansibleのほうが難しいと思われるが、サーバーの台数が増えてくるとコマンド入力ではミスも起きるし、そもそもそれぞれの機器の切り替えなどがとても面倒になる。
だが、ansibleを使用すると一度コードを作成すれば、それを再利用してすべての機器に簡単に展開することができる。
また、コードを見ることでそのサーバーにどのような設定やソフトがインストールされているかがわかるため、チームでの構成管理もかなり楽になる。
今回の勉強の目標
現在の職場でAnsibleを使用した構成管理と設定変更などをしている為
サンプルコードなどはたくさん見れる状況
そのためひとまずの目標としては
- 基本の理解
- Playbookが読めるようになる
- rolesの理解と階層構造がわかるようになる
このあたりを目標にしてみようと思う。
Playbook読めることと、rolesの理解ができることで、どのような設定をどのサーバーに対して実行しているかの理解ができる様になるのでそこをゴールにしていきたい。
その後はトライ&エラーで頑張る。
基本の理解
Playbook
yaml形式で記入する「手順書」となるもの
主に「どこ」に「なに」を「どうする」を記入する。
---
- hosts: web
tasks:
- name: httpd install
ansible.builtin.dnf:
name: httpd
state: latest
インベントリ
playbookの「どこ」が具体的にどのサーバーを指しているのかを記述している。
対象ホストをグループ化することで複数に対して、実施することもできる
#対象のホストに合わせてIPアドレスやサーバー数を変更
[web] #webグループ
192.168.100.1
192.168.100.2
192.168.100.3
[sql] #sqlグループ
192.168.200.1
192.168.200.2
まずはここが基本中の基本
ここまでかければ、ansible-playbookコマンドで実行することができる。
# ansible-playbook -i inventory.ini playbook.yml
PLAY [web] **********************************************************************************
TASK [httpd install] ************************************************************************
ok: [192.168.100.30]
PLAY RECAP **********************************************************************************
192.168.100.30 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Playbookの理解
前述したPlaybookは基礎的なものになるが、業務ではこんなシンプルな構造のサーバーは使わない。
複雑化していくためにPlaybookの構造をある程度理解しておこう。
Taragetセクション
インベントリファイルでも記述している「どこ」にたいしての記述をするところ、
playbookの以下の部分が該当する。
- host web
Varsセクション
あらかじめ設定しておく変数を記述しておく
例)設定ファイルの名前などなど、、
vars:
msg: test #msg変数にtestを格納する。
tasks:
- name: test message
ansible.builtin.debug:
msg: "{{ msg }}" #これでmsg変数が呼び出されて、testが表示される。
tasks
ここで実行する処理を実際に記述する。
モジュールを指定してそれに合わせて、処理内容を記述していく。
tasks:
- name: httpd install
ansible.builtin.dnf: #モジュール名
name: httpd #処理内容(ここではhttpdを指定)
state: latest #latestは最新をインストールする動きを指定している。
各種モジュールなどは公式マニュアルを確認。わからなければググるかgpt先生に質問してみる。
Handlers
少し特殊な処理になる。
簡単に説明すると、「処理1」を実行したら「処理a」を呼びだすみたいな記載になる。
tasksセクションに「notify」でHandle名を設定して、Handlersセクションの「listen」で紐づけるようなイメージ
---
- hosts: web
tasks:
- name: httpd install
ansible.builtin.dnf:
name: httpd
state: latest
notify:
- after task #この処理が実行されたら、「after task」が設定される。
handlers:
- name: test service
ansible.builtin.systemd:
name: httpd
state: restarted
listen:
- after task #どこかで「after task」が設定されていたら、このタスクを実行する。
基本要素は以上となる。
まずはこの動作が覚えられれば単体で構成されているplaybookは読むことができる。
rolesの理解と階層構造
ここからはややこしくなる。
規模が大きくなるとplaybookが長文になってしまうため、各セクションをフォルダで割って管理するようなイメージになる。
特徴としては各フォルダのmain.ymlを必ずansibleが見に行くということ。
簡単な例と共に説明していく。
# tree
.
├── inventory.ini #inventoryファイル
├── roles
│ └── test_server
│ ├── tasks
│ │ └── main.yml
│ └── vars
│ └── main.yml
├── test
│ ├── inventory.ini
│ └── playbook.yml
└── test_playbook.yml #読み込むplaybook
- test_playbookの内容
---
- name: test_roles_playbook
hosts: test_server #inventoryファイルのホスト設定
roles:
- test_server #これでどのディレクトリを見に行くか決めている
↑の説明はtest_serverグループのホストはroles/test_serverを見に行くことになっている。
その後に各ディレクトリ内のmain.yamlを読み込みに行く
- roles/test_server/tasks/main.ymlの内容
---
- name: test debug
ansible.builtin.debug:
msg: "testmessage"
- name: httpd install
ansible.builtin.dnf:
name: httpd
state: latest
become: true
※vars/main.ymlの内容は省略→変数が設定されている。
処理の流れは以下になる。
- test_playbook.ymlのhostsでどのホストに処理をするかきめてrolesでどのフォルダを見に行くか決める。
- roles/test_serverフォルダを見に行って、var/main.ymlを見て各種変数を設定
- tasks/main.ymlを見に行ってそれぞれの処理を実施していく。
このようにすると各main.ymlは短い記述で済むので、管理&可読性があがる。
まとめ
ここまでの知識があれば大まかな設定内容は見ることができると思う。
後はモジュールの知識がつくことで処理がどのようになっているかがよくわかる。
また変数についてはほかにもいろいろと設定できることがあるため、こちらについてはおいおい勉強していく必要がある。