如何配置自動化工具-Ansible?

如何配置自動化工具-Ansible?



什麼是Ansible?

Ansible是一個開源軟件工具,可實現自動執行軟件安裝及配置,配置管理和應用程序部署。

Ansible的優點

  • 無代理

客戶端上沒有要與服務器通信的軟件或代理。直接通過SSH機制連接服務器

  • 重複部署

無論你調用該操作多少次,結果都是一樣的。

  • 簡單且可擴展

Ansible是用Python編寫的,並將YAML用於編寫playbook,這兩門語言都被認為是相對其他開發語言最容易學習和入門的。

Ansible安裝配置

#Ubuntu/Debian 

sudo apt-get install ansible
# CentOS
sudo yum install ansible
#Mac-OS
brew install ansible

Ansible架構和組件

如何配置自動化工具-Ansible?

  • 模塊(Modules)

在服務器上執行程序安裝,例如,

一般是運行此命令,手動安裝:

sudo apt-get install htop

而我們可以通過使用apt模塊來安裝htop

- name:Install htop 
apt:name = htop

使用模塊可以讓你知道是否已安裝。

  • 插件(Plugins)

插件是增強Ansible的核心功能。Ansible自帶了很多非常方便的插件,你可以很輕鬆的編寫自己的插件。

  • 主機列表(Host Inventories)

要提供主機列表,我們需要提供 inventory 。這是配置主機文件的方式。

以最簡單的方式,我們的主機文件可以包含以下這一行:

35.178.45.231 ansible_ssh_user = ubuntu
  • 劇本(Playbook)

Ansible playbook是一種以腳本方式將命令發送到遠程服務器的方法。你可以通過將腳本傳遞到一個或多個服務器來配置整個複雜的環境,而不必單獨使用Ansible命令經過命令行遠程配置服務器。

  • 組變量(group_vars)

該文件包含一組或多組變量,例如db用戶名和密碼。

db_user: ubuntu
db_password: 123456
  • 角色(roles)

roles是將多個tasks合併一起執行的方式,可以通過乾淨清晰的目錄結構以非常有效的方式進行自動化,也有利於配置管理

  • 處理者(handlers)

handlers是tasks的列表,與常規tasks沒有什麼實質的不同,它們由全局唯一名稱引用,並由通知程序通知。如果沒有任何通知處理程序,它將不會運行。無論有多少個tasks通知handlers,在特定playbook中完成所有tasks後,它將僅運行一次。

  • Tags

如果有大型playbook,則可以在不運行整個playbook的情況下運行特定部分的配置可能會很有用。增加了很大的靈活性。

如何配置自動化工具-Ansible?

實例:安裝程序,運行的步驟

  1. 構建主機和ansible.cfg
  2. 在Ansible中定義Roles
  3. 在Ansible中定義Handlers
  4. 安裝PHP模塊
  5. 安裝Nginx
  6. 添加Nginx默認配置文件
  7. 添加vars以管理變量
  8. 創建MySql數據庫,用戶名和密碼
  9. 創建playbook
  10. 執行playbook安裝部署
  • 構建主機和ansible.cfg

hosts.ini

[test] 
#your instance IP
127.0.0.39

ansible.cfg

[defaults] 
hostfile = hosts.ini
# configure log dir
log_path= logs/ansible-log.log
  • 在Ansible中定義Roles

使用Ping模塊來驗證主機是否正常工作,然後我將更新所有軟件包並安裝兩個模塊git和htop

--- 
- ping: ~
###
- name: Update apt packages
apt:
update_cache: yes
##
- name: Install GIT VCS
apt:
name: git
state: latest
##
- name: Install htop
apt: name=htop
  • 在Ansible中定義Handlers
--- 
- name: Restart PHP-FPM
service:
name: php{{php_version}}-fpm
state: restarted
####
- name: Restart Nginx
service:
name: nginx
state: restarted
  • 安裝Php模塊
  • 要在ansible中觸發handlers,我們必須使用notify:重新啟動PHP-FPM,handlers名稱應該是唯一的,例如,如果您想僅從playbook中運行此任務,則只能通過使用 --tags =“ php”運行命令,它將僅執行此任務
--- 
- name: Install PHP {{php_version}} PPA Repo
apt_repository:
repo: 'ppa:ondrej/php'
tags:
- php
##
- name: Install PHP {{php_version}}
apt: name=php{{php_version}} state=latest
##
- name: Install PHP packages
become: true
apt:
name: "{{ item }}"
state: latest
with_items:
- php{{php_version}}-curl
- php{{php_version}}-fpm
- php{{php_version}}-intl
- php{{php_version}}-mysql
- php{{php_version}}-xml
- php{{php_version}}-mbstring
notify: Restart PHP-FPM
tags:
- php
  • 安裝Nginx模塊
- name: Install Nginx web server 
apt:
name: nginx
state: latest
notify: Restart Nginx
tags:
- nginx
###
- name: Update nginx config files
become: true
template:
src: templates/nginx.conf
dest: "/etc/nginx/sites-available/default"
tags:
- nginx

notify: Restart Nginx
###
- name: link nginx config
become: true
file:
src: "/etc/nginx/sites-available/default"
dest: "/etc/nginx/sites-enabled/default"
state: link
tags:
- nginx
notify: Restart Nginx
  • 添加nginx默認配置文件
server { 
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
\t\tserver_name {{ server_name }};
root {{ app_work_dir }}public;
location / {
try_files $uri $uri/ /index.php?$args;
index index.php index.html index.htm;
}
if (!-d $request_filename) {
rewrite ^/(.*)/$ /$1 permanent;
}
location = /favicon.ico {
access_log off;
log_not_found off;
}
location ~ \\.php$ {
try_files $uri $uri/ /index.php?$args;
index index.php index.html index.htm;
fastcgi_pass unix:/var/run/php/php{{php_version}}-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME {{app_work_dir}}public$fastcgi_script_name;
fastcgi_param APPLICATION_ENV testing;
fastcgi_param PATH /usr/bin:/bin:/usr/sbin:/sbin;
fastcgi_intercept_errors on;
include fastcgi_params;
}
}
  • 添加vars以管理變量

vars.yml

注:可以使用ansible-vault加密和解密vars

--- 
##@ref https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html#variables-and-vaults
ansible_ssh_user: "ubuntu"
current_user: "ubuntu"
server_name: "app_name"
repo_git_url: "app_github_url"
ansible_ssh_private_key_file: "ssh_dir"
php_version: 7.2
app_work_dir: /var/www/app_name/
#mysql config
mysql_host: "mysql_host"
mysql_db: app_name
mysql_user: sql_user
mysql_pass: sql_pass
#other config
cache_driver: file
session_driver: file
app_env: production
app_debug: false
app_key: "your_app_key"
app_name: "app_name"
app_url: "your_app_url"
  • 創建MySql數據庫,用戶名和密碼
- mysql_user: 
name: "{{mysql_user}}"
password: "{{mysql_pass}}"
priv: '*.*:ALL'
state: present
tags:

- mysql-db
##
- name: Create APP DB database
mysql_db: name="{{mysql_db}}" state=present login_user="{{mysql_user}}" login_password="{{mysql_pass}}"
  • 創建playbook

將test定義為該playbook的主機,而sudo yes則使您能夠以sudo用戶身份執行命令,我們有vars_files存儲我們的vars,我們有一組roles,每個role執行特定task,最後有handlers引入所有項目的handler

--- 
- hosts: test
#common options between modules
sudo: yes
gather_facts: no
vars_files:
- ./group_vars/vars.yml
roles:
- misc
- php
- mysql
- redis
- nginx
- bootstrap-app
- code-deploy
###
handlers:
- include: handlers/main.yml
  • 執行playbook安裝部署
#ansible-playbook playbookName
ansible-playbook code-deploy.yml# run with specific tags
ansible-playbook playbook.yml --tags="env-files,php"
  • 完整的目錄結構
├── ansible.cfg
├── code-deploy.yml
├── files
│ └── dump.sql
├── group_vars
│ └── vars.yml
├── handlers
│ └── main.yml
├── hosts.ini
├── logs
│ └── ansible-log.log
├── roles
│ ├── bootstrap-app
│ │ └── tasks
│ │ └── main.yml
│ ├── code-deploy
│ │ ├── tasks
│ │ │ ├── config-files.yml
│ │ │ └── main.yml
│ │ └── templates
│ │ └── env.conf
│ ├── misc
│ │ └── tasks
│ │ └── main.yml
│ ├── mysql
│ │ └── tasks
│ │ ├── config.yml
│ │ └── main.yml
│ ├── nginx
│ │ ├── tasks
│ │ │ └── main.yml
│ │ └── templates
│ │ └── nginx.conf
│ ├── php
│ │ └── tasks
│ │ └── main.yml
│ └── redis
│ └── tasks
│ └── main.yml
├──/>│ ├── install_composer.sh
│ └── startup.sh
└── site.yml

參考文獻

https://ansible-tran.readthedocs.io/en/latest/


分享到:


相關文章: