見出し画像

【Linux】 Ansibleの設定

Ansible

構成管理やアプリケーションのデプロイ、自動化などに使われるオープンソースの構成管理ツール。
SSHを使って構成管理対象サーバーにアクセスし、モジュールを使って実行する。(SSH接続が必須)

特徴としてエージェントレスであり、管理対象サーバーに対して必要な設定をまとめたファイルを作成し、それを実行するだけで設定変更が可能。

また、Ansibleは人間が扱いやすいシンプルな記述法を採用しており、構成言語は、YAML(Yet Another Markup Language)。人間に読みやすく、扱いやすい構造化データ形式で、YAMLで書かれたPlaybookを実行することで、設定変更やアプリケーションのデプロイなどを自動化する。


Ansibleの実行例

  1. Ansibleをインストールする。

  2. Ansibleのインベントリファイルを作成する。

  3. 実行するプレイブックファイルを作成する。

  4. 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
  1. Install Nginxタスクでは、yumモジュールを使用してNginxをインストール。

  2. Start Nginxタスクでは、serviceモジュールを使用してNginxサービスを起動。

  3. restart nginxハンドラーでは、serviceモジュールを使用してNginxサービスを再起動

よろしければサポートお願いします!よりいい情報を発信します。