ことぶきぶろぐ

日々の記録

Ansibleの概要メモ

Ansibleもくもく会に参加したので学んだことを自分の整理のためメモしておきます。

目次

  • Ad-hocコマンド
  • playbook
  • variables
  • Facts
  • conditionals
  • handlers
  • simple loops
  • loops over hashes
  • templates
  • roles

Ad-hocコマンド

AnsibleはPlaybookでの実行だけでなく、Ad-hoc的にコマンド実行もできます。

$ ansible [node名 or グループ名] -m ansibleモジュール -a オプション

以下は、commandモジュールを利用する例です。実行したいlinuxコマンドを-aオプションに書きます。この場合、node1で"id"コマンドを実行します。

$ ansible node1 -m command -a "id" 

ansible-docコマンド

ansible-docコマンドを実行すると、ansibleで利用できるモジュールを調べることができます。

利用できるモジュールを一覧表示をする

$ ansible-doc -l

あるモジュールの利用方法を調べる

$ ansible-doc モジュール名

playbook

playbookには3つの重要な要素があります。

  • hosts: tasksで定義したタスクの実行対象ホストを定義する
  • tasks: 実行するタスクを定義する。モジュールと、モジュールに必要なオプションを記述する。
  • become: タスクの実行にroot権限が必要な場合にyesを記述する。

apacheをインストールするplaybookの例

---
- name: Apache server installed
  hosts: node1
  become: yes
  tasks:
  - name: latest Apache version installed
    yum:
      name: httpd
      state: latest

ansible-playbook --syntax-checkでシンタックスエラーがないかをチェックできる

$ ansible-playbook --syntax-check apache.yml

variables

ansibleでは変数を利用できます。以下のように{{ }} で囲うと変数を展開することができます。

{{ variable }}

変数の定義は、様々な箇所でできます。しかし、host_varsとgroup_varsの2つのディレクトリを作成するのがおすすめらしいです。

  • group_vars/配下にはあるグループ共通で利用する変数を定義する
$ cat ~/ansible-files/group_vars/web.yml

---
stage: dev
  • host_vars/配下にはあるnodeに特有の変数を定義する
$ cat  ~/ansible-files/host_vars/node2.yml

---
stage: prod
  • 以下のようにplaybook内で変数を利用できる
---
- name: Copy web.html
  hosts: web
  become: true
  tasks:
  - name: copy web.html
    copy:
      src: "{{ stage }}_web.html"
      dest: /var/www/html/index.html

この時、group_vars/web.htmlよりも、host_vars/node1.ymlのほうが優先して利用されます。

Ansible Facts

Ansible Factsは、Ansible実行時に、対象のサーバーからデフォルトで取得する変数のことです。取得された変数はplaybook内で利用することができます。

*デフォルトで取得される Factsの一覧を確認する

$ ansible node1 -m setup
  • 特定のFactsの内容だけを確認する
$ ansible node1 -m setup -a 'filter=ansible_eth0'

以下のように、Factsを変数として利用することで、IPアドレスなどの実行対象サーバー 固有の値に設定してTaskを実行できます。

---
- name: Output facts within a playbook
  hosts: all
  tasks:
  - name: Prints Ansible facts
    debug:
      msg: The default IPv4 address of {{ ansible_fqdn }} is {{ ansible_default_ipv4.address }}

conditinos

playbookの中で条件式を使うことができます。例えば、webというインベントリーグループにあるホストだけにnginxインストールすることができます。

handlers

handlersでは、playbook実行により、システムに変更が加わった時にだけ、あるタスクを呼び出すことができます。 例えばapacheの設定ファイルを変更した時に、設定を反映するために、apacheを再起動することができます。

 ---
 - name: manage httpd.conf
   hosts: web
   become: true
   tasks:
   - name: Copy Apache configuration file
     copy:
       src: httpd.conf
       dest: /etc/httpd/conf/
     notify:
         - restart_apache
   handlers:
     - name: restart_apache
       service:
         name: httpd
         state: restarted