Slide 1

Slide 1 text

Ansible把握した 1日目 Feb 20, 2021 Masaru OKI @masaru0714

Slide 2

Slide 2 text

Ansible? 構成管理ツール。ChefとかPuppetとかも構成管理ツール。 サーバやネットワーク機器にいろいろな設定を入れるためのツール。 対象によるがソフトウェアのインストールなどもできる。 sshで入れてPythonが動く機器ならどうにかできる。 インストールは公式サイトの指示に従って。

Slide 3

Slide 3 text

ansibleとansible-playbook ワンライナー的な一発実行はansibleコマンド(全ホストにpingを打つとか) ansible all -m ping 複数のタスクをまとめて実行する場合はansible-playbookコマンド ansible-playbook deploy.yml ホストの一覧(とsshすべきIPアドレス)はinventoryと呼ばれるファイルに書く。 (ファイル名がinventoryというわけではない)

Slide 4

Slide 4 text

実行準備 ターゲットホストにsshでログインできるようにしておく必要がある。 ターゲットホストに~/.ssh/authorized_keysを置くのが一般的のようだ。 rootである必要はないが、その場合sudoできること(doasなども選べる)。

Slide 5

Slide 5 text

ansible-playbook おおざっぱな概略図 h1 h2 h3 h4 [db] h1 ansible_ssh_host=192.168.0.1 h2 ansible_ssh_host=192.168.0.2 [web] h3 ansible_ssh_host=192.168.0.3 h4 ansible_ssh_host=192.168.0.4 hosts (inventory) ホストとグループの定義 変数も定義できる - hosts: db roles: - dev-sec.mysql - hosts: web roles: - nginxinc.nginx Playbook ホストやグループごとに何 を構成するかの定義 taskを直接書くか、あるい はroleを指定する nodes: h1: mysql_databases: - name: customer h2: mysql_databases: - name: statistics h3: nginx_start: false h4: nginx_debug_output: true role dev-sec.mysql role nginxinc.nginx customer statistics nginx install nginx install nginx start debug output 外部変数ファイル (これもinventory) 構成の設定値や挙動の指定 この例ではnodesグループのホ ストh1,h2,h3,h4の変数を定義 している role=定義済task task (mysql_db呼出) task (apt呼出)

Slide 6

Slide 6 text

用語解説 moduleは構成対象のホストで実行されるプログラム。 inventoryはパラメータの集合。ホストの識別名とIPアドレスが必要。 taskはinventoryから必要な情報を引き出してmoduleを使って実行。 roleは繰り返し使われるtaskのパラメータを変数にして呼出可能にしたもの。 Playbookはホストあるいはグループとtaskやroleとの組み合わせを記述する。

Slide 7

Slide 7 text

taskとmodule Playbook tasks: - name: やることを人間にわかるように書く ここがmodule名: moduleに与えるパラメータ: 値 をわらわら並べる - name: Webサーバを起動する service: name: httpd state: started

Slide 8

Slide 8 text

taskとinventory inventory h1: webserver: started Playbook - hosts: h1 tasks: - name: Webサーバを用意する(起動はinventory次第) service: name: httpd state: {{ webserver }}

Slide 9

Slide 9 text

roleとtask Playbookに記載するtaskを別ファイルに切り出して名前をつけたのがrole Playbook roles: - role名 で呼び出す。 ● 呼び出したroleがどんな変数を参照しているかはドキュメントかソースを読む。 ● 自作roleを用意することもできる。 roles/role名/task/main.ymlに - name: から記述する。 ● 既存のroleがたくさんあり、ansible-galaxyコマンドでインストールできる。 ● ansible-galaxy search キーワードで検索できる。 ● ありすぎてどれを使えばいいのかわからない。 公式があればなるべくそれを。

Slide 10

Slide 10 text

Playbookとtask,role Playbook - hosts: 識別子(ホストでもグループでもいい) tasks: - name: 識別子のホストで実行するタスクを並べる service: name: httpd roles: - gobgp - hosts: 識別子 以下略

Slide 11

Slide 11 text

inventory(変数)はどこに書く? 書ける箇所がたくさんありすぎる。 ● グローバルなのは/etc/ansible/hosts ● ansible-playbookコマンドのパラメータで直接指定 ● ansible-playbookコマンドの-iでファイルを指定できる ● Playbookの中でvars:指定で書くこともできる ● host_vars/ホスト識別子.yml に書くこともできる ● group_vars/グループ識別子.yml に書くこともできる ● group_vars/all.yml に全部まとめて書くこともできる どこに書かれた値を使うかの優先順位がある。 複数箇所に書くと混乱するので注意。

Slide 12

Slide 12 text

inventory(hosts)のフォーマット hosts (INI形式) [Guests] guest1 ansible_ssh_host=192.168.122.116 guest2 ansible_ssh_host=192.168.122.117 hosts.yml (YAML 形式) all: children: Guests: hosts: guest1: ansible_ssh_host: 192.168.122.116 guest2: ansible_ssh_host: 192.168.122.117

Slide 13

Slide 13 text

hosts(あるいはhosts.yml)の場所 ansible.cfg(実はこれの場所もあちこちに用意できる)に [defaults] inventory = 任意のpath と書いておくと、/etc/ansible/hostsではなくそこが参照される。 あるいは、明示的に ansible-playbook -i 任意のpath と指定する。

Slide 14

Slide 14 text

やってみた(VMの2本めの足にIPアドレスを振る) ● VMが起動していることが前提。 ● IPアドレスは192.168.122.116/24でホストからアクセスできる。 ● 試したVMはUbuntu 20.04LTS ● アカウントはubuntu ● ~/.ssh/authorized_keys配置済 ● パスワードレスでsudoできることも確認済。 ● ネットワークインタフェースはens3, ens4。ens3はAnsibleとの通信用。

Slide 15

Slide 15 text

やってみた(VMの2本めの足にIPアドレスを振る) deploy.yml - hosts: Guests user: ubuntu become: yes become_method: sudo roles: - mrlesmithjr.config-interfaces hosts [Guests] guest ansible_ssh_host=192.168.122.116 group_vars/all nodes: guest: network_interfaces: - name: ens4 method: static address: 192.168.0.1 netmask: 255.255.255.0 ansible.cfg [defaults] inventory=hosts 実行 ansible-galaxy install mrlesmithjr.config-interfaces ansible-playbook -i hosts deploy.yml

Slide 16

Slide 16 text

まとめ ● Ansible便利! ● 下準備がちょっと面倒だけど! ● role山盛りあってどれがちゃんと使えるか探すの大変だけど!