Ansible 实战体验

首先

Ansible_Logo.png

Ansible 是由红帽开发的开源配置管理工具。在启动服务器时,可以根据预先准备的配置文件自动执行软件安装和配置。

特点

    • python製

 

    • Yaml形式で処理を記述

 

    • エージェントレス(ターゲットにssh経由で構築を行う)

 

    • 冪等性(「ある操作を何度実行しても常に結果が同じになる」性質)

 

    再利用性(role単位でノウハウが蓄積できる)

动作形象

動作イメージ_2.png

常用术语

playbook ターゲットの状態=実行する内容を定義したもの

roles 適切な範囲で幾つかのtaskを集めたモジュール

亲自实践

目标

通过在使用Vagrant创建的GuestOS上执行Ansible,来搭建httpd和php环境,以便针对自身进行设置。

环境构建

VirtualBoxをインストールする

Vagrantをインストールする。

创建Vagrantfile

# 作業フォルダへ移動
$ cd /path/to/work/dir

# Vagrantfile作成
$ vagrant init bento/centos-6
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
[省略]

Vagrant.configure("2") do |config|

[省略]

  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine. In the example below,
  # accessing "localhost:8080" will access port 80 on the guest machine.
  # NOTE: This will enable public access to the opened port
  # config.vm.network "forwarded_port", guest: 80, host: 8080
# ここから追記
  config.vm.network "forwarded_port", guest: 80, host: 8080
# ここまで追記

[省略]

  # Share an additional folder to the guest VM. The first argument is
  # the path on the host to the actual folder. The second argument is
  # the path on the guest to mount the folder. And the optional third
  # argument is a set of non-required options.
  # config.vm.synced_folder "../data", "/vagrant_data"

# ここから追記
  config.vm.define "handson_vbox" do |m|
    # ...
  end
# ここまで追記

[省略]

  # Enable provisioning with a shell script. Additional provisioners such as
  # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
  # documentation for more information about their specific syntax and use.
  # config.vm.provision "shell", inline: <<-SHELL
  #   apt-get update
  #   apt-get install -y apache2
  # SHELL

# ここから追記
  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "ansible/site.yml"
    ansible.groups = {
      "handson" => ["handson_vbox"]
    }
  end
# ここまで追記

end

使用Ansible创建文件。

根据Ansible最佳实践创建各个目录和文件。

[プロジェクトのルートディレクトリ]
  ├─ Vagrantfile
  └─ ansible/
      ├─ site.yml
      ├─ handson.yml
      └─ roles/
         └─ httpd/
             └─ tasks/
                 └─ main.yml
---
# handsonグループの構成を読み込む
- import_playbook: handson.yml

---
# handsonグループのサーバの構成を定義する
- name: Handson Servers
# ターゲット
  hosts:
    - handson
# rootで実行するか
  become: yes
# 実行するrole
  roles:
    - httpd

---
# yum で httpd をインストールする
- name: Install
  yum:
    name: httpd
# サービスを起動+自動機能設定
- name: Service is running and enabled
  service:
    name: httpd
# サービス起動
    state: started
# サービス自動起動
    enabled: yes

创建虚拟机

$ vagrant up

使用浏览器访问 http://localhost:8080,并确认是否显示了 Apache 的初始页面。

增加角色

添加 PHP 角色

[プロジェクトのルートディレクトリ]
  ├─ Vagrantfile
  └─ ansible/
      ├─ site.yml
      ├─ handson.yml
      └─ roles/
         ├─ httpd/
         │   └─ tasks/
         │        └─ main.yml
         └─ php/
             ├─ meta/
             │   └─ main.yml
             ├─ vars/
             │   └─ main.yml
             ├─ tasks/
             │   └─ main.yml
             ├─ handlers/
             │   └─ main.yml
             └─ templates/
                 └─ etc/
                     └─ php.d/
                         └─ log.ini.j2
---
# 依存関係定義
dependencies:
# このroleはhttpd roleより後に実行する
  - role: httpd

---
# 変数定義
# yumでインストールするミドルウェア
php_yum_items:
  - php
  - php-mbstring
  - php-mysql

# ログファイル出力先
php_log_file_path: /var/log/php_errors.log

# サーバに配置するテンプレートのファイルパス(glob可)
php_conf_templates:
  - ../templates/etc/*.ini.j2
  - ../templates/etc/php.d/*.ini.j2

---
# selinux設定用ミドルウェアをインストール
- name: Install Util
  yum:
    name: libselinux-python

# selinuxを無効化
- name: Disable
  selinux:
    policy: targeted
    state: permissive

# yum で php_yum_items のリストで定義されたミドルウェアをインストールする
- name: Install
  yum:
    name: "{{ item }}"
  with_items: "{{ php_yum_items }}"

# php_log_file_pathで定義されたファイルを生成する
- name: Create Log File
  file:
    path: "{{ php_log_file_path }}"
    state: touch
    owner: apache
    group: apache
    mode: 0777

# php_conf_templatesのリストで定義されたテンプレートをサーバに配置する
- name: Send conf templates
  template:
    src: "{{ item }}"
    dest: "{{ item | dirname | regex_replace('^.*\\.\\./templates','') }}/{{ item | basename | regex_replace('\\.j2$','') }}"
    backup: yes
  with_fileglob: "{{ php_conf_templates }}"
# httpdを再起動する
  notify:
    - restart httpd
---
# ハンドラ定義
- name: restart httpd
# httpdを再起動する
  service:
    name: httpd
    state: restarted
; ログ出力先をphp_log_file_pathに設定する 
error_log = {{ php_log_file_path }}

---
# handsonグループのサーバの構成を定義する
- name: Handson Servers
# ターゲット
  hosts:
    - handson
# rootで実行するか
  become: yes
# 実行するrole
  roles:
    - httpd
# roleを追加
    - php

# プロビジョン再実行
$ vagrant provision

# GuestOSへログイン
$ vagrant ssh

# PHPバージョンの確認
$ php -v
PHP 5.3.3 (cli) (built: Mar 22 2017 12:27:09)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

# GuestOSからログアウト
$ exit

# GuestOSの破棄
$ vagrant destroy

总结

如果按角色单位积累技术知识(如php、mysql、nginx等),似乎可以轻松构建不同的环境。
此外,本次我们是从GuestOS执行ansible命令,但只要是可以SSH连接的环境(如aws、vps等),就可以在任何地方执行ansible。

广告
将在 10 秒后关闭
bannerAds