【Linux】 Ansibleの設定
Ansible
構成管理やアプリケーションのデプロイ、自動化などに使われるオープンソースの構成管理ツール。
SSHを使って構成管理対象サーバーにアクセスし、モジュールを使って実行する。(SSH接続が必須)
特徴としてエージェントレスであり、管理対象サーバーに対して必要な設定をまとめたファイルを作成し、それを実行するだけで設定変更が可能。
また、Ansibleは人間が扱いやすいシンプルな記述法を採用しており、構成言語は、YAML(Yet Another Markup Language)。人間に読みやすく、扱いやすい構造化データ形式で、YAMLで書かれたPlaybookを実行することで、設定変更やアプリケーションのデプロイなどを自動化する。
Ansibleの実行例
Ansibleをインストールする。
Ansibleのインベントリファイルを作成する。
実行するプレイブックファイルを作成する。
Ansibleコマンドを使用して、プレイブックを実行する。
インストール
yum install epel-release # リポジトリのインストールは必須
yum install ansible
インベントリファイル(hostsファイル)
管理対象のサーバーのリストを記載する。ファイルの場所は、デフォルトでは /etc/ansible/hostsになっているが、任意の場所に作成することもできる。
vi /etc/ansible/hosts
--------------------------------------------------------
# IPアドレスを指定
[webservers]
192.168.0.10
192.168.0.11
# ホスト名を指定
[webservers]
web1.example.com
web2.example.com
# webserver1 と webserver2 は、webserversグループのメンバーであり、IPアドレスを定義
[webservers]
webserver1 ansible_host=192.168.1.10
webserver2 ansible_host=192.168.1.11
# 変数を設定するためのセクションで、ansible_user 変数を定義。
# インベントリに定義されたすべてのホストに適用される
[all:vars]
ansible_user=centos
# グループ化されたホストを指定
[web]
web1.example.com
web2.example.com
[app:children]
web
db
プレイブックファイルを作成
Ansibleが実行するタスクのリスト。ファイルの拡張子は .yml または .yaml
vi install_apache.yml
--------------------------------------------------------
---
- name: Install Apache
hosts: webservers
become: true
tasks:
- name: Install Apache
yum:
name: httpd
state: present
- name: Start Apache
service:
name: httpd
state: started
--------------------------------------------------------
# http_port と db_name という変数が定義。
# これらの変数は、他のセクションで {{ http_port }} や {{ db_name }} のように参照できる
vars:
http_port: 80
db_name: mydb
# 2つの変数ファイルがこのPlaybookで使用されるすべての変数はこのファイルに定義される
vars_files:
- vars/global_vars.yml
- vars/{{ inventory_hostname }}_vars.yml
# other-playbook.ymlという別のプレイブックのタスクをインポート
tasks:
- name: Include tasks from another playbook
import_tasks: other-playbook.yml
# httpd.conf.j2を使用してApacheの設定ファイルを生成し、
# /etc/httpd/conf/httpd.confに保存
tasks:
- name: Generate Apache configuration file
template:
src: templates/httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
notify: Restart Apache
# 基本的なファイル作成
tasks:
- name: Create a file
file:
path: /path/to/newfile.txt
state: touch
# fileモジュールを使用して、指定されたディレクトリ内にある3つのファイルの
# パーミッションを一括で変更するタスクが定義。loopを使用して、
# 各ファイル名を順に取り出して、fileモジュールを呼び出している
tasks:
- name: Change file permission for files in /var/www/html directory
file:
path: "/var/www/html/{{ item }}"
owner: root
group: apache
mode: "0644"
loop:
- index.html
- about.html
- contact.html
# 指定されたコマンドを実行する
name: Run ls command
command: ls -l
# whenキーワードを使用して、httpd_status.changedがtrueである場合にのみ、
# Apacheサービスを再起動する
- name: Check the status of a service
systemd:
name: httpd
state: started
register: httpd_status
- name: Restart Apache service if it is not running
systemd:
name: httpd
state: restarted
when: httpd_status.changed
# タスク実行前にシステムファクトを収集。debug モジュールを使用して、
# 収集された ansible_facts の内容を表示する
- name: Print system facts
hosts: myhost
gather_facts: yes
tasks:
- name: Display system information
debug:
var: ansible_facts
# バックアップ
- name: Copy file with backup
copy:
src: /path/to/source/file
dest: /path/to/destination/file
backup: yes
# /home/user/example.txtからファイルをコピーして、/etc/example.txtにペースト
- name: Copy a file
copy:
src: /home/user/example.txt
dest: /etc/example.txt
name: プレイブックの説明
hosts: 対象のホストやグループの指定
gather_facts: ホストからの情報を収集するかどうかの指定
vars: 変数の定義
vars_files: 外部ファイルから変数を読み込む
tasks: 実行するタスクのリスト
state: タスクの実行時にリソースの状態を指定。state: present はリソースを作成もしくは変更し、state: absent はリソースを削除することを指定。
handlers: タスク完了後に実行する。通常、サービスの再起動など、タスクの実行後に発生する特定のイベントに対応する
pre_tasks: タスク実行前に実行するタスクのリスト
post_tasks: タスク実行後に実行するタスクのリスト
roles: 大規模なプレイブックを分割するための役割のリスト
include: 他のプレイブックをインクルードする
import_tasks: 他のプレイブックのタスクをインポートする
import_playbooks: 他のプレイブックをインポートして実行
template: Jinja2テンプレートを使用してファイルを作成または変更する
file: ファイルやディレクトリを作成、変更、削除する。ファイルを削除する場合は、stateパラメーターにabsentを指定。ディレクトリを作成する場合は、stateパラメーターにdirectoryを指定。
command: コマンドを実行する
loop: タスクの実行を繰り返す
when: タスクの実行を条件分岐する
handler notification: イベントトリガーを使用してタスクを呼び出す
backup: ファイルの変更前の状態をバックアップするための設定。ファイルの変更前の状態が .bak という拡張子を持ったバックアップファイルとして保存。
src: コピー元のファイルやディレクトリを指定する
プレイブックのテスト
構文チェックだけを行う場合は、--syntax-checkオプション。
cssCopy codeansible-playbook playbook.yml --syntax-check
変数の値を確認する場合は、--checkオプション。
cssCopy codeansible-playbook playbook.yml --check
テスト実行する場合は、--checkオプションと--diffオプション
cssCopy codeansible-playbook playbook.yml --check --diff
Playbook実行前に確認メッセージを表示する場合は、--ask-become-passオプション
pythonCopy codeansible-playbook playbook.yml --ask-become-pass
Ansibleプレイブックの実行
ansible-playbook [OPTIONS] playbook.yml
オプション
-i: インベントリファイルを指定する。デフォルトは /etc/ansible/hosts。
-l: 実行するホストのパターンを指定する。
-e: 変数を指定する。変数は key=value の形式で指定
-t: タグを指定するオプション。指定したタグにマッチするタスクだけを実行する
--limit:特定のホストまたはグループのみを対象として実行
--skip-tags: スキップするタグを指定するオプション。指定したタグにマッチするタスクをスキップする。
--start-at-task: 指定したタスクから実行するオプション。指定したタスクから実行する。
--check: Dry run モードにするオプション。実行する前に変更点を確認する。
--list-tasks: 実行可能なタスクの一覧を表示するオプション。
--syntax-check: 構文エラーがないかをチェックするオプション。
--step: 実行前に各タスクを確認するオプション。タスクを実行する前にユーザーに確認を求める。
設定例
他サーバに接続し、新規ファイルを作成
---
- hosts: group1
tasks:
- name: test-playbook
file:
path: /tmp/test
state: touch
ホストグループgroup1に対して、/tmp/testというファイルを作成または更新する。
別サーバに Ansible をインストールする
- name: Install Ansible on remote host
hosts: 192.168.3.11
become: true
tasks:
- name: Add EPEL repository
yum:
name: epel-release
state: present
- name: Install Ansible
yum:
name: ansible
state: present
接続元IPアドレスを192.168.3.200、接続先IPアドレスを192.168.3.11とし、ssh接続は完了している前提で作成。
hosts フィールドに 192.168.3.11 を指定。
最初に、EPEL リポジトリを追加し、その後、yum モジュールを使用して Ansible をインストール。
実行
ansible-playbook -i 192.168.3.11, install_ansible.yaml
プロビジョニングを行う設定
# Apacheのインストール、起動、設定を行い、Apacheの設定を変更した場合は、
# Apacheを再起動するようにハンドラーが設定。
---
- name: Provisioning Playbook
hosts: all
become: true
vars:
web_port: 80
tasks:
- name: Install Apache
yum:
name: httpd
state: present
- name: Start Apache
service:
name: httpd
state: started
- name: Configure Apache
template:
src: /path/to/apache.conf.j2
dest: /etc/httpd/conf/httpd.conf
owner: root
group: root
mode: 0644
validate: /usr/sbin/apachectl -t
notify: Restart Apache
handlers:
- name: Restart Apache
service:
name: httpd
state: restarted
templateモジュールを使って、テンプレートファイル/path/to/apache.conf.j2を解釈してApacheの設定ファイル/etc/httpd/conf/httpd.confを生成。
設定ファイルの所有者をroot、グループをroot、モードを0644に設定。
validateパラメータに/usr/sbin/apachectl -tを指定して、設定ファイルが正しい構文で記述されているかどうかを確認。
notifyを使って、Apacheを再起動するように設定します。Apacheの再起動は、他のタスクやプレイブックが実行された後に実行
Cisco のルーターやスイッチを構成
---
- name: Configure Cisco IOS devices
hosts: cisco
gather_facts: no
connection: network_cli
vars_files:
- vars/cisco.yml
tasks:
- name: Configure NTP
ios_ntp:
ntp_server: "{{ ntp_server }}"
state: present
- name: Configure SSH
ios_ssh:
state: present
- name: Configure SNMP
ios_snmp:
contact: "{{ snmp_contact }}"
location: "{{ snmp_location }}"
state: present
gather_facts: ホストの事実を収集するかどうかを指定する。ここでは収集しないように設定。
connection: Ansibleが使用する接続方法を指定。ここでは、Cisco IOSデバイスに対するネットワーク接続を使用するために、network_cliが指定。
vars_files: 変数を定義するファイルを指定。ここでは、Cisco IOSデバイスの構成に必要な変数が定義されたvars/cisco.ymlが指定されています。
tasks: 実行するタスクを定義。
ios_ntp: NTPサーバーを構成する。ntp_serverには、vars/cisco.ymlで定義された変数が使用されています。
ios_ssh: SSHを構成する。
ios_snmp: SNMPを構成する。contactおよびlocationには、vars/cisco.ymlで定義された変数が使用
ファイアウォールの設定
- hosts: firewall
become: true
tasks:
- name: Configure firewall
firewalld:
zone: public
permanent: yes
state: enabled
immediate: yes
service: ssh
port: 80/tcp
rich_rule: 'rule family="ipv4" source address="192.168.1.0/24" accept'
notify:
- restart firewalld
handlers:
- name: restart firewalld
service:
name: firewalld
state: restarted
tasksセクションには、firewalldモジュールを使用してファイアウォールを構成するタスクが含まれ、publicゾーンに対して永続的に設定し、即時に有効にするように指定し、sshサービスと80/tcpポートを許可し、IPアドレスが192.168.1.0/24のネットワークからのトラフィックを許可するように指定。notifyキーワードを使用して、restart firewalldハンドラーを呼び出す。
handlersセクションには、restart firewalldハンドラーが定義。このハンドラーでは、serviceモジュールを使用してfirewalldサービスを再起動。
パッチの適用
- hosts: webservers
become: true
tasks:
- name: Update packages
yum:
name: '*'
state: latest
tasksキーの下には、アップデート処理を行うためのUpdate packagesタスクが定義。このタスクでは、yumモジュールを使用してすべてのパッケージを最新の状態に更新する。
ログの監視
- hosts: webserver
become: true
tasks:
- name: Copy logrotate configuration file
copy:
src: /path/to/logrotate.conf
dest: /etc/logrotate.conf
mode: 0644
notify:
- restart logrotate
handlers:
- name: restart logrotate
systemd:
name: logrotate
state: restarted
Copyタスクは、指定されたソースファイルを目的の場所にコピーする。ここでは、/path/to/logrotate.confを/etc/logrotate.confにコピーして、ファイルパーミッションを0644に設定。
notifyフラグは、タスクの成功後に呼び出されるハンドラーを指定するもの。この場合、restart logrotateという名前のハンドラーが呼び出される。
ハンドラーは、タスクが成功したときに呼び出される特別なタスクで、システムの状態を変更するために使用。
ユーザーのアクセス制御
- hosts: servers
become: true
tasks:
- name: Add user
user:
name: johndoe
password: '$6$...'
state: present
groups: sudo
append: yes
- name: Set sudoers
lineinfile:
path: /etc/sudoers
line: '%sudo ALL=(ALL) NOPASSWD:ALL'
validate: 'visudo -cf %s'
backup: yes
Add userタスクで johndoeというユーザーを作成。パスワードとして$6$...が設定。sudoグループに所属し、すでに存在する場合は追加されない。
Set sudoersタスクは sudoersファイルに、%sudo ALL=(ALL) NOPASSWD:ALLという行を追加。validateパラメータは、visudo -cfコマンドを使用してsudoersファイルの構文を検証。backupパラメータは、sudoersファイルの変更前にバックアップを取得。
サービスのインストール
1 - name: Install and start Nginx
2 hosts: group1
3 become: true
4 tasks:
5 - name: Install Nginx
6 yum:
7 name: nginx
8 state: present
9
10 - name: Start Nginx
11 service:
12 name: nginx
13 state: started
14
15 handlers:
16 - name: restart nginx
17 service:
18 name: nginx
19 state: restarted
Install Nginxタスクでは、yumモジュールを使用してNginxをインストール。
Start Nginxタスクでは、serviceモジュールを使用してNginxサービスを起動。
restart nginxハンドラーでは、serviceモジュールを使用してNginxサービスを再起動