Posts Tagged ‘Ansible’

Trong các phần trước, chúng ta đã tìm hiểu về Ansible và cách sử dụng playbook

Đối với việc quản lý và triển khai một vài máy chủ thì chỉ cần một tệp tin playbook mà chứa các thông tin cấu hình như: tasks, vars, hosts, … thì có hoàn thành được công việc dễ dàng.

Khi triển khai với số lượng server lớn hơn, nhiều roles, số lượng tasks và vars cũng tăng lên, việc sử dụng các thông tin đó vào chỉ một tệp tin playbook, làm cho tệp tin đó đồ sộ hơn, tất nhiên như thế thì khó khăn hơn trong việc xác định các roles.

Vì vậy mà bài viết này sẽ sử dụng Ansible trong cấu trúc thư mục để dễ dàng hơn xác định roles, cũng như khi cần triển khai các roles cho các service hoặc servers mới (dễ dàng thêm/bỏ roles ).

Trong bài viết này chúng ta sẽ sử dụng Ansible để cài đặt và triển khai “Nginx làm reverse proxy cho LAMP (Linux, Apache, MariaDB và PHP)” cho ứng dụng WordPress nhé

Chúng ta cần cài trên 02 servers và xác định các roles như sau:

  • Nginx reverse proxy, Apache, PHP và WordPress

  • MariaDB

Ta tạo cấu trúc roles dạng cây thư mục như hình dưới:

Ansible- Nginx-LAMP-Wordpress

Nội dung của từng Roles, với thông tin các tệp tin cấu hình mình có tạo một repository tại: Ansible Role – Nginx reverse proxy for Apache MariaDB PHP7 + WordPress

Ở cấu trúc thư mục như trên thì các roles phân tách các thông tin gồm các task, vars, …

– group_vars: chúng ta chứa thông tin các biến toàn cục, mà có thể sử dụng ở toàn bộ cấu hình

– roles: Là thư mục chứa thông tin cấu hình phân tách của từng role. Ở đây gồm các roles: apache, common, mariadb, nginx, php và wordpress. Trong mỗi role đó thì gồm các thông tin cấu hình về tasks, var, .. hoặc templates của riêng mỗi role đó.

– inventory: là tệp tin chứa thông tin ansible host mà chúng ta sẽ khai báo, thay vì sử dụng tệp tin cấu hình mặc định tại đường dẫn “/etc/ansible/hosts”

– playbook.yml: là tệp tin playbook chứa thông tin các play. Nếu không tổ chức playbook theo cấu trúc thư mục thì tất cả thông tin về tasks, templates, vars, … mà chạy của mỗi play sẽ được liệt kê trong một tệp playbook. Với cấu trúc thư mục, chúng ta chỉ cần khai báo thông tin về play mà có các roles sẽ chạy, khi đó nó sẽ có nhiệm vụ gọi đến tasks được khai báo trong các tệp tin cấu hình ở thư mục roles ở trên.

Trong nhiều trường hơn, các roles đó có cùng thông tin các biến, các task thì khi đó chúng ta bố trí cấu trúc khác, để hạn chế việc lặp lại các biến, các task đó. Chúng ta có thể tham khảo thêm cách bố trí cấu trúc thư mục tại: https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html

 

Ở phần trước, chúng ta có giới thiệu qua cách sử dụng cơ bản Vagrant.

Trong phần này, chúng ta sẽ sử dụng Vagrant kết hợp với  Ansible để cho phép quản lý cấu hình trong khi tạo máy ảo.

Trước khi đi vào phần kết hợp giữa Vagrant và Ansible, chúng ta cần hiểu cơ bản về quản lý cấu hình với Ansible

vagrant ansible

1. Cài đặt VirtualBox, Vagrant, Ansible

Trong phạm vi bài viết chúng ta sẽ cài đặt trên Ubuntu-16.04 (Xenial)

  • Cài đặt Vagrant
curl -O https://releases.hashicorp.com/vagrant/2.1.2/vagrant_2.1.2_x86_64.deb && sudo dpkg --install vagrant_2.1.2_x86_64.deb
  • Cài đặt provider Virtualbox
curl -O https://download.virtualbox.org/virtualbox/5.2.16/virtualbox-5.2_5.2.16-123759~Ubuntu~xenial_amd64.deb && \
sudo dpkg --install virtualbox-5.2_5.2.16-123759~Ubuntu~xenial_amd64.deb
  • Cài đặt provisioner Ansible

Thêm repo PPA và cài đặt ansible

sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible 
sudo apt-get install ansible
sudo apt-get update

2. Sử dụng Vagrant kết hợp với Ansible

2.1 Tạo máy ảo và cài phần mềm trên một máy ảo

Chúng ta sẽ cài đặt trường hợp đơn giản như sau: Tạo 01 máy ảo CentOS/7, sau đó sử dụng ansible thực thi tệp tin playbook để cài đặt Apache. Tất cả đều đều gọi từ tệp Vagrantfile

  • Tạo thư mục chứa thông tin về vagrant và ansible
mkdir -p /home/keepwalking/vagrant/ansible/
cd /home/keepwalking/vagrant/ansible/
  • Tạo tệp tin “static_inventory” chứa thông tin inventory
web01 ansible_ssh_host=192.168.10.111
  • Tạo tệp “playbook.yml” với nội dung sau:
---
- hosts: web01
  become: yes
  tasks:
  - name: Install apache latest version
    yum:
      name: httpd
      state: latest
  - name: sure apache is running
    service:
      name: httpd
      state: started
  • Tạo tên tin Vagrantfile với nội dung sau:
Vagrant.configure(2) do |config|
  config.vm.box = "centos/7"
  config.vm.hostname = "web01"
  config.vm.network "public_network", ip: "192.168.10.111", bridge: "enp2s0"
  config.vm.provider "virtualbox" do |vb|
    # Customize the amount of memory on the VM:
    vb.memory = "2048"
  end
  config.vm.provision :ansible do |ansible|
    ansible.limit = "all"
    ansible.playbook = "playbook.yml"
    ansible.inventory_path = "static_inventory"
    ansible.raw_arguments  = [
      "--connection=paramiko",
      "--private-key=/home/keepwalking/vagrant/ansible/.vagrant/machines/default/virtualbox/private_key"
    ]
  end
end

Ở tệp tin Vagrantfile ở trên, chúng ta sử dụng chế độ kết nối “Paramiko” 

  • Khởi tạo và chạy máy ảo
vagrant up

Kết quả sau khi chạy

vagrant-ansible

2.2 Tạo nhiều máy ảo

  • Tạo thư mục chứa
mkdir -p /home/keepwalking/vagrant-ansible/ 
cd /home/keepwalking/vagrant-ansible
  • Tạo tệp tin web_inventory
web1 ansible_ssh_host=192.168.10.111 ansible_ssh_private_key_file=/home/keepwalking/vagrant-ansible/.vagrant/machines/web1/virtualbox/private_key
web2 ansible_ssh_host=192.168.10.112 ansible_ssh_private_key_file=/home/keepwalking/vagrant-ansible/.vagrant/machines/web2/virtualbox/private_key
web3 ansible_ssh_host=192.168.10.113 ansible_ssh_private_key_file=/home/keepwalking/vagrant-ansible/.vagrant/machines/web3/virtualbox/private_key
  • Tạo playbook.yml đề cài đặt Apache
---
- hosts: all
  become: yes
  tasks:
  - name: Install Apache latest version
    yum:
      name: httpd
      state: latest
  - name: ensure apache is running
    service:
      name: httpd
      state: started                       
  • Tạo tệp tin Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "centos/7"
  N = 3
  (1..N).each do |web_id|
    config.vm.define "web#{web_id}" do |webserver|
      webserver.vm.hostname = "web#{web_id}"
      webserver.vm.network "public_network", ip: "192.168.10.11#{web_id}", bridge: "enp2s0"
      if web_id == N
        webserver.vm.provision :ansible do |ansible|
          ansible.playbook = "playbook.yml"
          ansible.limit = "all"
          ansible.inventory_path = "web_inventory"
        end
      end
    end
  end
end

Ở đây chúng sử dụng dùng vòng lặp để tạo 03 máy chủ web. Sau khi kết thúc quá trình tạo máy chủ ảo đó, thì sử dụng ansible để chạy playbook.yml

  • Thực hiện quá trình tạo máy ảo và thực thi
vagrant up

Kết quả sau khi thực hiện tạo máy ảo

vagrant-ansible-multi

Tham khảo:

https://www.vagrantup.com/docs/provisioning/ansible.html

Ansible Playbook

Posted: Tháng Tám 5, 2018 in CM
Thẻ:,

Trong phần trước giới thiệu về Ansible và sử dụng cơ bản với Ad-Hoc. Ở phần này, chúng ta sử dụng Ansible thực thi quản lý và cài đặt dựa vào tệp tin playbook mà chứa các task cho các hosts/groups.

Playbook là tệp tin sắp xếp có cấu trúc bằng cách sử dụng play. Mỗi playbook bao gồm một hoặc nhiều play trong một list (Ở phần cuối của bài viết ta sẽ chạy lệnh để show ra số play trong playbook)

Mục tiêu của play là lập bản đồ một nhóm các host với một số vai trò được xác định, trình bày những thứ gì mà ansible sẽ gọi các task. Hiểu một cách đơn giản thì một task chính là gọi module của ansible.

ansible playbook

1. Cấu trúc của Playbook

Ansible Playbook được viết bằng YAML (Yet Another Markup Language).
– Tệp tin YAML (YML) bắt đầu bằng dấu 3 gạch ngang (—)
– YAML sử dụng cặp key:value đơn giản để trình bày dữ liệu.
– Cặp dictionary thì được trình bày trong cặp key: value (để ý có khoảng trắng giữa key và value)
– Mỗi phần tử của list sẽ được viết trên dòng mới, với thụt đầu dòng, bắt đầu với gạch ngang (-) và dấu cách.
– list có thể được sử dụng bên trong dictionary
– list của dictionary
Mỗi play chứa một danh sách (list) các task. Các task thực hiện theo tuần tự. Tất nhiên, các host trong một play đều nhận cùng chỉ thị task.
Thứ tự chạy playbook là từ trên xuống dưới. Nếu task nào thực hiện lỗi thì quá trình thực hiện playbook bị dừng tại đấy và kết thúc luôn quá trình chạy.
Kết quả của mỗi task là thực hiện một module của ansible, với các tham số chỉ định. Các biến có thể được sử dụng trong các đối số của module.
Mỗi task sẽ có một “name”. Name này chính là phần sẽ diễn giải cho task sẽ thực hiện, mà thông tin sẽ được xuất ra khi chạy playbook.

2. Các thành phần trong playbook

Một số tags trong playbook:

  • name: Xác định tên của ansible playbook
  • hosts: Chỉ định hosts hoặc host groups mà ansible sẽ điều khiển và thực thi các task.
  • vars: định nghĩa các biến mà có thể sử dụng trong playbook.
  • tasks: là danh sách các hành động cần được thực hiện

3. Tạo Playbook

Chúng ta sẽ tạo thử một playbook cho cài đặt, chạy apache web server và mariadb trên 02 máy CentOS 7

Khai báo hosts trong tệp tin /etc/ansible/hosts như sau:

[webservers]
 web01 ansible_ssh_host=192.168.1.101
[database]
 db01 ansible_ssh_host=192.168.1.111

Tạo tệp tin playbook là /home/keepwalking/websdb.yml với nội dung sau:

---
- hosts: webservers
  vars:
    vhost: example.local
  tasks:
  - name: Install Apache latest version
    yum:
      name: httpd
      state: latest
  - name: Create root directory for vhost
    file:
      path: /var/www/{{ vhost }}
      state: directory
      owner: apache
      group: apache
      mode: 0755
  - name: Add {{ vhost }} config file
    template:
      src: /home/keepwalking/example.local.conf
      dest: /etc/httpd/conf.d/{{ vhost }}.conf
    notify:
    - restart apache
  - name: ensure apache is running
    service:
      name: httpd
      state: started
  handlers:
    - name: restart apache
      service:
        name: httpd
        state: restarted
- hosts: databases
  tasks:
  - name: Install MariaDB latest version
    yum:
      name: mariadb-server
      state: latest
  - name: ensure mariadb is running
    service:
      name: mariadb
      state: started

Trong đó:

  • hosts: khai báo các host sẽ được chạy bởi playbook
  • vars: khai báo các biến sẽ sử dụng, sử dụng biến với block {{ }}
  • tasks: liệt kê các task cần thực hiện
  • name: tên của task
  • yum, file, template, service: các module sử dụng
  • notify: Sử dụng gọi đến 1 task khác (task được định nghĩa trong phần handlers) khi task hiện tại thực hiện thành công
  • handlers: khai báo các task, dùng cho notify

4. Chạy một playbook

– Kiểm tra cú pháp playbook trước khi chạy

ansible-playbook webdb.yml --syntax-check
playbook: webdb.yml

Nếu trả về tên playbook là cú pháp đúng

– Kiểm tra hosts ảnh hưởng và hiển thị các play

ansible-playbook webdb.yml --list-hosts
  playbook: webdb.yml
  play #1 (webservers): webservers  TAGS: []
    pattern: [u'webservers']
    hosts (1):
      web01
  play #2 (databases): databases    TAGS: []
    pattern: [u'databases']
    hosts (1):
      db01

– Thực hiện chạy playbook webdb.yml

ansible-playbook /home/keepwalking/webdb.yml -s -vvv

Kết thức quá trình chạy, kết quả như sau:

PLAY RECAP ***************************************************
db01          : ok=3    changed=2    unreachable=0    failed=0   
web01         : ok=6    changed=5    unreachable=0    failed=0

Tham khảo thêm về playbook:  https://docs.ansible.com/ansible/latest/user_guide/playbooks.html

Ở những phần tiếp theo ta sẽ thực hành sử dụng Ansible playbook sâu hơn.

Quản lý cấu hình (CM) với Ansible

Posted: Tháng Tám 4, 2018 in CM
Thẻ:,

Ansible là gì?

Ansible

Ansible là công cụ quản lý cấu hình ( Configuration Management – CM), cho phép tự động hóa công việc của sysadmin/devops.
– Là công cụ mã nguồn mở dùng để quản lý cài đặt, cấu hình hệ thống một cách tập trung.
– Sử dụng SSH (PowerShell) và các module được viết bằng Python để điều khiển hệ thống
– Sử dụng YAML (Yet Another Markup Language) để xây dựng cấu trúc mô tả hệ thống và sử dụng định dạng JSON để hiện thị thông tin

1. Đặc điểm của Ansible

  • Không cần cài đặt phần mềm lên các remote host, chỉ cài đặt trên máy control machine
  • Không phải service/daemon, chỉ cần thực thi khi được gọi
  • Bảo mật cao (sử dụng giao thức SSH)
  • Cú pháp dễ đọc, dễ học và dễ hiểu ( sử dụng YAML)

2. Yêu cầu cài đặt

  • OS: Unix, Windows
  • Thư viện python-jinja2: dùng để xây dựng template cấu hình
  • Thư viện python-yaml: hỗ trợ cấu trúc YAML
  • Python-2.4+

3. Cài đặt Ansible

Cài đặt trên CentOS/RHEL

sudo yum install ansible

Cài đặt trên Ubuntu
Thêm repo PPA và cài đặt ansible

sudo add-apt-repository ppa:ansible/ansible-2.6
sudo apt-get update
sudo apt-get install ansible

4. Cấu hình

Máy ansible giao tiếp với các hosts qua giao thức SSH.  Để an toàn hơn trong kết nối SSH và cho phép quản lý và cấu hình thuận tiện hơn, chúng ta sử dụng SSH Keys.

4.1 Trên host (server01-192.168.1.100)

a. sử dụng CentOS (server01-192.168.1.100)
– Tạo tài khoản

useradd keepwalking
passwd keepwalking
  • Cho phép keepwalking sử dụng sudo với not password
echo "%keepwalking ALL=(ALL) NOPASSWD:ALL" >/etc/sudoers.d/keepwalking

b. Sử dụng Ubuntu (server02-192.168.1.111)
– Tạo tài khoản

useradd keepwalking -m -s /bin/bash
  • Cho phép keepwalking sử dụng sudo với not password
echo "%keepwalking ALL=(ALL) NOPASSWD:ALL" >/etc/sudoers.d/keepwalking

4.2 Trên máy Ansible (control machine)

  • Tạo tài khoản keepwalking
useradd keepwalking
passwd keepwalking
  • Cho phép keepwalking sử dụng sudo
echo "%keepwalking ALL=(ALL) ALL" >/etc/sudoers.d/keepwalking
  • Login keepwalking và tạo SSH Keys
ssh-keygen -C "Key for KeepWalking"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/keepwalking/.ssh/id_rsa): 
Created directory '/home/keepwalking/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/keepwalking/.ssh/id_rsa.
Your public key has been saved in /home/keepwalking/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:pxzD/LoBSGBMOdAy2Ekt5eSjOtSKrD5q85qMxvhAi4Q key for keepwalking
The key's randomart image is:
+---[RSA 2048]----+
|oB==o |
|+.O=. |
| o o= |
|. .o o o |
|E+... . S . |
|B.o o * |
|O+ + . |
|=O. o |
|O**. o. |
+----[SHA256]-----+

– Copy public key đến các remote hosts

ssh-copy-id -i ~/.ssh/id_rsa.pub keepwalking@192.168.1.100
ssh-copy-id -i ~/.ssh/id_rsa.pub keepwalking@192.168.1.111

4.3 Cấu hình quản lý host và group trên Ansible ( Hosts Inventory)

– Khai báo hosts vào tệp tin /etc/ansbile/hosts
Chúng ta có thể sử dụng name, ipaddress để khai báo hosts trong tệp tin /etc/ansible/hosts
Khi số lượng hosts lớn, để dễ quản lý các host theo từng danh mục, chúng ta có thể phân chia các hosts thành các group.
Thay vì sử dụng DNS, chúng ta cũng có thể tạo các host name ở tệp tin /etc/hosts, ví dụ

192.168.1.100 web01
192.168.1.102 web02
192.168.1.111 db01
192.168.1.112 db02

Rõ ràng khai báo theo tên ngắn gọn và dễ nhớ hơn, vì vậy chúng ta sẽ khai báo các hosts trong tệp tin /etc/ansible/hosts như sau:

[webservers]
 web01
 web02
[databases]
 db01
 db02

Nếu không cần sử dụng đến tệp tin /etc/hosts, thì để sử dụng host name ta thêm biến ‘ansible_ssh_host’ vào tệp tin /etc/ansible/hosts

[webservers]
 web01 ansible_ssh_host=192.168.1.100
 web02 ansible_ssh_host=192.168.1.102
[database]
 db01 ansible_ssh_host=192.168.1.111
 db02 ansible_ssh_host=192.168.1.112

Một số biến có thể bổ sung vào tệp tin /etc/ansible/hosts như:
ansible_ssh_user, ansible_ssh_private_key_file, ansible_ssh_port, ansible_ssh_host (có thể viết ngắn gọn là: ansible_user, ansible_port, ..)
Tham khảo thêm tại: https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html

5. sử dụng cơ bản (Ad-hoc command)

Một số tùy chọn khi sử dụng lệnh ansible
-i : inventory host, xác định tên tin khai báo hosts (mặc định /etc/ansible/hosts)
-m : gọi module của ansible (mặc định là command) –> có thể tham khảo all module http://docs.ansible.com/ansible/list_of_all_modules.html
-a : command được gửi vào module
-u : user
-k : password
-s : sudo (từ ansible-2.6 bị cảnh báo là DEPRECATION)
-K : sudo password
-v (verbose), -vv (..), -vvvv : debug option
Tham khảo đầy đủ tại đây

Ping thử host web01 xem nào

ansible web01 -m ping
web01 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

Kiểm tra không gian các phân vùng ổ cứng

ansible db01 -m shell -a 'df -T'
db01 | SUCCESS | rc=0 >>
Filesystem                      Type     1K-blocks   Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00 xfs       39269648 910548  38359100   3% /
devtmpfs                        devtmpfs    239968      0    239968   0% /dev
tmpfs                           tmpfs       249712      0    249712   0% /dev/shm
tmpfs                           tmpfs       249712   4588    245124   2% /run
tmpfs                           tmpfs       249712      0    249712   0% /sys/fs/cgroup
/dev/sda2                       xfs        1038336  64076    974260   7% /boot
tmpfs                           tmpfs        49944      0     49944   0% /run/user/1001
Copy tệp tin từ source đến destination
ansible web01 -m copy -a "src=/etc/hosts dest=/etc/hosts" -s
Tạo thư mục mới
ansible web01 -m file -a "path=/tmp/software mode=777 owner=keepwalking group=keepwalking state=directory"

– Sử dụng lệnh cho quản lý packages

Kiểm tra gói đã được cài đặt

ansible webservers -m yum -a "name=openssl state=present"

Kiểm tra gói đã được update đến bản latest (nếu chưa thực hiện install/update)

ansible webservers -m yum -a "name=vim state=latest"

– Triển khai phần mềm từ source

Kéo web code từ Git repo xuống web server

ansible webservers -m git -a "repo= https://github.com/keepwalking86/mytv.git dest=/var/www/ version=HEAD"

– Quản lý các service/daemon

Start dịch vụ Apache trên các webservers

ansible webservers -m service -a "name=httpd state=started"

(value of state must be one of: running,started,stopped,restarted,reloaded)

– Thu thập các thông tin hosts

ansible all -m setup

 

Trong phần tiếp theo của Ansible chúng ta sẽ sử dụng tệp tin cấu hình Playbook để cho phép quản lý và triển khai cấu hình dễ dàng với nhiều lệnh thực thi đến các hosts.