LoginSignup
23
24

More than 5 years have passed since last update.

Ansibleでnginxを構築

Last updated at Posted at 2016-05-07

Ansibleで、vagrant2台にnginxをインストールし、セキュアな通信ができるように設定します。

準備

vagrant

$ mkdir ansible_nginx
$ cd ansible_nginx
$ vagrant init ubuntu/trusty64
$ vi Vagrantfile
Vagrant.configure(2) do |config|

  # すべてのマシンで同じ鍵を使う
  config.ssh.insert_key = false

  config.vm.define "vagrant1" do |vagrant1|
    vagrant1.vm.box = "ubuntu/trusty64"
    vagrant1.vm.network "forwarded_port", guest: 80, host: 8080
    vagrant1.vm.network "forwarded_port", guest: 443, host: 8443
  end
  config.vm.define "vagrant2" do |vagrant2|
    vagrant2.vm.box = "ubuntu/trusty64"
    vagrant2.vm.network "forwarded_port", guest: 80, host: 8081
    vagrant2.vm.network "forwarded_port", guest: 443, host: 8444
  end
end
$ vagrant up

ansible.cfg

$ vi ansible.cfg
[defaults]
hostfile = hosts
remote_user = vagrant
private_key_file = ~/.vagrant.d/insecure_private_key
host_key_checking = False
$ vi hosts
[webservers]
vagrant1 ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222
vagrant2 ansible_ssh_host=127.0.0.1 ansible_ssh_port=2200

サーバー接続確認

$ ansible webservers -m ping
vagrant2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
vagrant1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Playbookの設定

nginxのplaybook

$ vi web-tls.yml
- name: Configure webserver with nginx and tls
  hosts: webservers
  become: True
  vars:
    key_file: /etc/nginx/ssl/nginx.key
    cert_file: /etc/nginx/ssl/nginx.crt
    conf_file: /etc/nginx/sites-available/default
    server_name: localhost
  tasks:
    - name: install nginx
      apt: name=nginx update_cache=yes cache_valid_time=3600

    - name: create directories for ssl certificates
      file: path=/etc/nginx/ssl state=directory

    - name: copy TLS key
      copy: src=files/nginx.key dest={{ key_file }} owner=root mode=0600
      notify: restart nginx

    - name: copy TLS certificate
      copy: src=files/nginx.crt dest={{ cert_file }}
      notify: restart nginx

    - name: copy nginx config file
      template: src=templates/nginx.conf.j2 dest={{ conf_file }}
      notify: restart nginx

    - name: enable configuration
      file: dest=/etc/nginx/sites-enabled/default src={{ conf_file }} state=link
      notify: restart nginx

    - name: copy index.html
      template: src=templates/index.html.j2 dest=/usr/share/nginx/html/index.html mode=0644

  handlers:
    - name: restart nginx
      service: name=nginx state=restarted

Play

  • playbookはplayのリスト
  • playは、ホストとタスクを結びつけるもの
    • 設定するホストの集合
    • ホスト上で実行するタスクのリスト

name

  • playの内容を示すコメント

become(sudo)

  • rootユーザとしてsudoした上ですべてのタスクを実行

vars

  • 変数と値のリスト

タスク

  • web-tls.ymlのplaybookでいうと、7つのタスクを持つ1つのplayが含まれている

モジュール

apt

  • パッケージマネージャーのaptを使ってインストールや削除を行う

copy

  • ファイルをローカルマシンからホストにコピー

file

  • ファイル、シンボリックリンク、ディレクトリの属性を設定

service

  • サービスの起動、停止、再起動を行う

template

  • ファイルをテンプレートから生成し、そのファイルをホストにコピー
  • テンプレートエンジンとしてJinja2を採用

ハンドラ

  • Ansibleがサポートしている条件つき処理の1つ
  • タスクから通知されたときにのみ実行される。タスクは、タスクによってシステムの状態を変化させたとAnsibleが認識したときにのみ、通知を送る。
  • ハンドラが実行されるのは、タスクがすべて実行された後であり、通知が複数送られていても、実行されるのは一度限り。
  • ハンドラは、通知が送られた順序ではなく、必ずplay中に書かれた順序で実行される。

nginxの設定テンプレート

nginx.conf

$ vi templates/nginx.conf.j2
server {
  listen 80 default_server;
  listen [::]:80 default_server ipv6only=on;
  listen 443 ssl;

  root /usr/share/nginx/html;
  index index.html index.htm;

  server_name {{ server_name }};
  ssl_certificate {{ cert_file }};
  ssl_certificate_key {{ key_file }};

  location / {
          try_files $uri $uri/ =404;
  }
}

index.html

$ vi templates/index.html.j2
<html>
  <head>
    <title>Welcome to ansible</title>
  </head>
  <body>
    <h1>nginx, configured by Ansible</h1>
    <p>If you can see this, Ansible successfully installed nginx.</p>

    <p>{{ ansible_managed }}</p>
  </body>
</html>

Playbookの実行

$ ansible-playbook web-tls.yml
PLAY [Configure webserver with nginx and tls] **********************************

TASK [setup] *******************************************************************
ok: [vagrant2]
ok: [vagrant1]

TASK [install nginx] ***********************************************************
changed: [vagrant2]
changed: [vagrant1]

TASK [create directories for ssl certificates] *********************************
changed: [vagrant1]
changed: [vagrant2]

TASK [copy TLS key] ************************************************************
changed: [vagrant2]
changed: [vagrant1]

TASK [copy TLS certificate] ****************************************************
changed: [vagrant1]
changed: [vagrant2]

TASK [copy nginx config file] **************************************************
changed: [vagrant1]
changed: [vagrant2]

TASK [enable configuration] ****************************************************
ok: [vagrant1]
ok: [vagrant2]

TASK [copy index.html] *********************************************************
changed: [vagrant2]
changed: [vagrant1]

RUNNING HANDLER [restart nginx] ************************************************
changed: [vagrant2]
changed: [vagrant1]

PLAY RECAP *********************************************************************
vagrant1                   : ok=9    changed=7    unreachable=0    failed=0
vagrant2                   : ok=9    changed=7    unreachable=0    failed=0
23
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
24