ansible 学習 1
こんにちは am です。
過去にいくつか ansible の記事をあげていたかと思いますが、改めて最初(?)基礎(?)から復習がてら、
まとめていきたいと思います。
ansibleとは?
簡単にいえば、サーバを新たに用意するときに、用意された設定ファイルに従って、インストールや、設定を自動的に実行することができるツールです。
同じような構成のサーバを複数台用意する必要があるときなど、大幅な時間短縮が見込めます。
またその設定ファイルは yaml ファイルとなっていて 構成の内容をコード化することができるようになります。
自動化といっても設定ファイルは自分で用意する必要があり、サーバ対するインストールや設定の内容、またそれを設定ファイルに書き起こしていくといったそれらの知識はある程度有しているのが前提となっているため、誰でも簡単に使えるようなものではありません。
とりあえず実行してみる
ひとまず公式のドキュメントを読みつつ準備
https://docs.ansible.com/ansible/latest/index.html
$ vi inventory.yaml
webservers:
hosts:
web01:
ansible_host: alma8
web02:
ansible_host: alma9
管理対象へ ping を飛ばす
$ ansible webservers -m ping -i inventory.yaml
web01 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
web02 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
サンプルのplay book を作成
https://docs.ansible.com/ansible/latest/collections/ansible/builtin/ping_module.html
$ vi playbook.yaml
$ cat playbook.yaml
- name: first check
hosts: webservers
tasks:
- name: ping
ansible.builtin.ping:
- name: print message
ansible.builtin.debug:
msg: hallo
実行
$ ansible-playbook -i inventory.yaml playbook.yaml
PLAY [first check] *****************************************************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************************************************
ok: [web01]
ok: [web02]
TASK [ping] ************************************************************************************************************************************************************
ok: [web02]
ok: [web01]
TASK [print message] ***************************************************************************************************************************************************
ok: [web01] => {
"changed": false,
"msg": "hallo"
}
ok: [web02] => {
"changed": false,
"msg": "hallo"
}
PLAY RECAP *************************************************************************************************************************************************************
web01 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web02 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
動作は問題なさそうです。あとはやりたいことをモジュール一覧などから探し、条件分岐や変数を用いて、サーバの設定を行う、playbook を作っていくことになります。
よく使う条件分岐で使う情報の取得
あまりこのコマンドを使うことはありませんが、OS(ディストリビューション)で分岐させたいときに when に記述するべき内容を確認するときに使いました。
$ ansible -m setup -i inventory.yaml webservers |grep ansible_distribution
"ansible_distribution": "AlmaLinux",
"ansible_distribution_file_parsed": true,
"ansible_distribution_file_path": "/etc/redhat-release",
"ansible_distribution_file_variety": "RedHat",
"ansible_distribution_major_version": "9",
"ansible_distribution_release": "Emerald Puma",
"ansible_distribution_version": "9.0",
"ansible_distribution": "AlmaLinux",
"ansible_distribution_file_parsed": true,
"ansible_distribution_file_path": "/etc/redhat-release",
"ansible_distribution_file_variety": "RedHat",
"ansible_distribution_major_version": "8",
"ansible_distribution_release": "Sky Tiger",
"ansible_distribution_version": "8.6",
2台分出てきているので少し見づらいですが、例えば以下のような分岐条件を playbookに記載して
特定のディストリビューションかつメジャーバージョンの場合に実行するといったことができます。
when: ( ansible_distribution == "AlmaLinux" and ansible_distribution_major_version == "9" )
サンプルで作ったものに分岐を加えてみます
playbook.yaml
- name: first check
hosts: webservers
tasks:
- name: ping
ansible.builtin.ping:
- name: print message
ansible.builtin.debug:
msg: hallo
when: ( ansible_distribution == "AlmaLinux" and ansible_distribution_major_version == "9" )
実行!!
PLAY [first check] *****************************************************************************************************************************************************
TASK [Gathering Facts] *************************************************************************************************************************************************
ok: [web01]
ok: [web02]
TASK [ping] ************************************************************************************************************************************************************
ok: [web02]
ok: [web01]
TASK [print message] ***************************************************************************************************************************************************
skipping: [web01]
ok: [web02] => {
"changed": false,
"msg": "hallo"
}
PLAY RECAP *************************************************************************************************************************************************************
web01 : ok=2 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
web02 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
先程とは結果が変わり、web01 では hallo メッセージの出力がスキップされ web02 のみで実行されたことが確認できます。
分岐の条件はこのように複数の条件で作ることができ、今回の例でいえば特定のOSでは実行しない、といったことができるようになります。
これによりOS依存による playbook の実行失敗を避けることができたり、特定のOSのみで必要な作業を実行することができるようになります。
今回はここまでとなります。機会があれば、サンプルではなく、別のモジュールを利用した、
playbook を作成していきたいと思います。