Ansible基礎配置和企業級項目實用案例


Ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。

Ansible基礎模塊和功能

自動化運維工具

運維發展歷程:手動 --> 標准化 --> 工具化 --> 自動化 --> 智能化

自動化系統安裝工具:bare metal:pxe、cobbler
批量Configuration配置工具:puppet (ruby)、saltstack (python)、chef、cfengine等
批量Command and Control工具:fabric、func
自動化批量運維流程:在調度器上下線一批主機(標記為維護模式)--> 關閉服務 --> 部署新版本 --> 啟動服務 --> 在調度器上啟用這一批主機;
ansible:可實現批量Configuration、Command and Control部署和管理的自動化運維工具
運維工個的分類:(根據客戶端和調度器端是否都要配置該工具)

  • agent:puppet, func, ...
  • agentless(ssh,):ansible, fabric

Ansible基本配置和架構

Ansible特性:

  • 模塊化:調用特定的模塊,完成特定任務;
  • 基於Python語言實現,由Paramiko, PyYAML和Jinja2三個關鍵模塊;
  • 部署簡單:agentless;
  • 支持自定義模塊;
  • 支持playbook:劇本執行多個任務時,非必需可以讓節點一次性運行多個任務。;
  • 連接插件connection plugins:負責和被監控端實現通信;
  •  host inventory:指定操作的主機,是一個配置文件里面定義監控的主機;
  • 各種模塊核心模塊、command模塊、自定義模塊;借助於插件完成記錄日志郵件等功能;
  • 冪等性;

ansible安裝:epel源, ansible包
配置文件:/etc/ansible/ansible.cfg
主機清單:/etc/ansible/hosts
主程序:

  • ansible
  • ansible-playbook
  • ansible-doc

ansible的簡單使用格式
ansible   HOST-PATTERN   -m   MOD_NAME  -a    MOD_ARGS   -f   FORKS  -C  -u  USERNAME  -c  CONNECTION

其中HOST-PATTERN主機匹配可用all(全部),IP地址匹配或hosts組匹配等

FORKS  指每次批量執行主機數量,默認5

ansible的常用模塊

獲取主機列表:ansible all --list-host(s)

主機狀態檢查:ansible 主機匹配  -m  ping  (狀態正常為綠色,否則為紅色)

獲取模塊列表:ansible-doc -l

獲取某模塊使用選項和用法:ansible-doc  -s  module
command模塊:在遠程主機運行命令;

例:chdir 執行命令前切換某個目錄

 creates 

removes與creates相反,存在則執行,刪除,不存在則不執行

shell模塊:在遠程主機在shell進程下運行命令,支持shell特性,如管道等,command不支持管道等操作;例如下:

excutable=PATH 可指定運行命令時的shell類型

shell模塊很多與command相似。

group模塊  管理組賬號

例:system默認為no,state有present與absent(缺席)兩種狀態。黃色表示發生改變

user模塊:管理用戶賬號,可用選項很多,常用選項如下:

  • *name=
  • system=
  • uid=
  • shell=
  • group=
  • groups=
  • comment=
  • home=
  • generate_ssh_key 
  • generate_ssh_key 

copy模塊: Copies files to remote locations.
用法:
(1) src=    dest=
(2) content= dest=   (直接生成文件內容)
owner, group, mode

file模塊: Sets attributes of files只能創建文件,不能像copy那樣生成文件內容
用法:
(1) 創建鏈接文件:*path= src= state=link
(2) 修改屬性:path=   owner=   mode=  group= 
(3) 創建目錄:path= state=directory

state狀態值:file、directory、link、hard、touch、touch、absent

fetch模塊:Fetches a file from remote nodes

get_url模塊:Downloads files from HTTP, HTTPS, or FTP to node

cron 模塊:Manage cron.d and crontab entries.

  • minute=
  • day=
  • month=
  • weekday=
  • hour=
  • *job=
  • *name=
  • state=  present or absent

hostname模塊:Manage hostname
  name=
pip模塊:Manages Python library dependencies.
yum模塊:Manages packages with the `yum' package manager

  • name=:程序包名稱,可以帶版本號;
  • state=   present, latest,installed(安裝)、absent,removed(卸載)

 

其他包管理工具apt(debian)、zypper(suse)、dnf(fedora)、prm、apk等

service模塊:管理服務

  • *name=
  • state=started、stopped、restarted
  • enabled=
  • runlevel=

 

git模塊:Deploy(部署) software (or files) from git checkouts

  • repo=
  • dest=
  • version=

setup模塊:獲取各主機facts的各個變量、網絡配置、硬件信息等  ansible HOST -m setup ,如:

Ansible自動化運維進階

Playbook命令文件和使用方法

Playbook:YAML(可讀性高,用來表達數據序列的格式)格式,任務(task)

可以用YAML腳本批量執行計划好的命令,從而實現運維自動化,避免重復運維配置等工作

基本數據結構標量、數組、關聯數組
Playbook的核心元素:

  • Hosts:主機
  • Tasks:任務列表
  • Variables
  • Templates:包含了模板語法的文本文件;
  • Handlers:由特定條件觸發的任務;

    Roles(非核心)
playbook的基礎組件
- Hosts:運行指定任務的目標主機;
  remoute_user: 在遠程主機上執行任務的用戶;
  sudo_user:
  - tasks:任務列表
  模塊,模塊參數;
  格式:(1) action: module arguments
        (2) module: arguments
注意:shell和command模塊后面直接跟命令,而非key=value類的參數列表;
(1) 某任務的狀態在運行后為changed時,可通過“notify”通知給相應的handlers;
(2) 任務可以通過tags打標簽,而后可在ansible-playbook后使用-t進行調用,且多個任務可使用同一個標簽,一個任務也可用多個標簽;
playbook的使用方法:
(1) 測試

  • ansible-playbook --check  或 -C  file.yml   只檢測可能會發生的改變,但不真正執行操作;
  • ansible-playbook --list-hosts   file.yaml  查看任務主機
  • ansible-playbook --list-tasks  file.yaml   查看所有任務
  • ansible-playbook --syntax-check  file.yml  檢查配置文件語法是否有錯

(2) 運行 ansible-playbook  file.yaml 

簡單示例:
handlers:任務,在特定條件下觸發;接收到其它任務的通知時被觸發;
notify: HANDLER TASK NAME

 

- hosts: webservers
  remote_user: root
  tasks:
  - name: install nginx
    yum: name=nginx state=latest
  - name: start nginx
    service : name=nginx enabled=true  state=started
- hosts: webservers
  remote_user: root
  tasks:
  - name: install redis
    yum : name=redis state=latest
  - name: connfig  redis
    copy: src=/date/redis.conf  dest=/etc/redis.conf owner=redis group=root
    tags: confredis
    notify: restartredis
  - name: start redis
    service : name=redis state=started
    tags: startredis
  handlers:
  - name: restartredis
    service : name=redis state=restartes
View Code

variables:
(1) facts:可直接調用;
注意:可使用setup模塊直接獲取目標主機的facters;
(2) 用戶自定義變量:

  • (a) ansible-playbook命令的命令行中的   -e VARS(如,“packname=tree”), --extra-vars=VARS  
  • (b) 在playbook中定義變量的方法:

      vars:
        - var1: value1
        - var2: value2
變量引用:{{  variable  }}

(3) 通過roles傳遞變量;
(4) Host Inventory
  (a) 用戶自定義變量
    (i) 向不同的主機傳遞不同的變量;IP/HOSTNAME varaiable=value var2=value2
    (ii) 向組中的主機傳遞相同的變量;[groupname:vars]  variable=value,直接在/etc/ansible/hosts的主機定義組變量

  (b) invertory參數:用於定義ansible遠程連接目標主機時使用的參數,而非傳遞給playbook的變量,在ansible的hosts組的主機定義;

  • ansible_ssh_host =
  • ansible_ssh_port =
  • ansible_ssh_user =
  • ansible_ssh_pass =
  • ansbile_sudo_pass =

template模塊:基於模板方式生成一個文件復制到遠程主機

  • *src=
  • *dest=
  • owner=
  • group=
  • mode=

模板:templates為文本文件,嵌套有腳本(使用模板編程語言Jinja2編寫)
示例: (用ansible-playbook調用此文件,ansible不能直接用templates調用)

- hosts: websrvs
  remote_user: root
  tasks:
  - name: install nginx
    yum: name=nginx state=present
  - name: install conf file
    template: src=files/nginx.conf.jj2    dest=/etc/nginx/nginx.conf
  notify: restart nginx
    tags: instconf
  - name: start nginx service
    service: name=nginx state=started
  handlers:
  - name: restart nginx
    service: name=nginx state=restarted	

模板配置文件 :nginx.conf.jj2

worker_processes {{ ansible_processor_vcpus }};
listen {{ http_port }};

 

條件測試:復雜環境的批量判斷操作

when語句:在task中使用,jinja2的語法格式

tasks: 
- name: install conf file to centos7
 template: src=files/nginx.conf.c7.jj2   dest=/etc/nginx/nginx.conf
 when: ansible_distribution_major_version == "7"
- name: install conf file to centos6
 template: src=files/nginx.conf.c6.jj2   dest=/etc/nginx/nginx.conf
 when: ansible_distribution_major_version == "6"    

循環:迭代,需要重復執行的任務;
對迭代項的引用,固定變量名為”item“,而后,要在task中使用with_items給定要迭代的元素列表;例:

- name: install some packages
  yum: name={{ item }}  state=latest
  with_items:
  - nginx
  - memcached
  - php-fpm
- name: add some groups
  group: name={{ item }} state=present
  with_items:
  - group11
  - group12
  - group13

- name: add some users
  user: name={{ item.name }} group={{ item.group }} state=present
  with_items:
  - { name: 'user11', group: 'group11' }
  - { name: 'user12', group: 'group12' }
  - { name: 'user13', group: 'group13' }

就是利用item和with_items相當與一個數組,一次完成多個重復的、屬性相同指令,加版本號的方法也類似,如下:

 

- hosts: webserves
  remote_user: root
  vars:
  - jdk_version: 1.8.0
  tasks:
  - name : install { { item } } package
    yum : name= {{ item }} state =installed
    with_items:
    - nginx
    - java-{ { jdk_version }}-openjdk
    - tomcat
    - tomcat-webapps
    - tomcat-docs_webapp
    - tomcat-admin-webapps
  - name : config tomcat
    copy : src ={{ item.file }}  dest={{ item.conf }}
    with_items:
    - { file: '/data/tomcat-users.xml', conf:  '/etc/tomcat-user.xml' }
    - { file: '/data/server.xml', conf:  '/etc/server.xml' }  
View Code

角色(roles):分類組織調用各個應用各個模塊

角色集合:/etc/ansible/roles/下可有多個按應用分類的角色,如:

  • mysql/
  • httpd/
  • nginx/
  • memcached/

每個角色,以特定的層級目錄結構進行組織:如 mysql/下

  • files/ :存放由copy或script模塊等調用的文件;
  • templates/:template模塊查找所需要模板文件的目錄;
  • tasks/:至少應該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進行包含;
  • handlers/:至少應該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進行包含;
  • vars/:至少應該包含一個名為main.yml的文件;其它的文件需要在此文件中通過include進行包含;
  • meta/:至少應該包含一個名為main.yml的文件,定義當前角色的特殊設定及其依賴關系;其它的文件需要在此文件中通過include進行包含;
  • default/:設定默認變量時使用此目錄中的main.yml文件;

在playbook調用角色方法1
- hosts: webservers
  remote_user: root
  roles:
  - mysql
  - memcached
  - nginx
在playbook調用角色方法2:傳遞變量給角色 
- hosts:
  remote_user:
  roles:
  - { role: nginx, username: nginx等變量 }
鍵role用於指定角色名稱;后續的k/v用於傳遞變量給角色;

還可以基於條件測試實現角色調用
roles:
- { role: nginx, when: "ansible_distribution_major_version == '7' " }


關於更多ansible的介紹和查看ansible官網:http://www.ansible.com.cn

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM