ansible運維自動化工具

運維的三大化是指:html

  • 標準化
  • 自動化
  • 智能化

而對於自動化咱們今天將要給你們介紹一款ansible運維自動化工具:python

ansible是基於python開發的,能實現批量管理系統配置、批量程序部署、批量執行命令。而ansible是基於模塊工做的。他的工做機制是基於ssh無密碼登陸。mysql

ansible的特色以下:nginx

一、部署簡單,只需在主控端部署Ansible環境,被控端無需作任何操做; 
二、默認使用SSH協議對設備進行管理; 
三、有大量常規運維操做模塊,可實現平常絕大部分操做。 
四、配置簡單、功能強大、擴展性強; 
五、支持API及自定義模塊,可經過Python輕鬆擴展; 
六、經過Playbooks來定製強大的配置、狀態管理; 
七、輕量級,無需在客戶端安裝agent,更新時,只需在操做機上進行一次更新便可; 
八、提供一個功能強大、操做性強的Web管理界面和REST API接口 ——AWX平臺。

ansible的三種工做模式:web

  • ad-hoc模式:使用單個模塊,支持批量執行單條命令
  • playbook模式:是ansible主要管理方式,是經過task集合完成一類功能,能夠簡單得分解爲多個ad-hoc命令
  • roles角色定製:高級用法,它是基於把playbook分解成多個目錄,更加方便,能直接調用

ansible命令執行過程:sql

一、加載本身的配置文件 默認/etc/ansible/ansible.cfg 
二、查找對應的主機配置文件,找到要執行的主機或者組 
三、加載本身對應的模塊文件,如command 
四、經過ansible將模塊或命令生成對應的臨時py文件,並將該文件傳輸至遠程服務器的 
五、對應執行用戶的家目錄的.ansible/tmp/XXX/XXX.PY文件 
六、給文件+x執行 
七、執行並返回結果 
八、刪除臨時py文件,sleep 0退出

ansible的配置:shell

在/etc/ansible/ansible.cfg中(通常不用更改配置,根據需求去更改)vim

inventory = /etc/ansible/hosts 資產清單列表,就是須要管理主機組的列表
library = /usr/share/ansible    指Ansible模塊存放的目錄
forks = 5  同時開啓進程數,個根據主機數去調整,一次併發處理多少。
sudo_user = root   默認設置執行命令的用戶
remote_port = 22    被管理節點的端口,默認是22
host_key_checking = False   設置是否檢查SSH主機的密鑰
timeout = 60    設置SSH鏈接超時間隔,通常調高點
log_path = /var/log/ansible.log  日誌存放的路徑

在/etc/ansible/hosts中定義管理節點後端

一、直接指明主機地址或主機名: 
    www.magedu.com
    172.17.166.166
二、定義一個主機組【組名】把地址或者主機名加進去
    [webserver]
    172.17.166.166
    172.17.155.155
    172.17.166.[1:6]  表示匹配172.17.166.1-----172.17.166.6

ansible一些常見的模塊介紹:centos

ansible-doc -l 查看模塊信息
ansible all --list-host  查看全部host分組

ansible一些用法:

-a <module_args>   模塊命令參數
-k  登陸密碼
-C  check 只是去測試一下會改變什麼內容,不會真正去執行
-f number  並行任務數
-i 指定管理節點文件的路徑
-m  指定調用的模塊
-S  用su命令
-o  壓縮輸出摘要輸出,嘗試一切都在一行上輸出
-s  用sudo去執行
-u  遠程用戶,默認是Root
-v   查看執行過程信息
-vv  -vvv    更詳細執行過程信息
-P  每隔多長時間收集信息

ping模塊:測試主機的連通性

ansible  all  -m  ping

command模塊,在遠程主機執行命令(可是不支持管道|,<,>,;,&)

ansible all -m command -a ‘command’
還支持一些參數
chdir          # 在執行命令以前,先切換到該目錄 
creates        #一個文件名,當這個文件存在,則該命令不執行,能夠用來作判斷 
executable     # 切換shell來執行命令,須要使用命令的絕對路徑 
free_form      #要執行的Linux指令,通常使用Ansible的-a參數代替。 
removes        #一個文件名,這個文件不存在,則該命令不執行,與creates相反的判斷

shell模塊,遠程執行命令,shell模塊能夠支持|,<,>,;,&

ansible all -m shell -a ‘command |...’

copy模塊,複製文件到遠程主機,能夠改權限

(1)複製文件  -a 「src=  dest=  」
    ansible web -m copy -a 「src=/etc/passwd dest=/app」
(2)給定內容生成文件 -a "content=  dest=  "
    ansible web -m copy -a 「content=’hello world’ dest=/app/a.txt」
還支持一些參數:
backup :       #在覆蓋以前,將源文件備份。=yes是備份   =no是不備份
content:       #用於替代src,能夠直接指定文件的值
dest:          #必須有指定目標地址路徑
directory_mode(mode):     #遞歸設定目錄的權限,默認是系統默認權限
force:         #若是目標主機包含這個文件,yes時爲強制覆蓋,no不強制覆蓋
others:        #全部file模塊裏的選項均可以在這使用
src:           #源地址路徑

file設置文件屬性

建立目錄:       ansible web -m file -a ‘path=/app/test state=directory’
建立連接文件:    -a 「path=   src=   state=link」
刪除文件:       -a 「path=/app/test    state=absent」

還支持一些參數:
force:    #須要在兩種狀況下強制建立軟連接,一種是源文件不存在,但以後會創建的狀況下;另外一種是目標軟連接已存在,須要先取消以前的軟鏈,而後建立新的軟鏈,有兩個選項:yes|no
group:    #定義文件/目錄的屬組 
mode:     #定義文件/目錄的權限 
owner:    #定義文件/目錄的屬主 
path:     #必選項,定義文件/目錄的路徑 
recurse:  #遞歸設置文件的屬性,只對目錄有效
src:      #被連接的源文件路徑,只應用 於state=link的狀況 
dest:     #被連接到的路徑,只應用於state=link的狀況 
state:    #狀態
    directory:    #若是目錄不存在,就建立目錄         
    file:         #即便文件不存在,也不會被建立         
    link:         #建立軟連接         
    hard:         #建立硬連接         
    touch:        #若是文件不存在,則會建立一個新的文件,若是文件或目錄已存在,則更新其最後修改時間         
    absent:       #刪除目錄、文件或者取消連接文件

fetch模塊,從遠程某主機獲取文件到本地

ansible web -m fetch  -a ‘src=/app/a.txt dest=/app’

還有一些參數:
src:          #遠程主機文件路徑
dest:         #保存本地路徑

cron模塊,管理cron計劃任務(若是添加多條,name不能相同)

ansible web -m cron -a "name='ntp update every 5 min' minute=*/5 job='/sbin/update 172.17.0.1 &> /dev/null' "          #每5分鐘同步一下時間。

還有一些參數:
day=       #日應該運行的工做( 1-31, *, */2,  )   
hour=      # 小時 ( 0-23, *, */2, )  
minute=    #分鐘( 0-59, *, */2, )   
month=     # 月( 1-12, *, /2,  )   
weekday    # 周 ( 0-6 for Sunday-Saturday,,  ) 
job=       #指明運行的命令是什麼   
name=      #定時任務描述   
special_time     #特殊的時間範圍,參數:reboot(重啓時),annually(每一年),monthly(每個月),weekly (每週),daily(天天),hourly(每小時)  
state      #指定狀態,present表示添加定時任務,也是默認設置,absent表示刪除定時任務  
user       # 以哪一個用戶的身份執行

yum模塊,安裝軟件

ansible web -m yum -a "name=vsftpd state=present disable_gpg_check=yes"             #安裝vsftpd包

還有一些參數:
conf_file           #設定遠程yum安裝時所依賴的配置文件。如配置文件沒有在默認的位置。
disable_gpg_check   #是否禁止GPG checking,只用於`present‘ or `latest’。
    disablerepo     #臨時禁止使用yum庫。 只用於安裝或更新時。
    enablerepo      #臨時使用的yum庫。只用於安裝或更新時。
    name=           #所安裝的包的名稱
state=              #present安裝, latest安裝最新的, absent 卸載軟件。 
update_cache        #強制更新yum的緩存。

service模塊:服務程序管理

支持的參數:
arguments         #命令行提供額外的參數   
enabled           #設置開機啓動。   
name=             #服務名稱   
runlevel          #開機啓動的級別,通常不用指定。   
sleep             #在重啓服務的過程當中,是否等待。如在服務關閉之後等待2秒再啓動。   
state             #started啓動 stopped中止 restarted重啓reloaded重載配置

例如:啓動vsftpd服務,並設置開啓自啓
ansible web -m service -a "name=vsftpd enabled=yes state=started"

user模塊管理

comment           # 用戶的描述信息 
createhome        # 是否建立家目錄 
force             # 在使用state=absent是, 行爲與userdel –force一致. 
group             # 指定基本組 
groups            # 指定附加組,若是指定爲(groups=)表示刪除全部組 
home              # 指定用戶家目錄 
move_home         # 若是設置爲home=時, 試圖將用戶主目錄移動到指定的目錄 
name              # 指定用戶名 
non_unique        # 該選項容許改變非惟一的用戶ID值 
password          # 指定用戶密碼 此處指定密碼在/etc/shadow裏面不是加密的
remove            # 在使用state=absent時, 行爲是與userdel –remove一致 
shell             # 指定默認shell 
state             # 設置賬號狀態,不指定爲建立,指定值爲absent表示刪除 
system            # 當建立一個用戶,設置這個用戶是系統用戶。這個設置不能更改現有用戶 
uid               # 指定用戶的uid 
update_password   #密碼更新模式

例如:建立magedu01用戶
ansible web -m user -a "name=magedu01 createhome=yes  password=magedu shell=/bin/sh uid=10001"

group模塊

還有一些參數
gid=             # 設置組的GID號 
name=            # 管理組的名稱 
state=           # 指定組狀態,默認爲建立,設置值爲absent爲刪除 
system=          # 設置值爲yes,表示爲建立系統組

例如建立爲tom組:
ansible web -m group -a ‘name=tom state=present’

script模塊,在指定節點運行服務端的腳本

例如:
    先編寫一個腳本:vim /app/a.txt
    而後再傳過去ansible web -m script -a '/app/a.txt'

setup模塊,收集信息用的(主要引用變量,加判斷用)

facts組件是ansible採集信息的一個功能,可使用setup模塊查機器上的素有Facts信息,而後直接調用變量,facts就是變量,內建變量。
ansible playbook:
setup模塊,主要用於獲取主機信息,在playbooks裏常常會用到的一個參數gather_facts就與該模塊相關。 
setup模塊下常用的一個參數是filter參數,filter是過濾器

例如:
ansible 10.212.52.252 -m setup -a 'filter=ansible_*_mb' //查看主機內存信息 
ansible 10.212.52.252 -m setup -a 'filter=ansible_eth[0-2]' //查看地接口爲eth0-2的網卡信息

--tree=    輸出的信息保存在文件中
例如:ansible web -m setup -a 'filter=*mem*' - -tree=/app/mem.txt

ansible playbook命令介紹:

  • playbook是ansible用於配置,部署,和管理被控節點的劇本。
  • playbook就是ad-hoc命令的集合,須要大量操做的時候,用playbook更加方便,使用playbook你能夠方便的重用這些代碼,能夠移植到不一樣的機器上面,像函數同樣 ,最大化的利用代碼
  • playbook是由YMAL語言編寫的

playbook中主要有三部分組成:

  • hosts部分:主要代表哪一個主機組來運行下面的tasks,每一個playbook都必須指定hosts
  • remote_user部分:指定遠端主機中哪一個用戶來登陸遠端系統,能夠任意指定,可是用戶執行必須有相應的task的權限
  • tasks部分:指定遠端主機將要執行的一系列動做,task的核心是ansible模塊,name是可選的,可是建議加上去,還能夠給予相應的參數。

playbook的簡單配置以下:

例如:安裝samba並啓動服務
---
- hosts: web
  remote_user: root
  tasks:
      - name: yum install samba
        yum: name=samba state=latest
      - name: start service
        service: name=smb state=started

還能夠打標籤:(直接運行這個模塊)

tags: startsmb
而後直接運行標籤處的模塊:ansible-playbook a.yml -t startsmb

notify的使用:(配置文件修改須要重新加載)

---
- hosts: web
  remote_user: root
  tasks:
      - name: yum install nginx
        yum: name=nginx state=latest
      - name: copy nginx.conf (推送配置文件)
        copy: src=/app/nginx.conf dest=/etc/nginx/nginx.conf backup=yes
        notify: reload
        tags: reloadnginx
      - name: start nginx
        service: name=nginx state=started
        tags: startnginx
  handlers:
      - name: reload        (與前面notify同樣)
        service: name=nginx state=restarted
執行命令:ansible-playbook nginx.yml -t reloadnginx
    至關於打個reloadnginx標籤,而後直接指定標籤,運行到notify就會觸動handlers,就會restarted從啓nginx服務。

劇本里面還能直接引用變量:

一、facts:能夠直接調用,可以使用setup模塊直接獲取目標主機的facters

二、用戶自定義變量

---
- hosts: web
  remote_user: root
  tasks:
      - name: yum install {{ rpmname }}
        yum: name={{ rpmname }} state=latest
      - name: copy {{ rpmname }}.conf
        copy: src=/app/{{ rpmname }}.conf dest=/etc/{{ rpmname }}/{{ rpmname }}.c
onf backup=yes
        notify: reload
        tags: reload{{ rpmname }}
      - name: start {{ rpmname }}
        service: name={{ rpmname }} state=started
        tags: start{{ rpmname }}
  handlers:
      - name: reload
        service: name={{ rpmname }} state=restarted

執行命令能夠直接調用變量:ansible-playbook nginx.yml -e rpmname=vsftpd
也能夠直接在劇本里面定義:vars:
                            - rpmname: vsftpd

劇本里面還能夠先定義一個模板,而後直接調用變量:

例如nginx:
(1)先把nginx.conf改爲nginx.j2(以.j2結尾就行)
(2)而後在nginx.j2裏面設置一些變量: 
    worker_processes  {{ ansible_processor_vcpus }};  CPU數量
    listen       {{ nginxport }};        監聽端口變量
(3)而後在nginx.yml中配置:(變量能夠定義在裏面也能夠直接-e指定變量)
---
- hosts: web  (主機組)
  remote_user: root            (遠程執行命令的用戶)
  vars:                        (定義變量)
      - rpmname: nginx         (rpmname變量是nginx)
        nginxport: 8899        (nginxport變量時8899)
  tasks:                       (任務段)
      - name: yum install {{ rpmname }}
        yum: name={{ rpmname }} state=latest    (調用yum模塊)
      - name: copy {{ rpmname }}.conf
        template: src=/app/{{ rpmname }}.j2 dest=/etc/nginx/{{ rpmname }}.conf backup=yes          (調用模板,這裏不能用copy)
        notify: reload                         (通常和handlers配合使用)
        tags: reload{{ rpmname }}              (定義標籤)
      - name: start {{ rpmname }}
        service: name={{ rpmname }} state=started   (調用service模塊)
        tags: start{{ rpmname }}               (定義標籤)
  handlers:                                    (與前面的notify同樣)
      - name: reload
        service: name={{ rpmname }} state=restarted  (觸動notify時候調用service模塊)
    (4)執行命令:ansible-playbook nginx.yml

劇本里面還可使用循環語句:

when語句:在task中使用,jinja2的語法格式 
tasks: 
    - name: install conf file to centos7 
      template: src=files/nginx.conf.c7.j2 
      when: ansible_distribution_major_version == "7" 
    - name: install conf file to centos6 
      template: src=files/nginx.conf.c6.j2 
      when: ansible_distribution_major_version == "6"
--------判斷版本號是7的時候安裝c7.j2,是6的時候安裝c6.j2-----------

循環:須要重複執行的任務
          對迭代項的引用,固定變量名爲「item」,然後在tasks中使用with_items給定要迭代的元素列表

角色定製roles:

  • 對以上的全部方式,有個弊端就是沒法實現複用假設在同時部署Web,db,ha時,或者不一樣服務器組合不一樣的應用就須要寫多個yml文件,這樣不靈活。
  • roles用於層次性、結構性地組織playbook。roles可以層次型結構自動裝載變量文件、tasks以及handlers等。要是用roles只須要在playbook中使用include指令便可。
  • roles就是經過分別將變量(vars)、文件(file)、任務(tasks)、模塊 (modules)及處理器(handlers)放置於單獨的目錄中,並能夠便捷地include它們的一種機制

定義角色案例:

一、在/etc/ansible/roles目錄下生成對應的目錄結構:
    mkdir -pv ./{nginx,mysql,tomcat}/{files,templates,vars,tasks,handlers,meta,default}
二、定義/tasks/main.yml的配置文件
    - name: cp  
      copy: src=nginx-1.10.2-1.el7.ngx.x86_64.rpm  dest=/tmp/nginx-1.10.21.el7.ngx.x86_64.rpm 
    - name: install  
      yum: name=/tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm  state=latest 
    - name: conf  
      template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf  
      tags: nginxconf  
      notify: new conf to reload  
    - name: start service  
      service: name=nginx state=started enabled=true
三、修改vars/main.yml變量文件
    nginx_port: 「8888」
四、定義handlers文件handlers/main.yml 
    - name: new conf to reload  
      service: name=nginx state=restarted   
五、定義/etc/ansible/roles.yml的playbook文件 
    - hosts: nginx  
      remote_user: root  
  roles:    
    - nginx
六、能夠經過roles傳遞變量
    - hosts: nginx  
      remote_user: root  
  roles:    
    - { role: nginx, nginxport: 12345 }
七、也能夠配置多個角色

實驗:在Tomcat上部署的.war包升級版本的具體步驟

一、在ansible的配置文件中配置.yml劇本
vim war.yml
---
- hosts: web
  remote_user: root
  serial: 1   (一個服務器的task執行完畢在執行另外一個服務器)
  tasks:
      - name: check index.html not ok
        copy: content=no dest=/usr/local/tomcat/webapps/ROOT/check
      - name: sleep
        shell: sleep 10
      - name: stoptomcat
        shell: /usr/local/tomcat/bin/catalina.sh stop
      - name: delete solo.war
        shell: rm -rf /usr/local/tomcat/webapps/solo.war /usr/local/tomcat/webapps/solo
      - name: cp.war
        copy: src=/root/solo-2.2.0.war dest=/usr/local/tomcat/ backup=no
      - name: links
        file: path=/usr/local/tomcat/webapps/solo.war src=/usr/local/tomcat/solo-2.2.0.war state=link
      - name: starttomcat
        shell: /usr/local/tomcat/bin/catalina.sh start
      - name: check index.html ok
        copy: content=ok dest=/usr/local/tomcat/webapps/ROOT/check
二、配置前段haproxy負載均衡器
    vim /etc/haproxy/haproxy.cfg
    frontend http
        bind 172.17.177.177:80
        default_backend webserver

    backend webserver
        balance roundrobin
        option httpchk GET /check
        http-check expect string ok
        server web1 172.17.166.166:8080 check weight 1
    server web2 172.17.155.155:8080 check weight 1
三、配置後端兩臺Tomcat服務器
四、而後直接在ansible上執行劇本就能夠了 ansible-playbook war.yml
相關文章
相關標籤/搜索