ansible自動化運維

問:

Q1.請問你如何去高效率管理已開機的且有系統的10000臺計算機?例如,給這10000臺計算機安裝vsftpd軟件。
A.採用ssh來批量遠程管理或採用ansible、puppet(由google公司開發)、saltstack等自動化部署工具來遠程管理這10000臺服務器。

Q2.如何採用ansible來遠程管理這10000臺服務器?
A.只需要在linux工程師的個人電腦上安裝ansible軟件,並添加需要管理的10000臺計算機的IP地址信息到這臺電腦上,在這臺電腦上用ssh-keygen生成祕鑰對(私鑰和公鑰),用ssh-copy-id  [email protected].$i將公鑰id_rsa.pub發送到這10000臺計算機上。最後用ansible來遠程管理這1萬臺計算機。


 一 . Ansible簡介


ansible基於python開發 , 集合了衆多運維工具(puppet , cfengine , chef , func , fabric)的優點 , 實現了批量系統配置 , 批量程序部署 , 批量運行命令等功能 ; ansible是基於模塊工作的 , 本身沒有批量部署的能力 , 真正具有批量部署的是ansible所運行的模塊 ,ansible只是提供一種框架 .


幾種運維工具比較

Puppet       基於 Ruby 開發,採用 C/S 架構,擴展性強,基於 SSL,遠程命令執行相對較弱
SaltStack       基於 Python 開發,採用 C/S 架構,相對 puppet 更輕量級,配置語法使用 YAML,使得配置腳本更簡單
Ansible       基於 Python paramiko 開發,分佈式,無需客戶端,輕量級,配置語法使用YAML 及 Jinja2模板語言,更強的遠程命令執行操作

ansible圖解:

image.png

connection plugins:連接插件,負責和被管理端實現通信,有SSH,ZEROMQ等,默認使用SSH連接
host inventory:主機清單,是一個配置文件裏面定義監控的主機。配置文件位於/etc/ansible/hosts
modules : 模塊,核心模塊、command模塊、ping模塊、shell模塊、cron模塊、file模塊、自定義模塊等
plugins : modules功能的補充,包括連接插件,郵件插件等
playbook:編排(即劇本、腳本功能),定義 Ansible 多任務配置文件,非必需



 Ansible特性


no  agents : 不需要在被管主機上安裝任何客戶端 , 更新時 , 只需要在操縱機上進行一次更新即可

no  server : 無服務器端 , 使用時直接運行命令即可

modules  in  any  languages : 基於模塊工作 , 可使用任意語言開發模塊

yaml  node  code : 使用yaml語言制定劇本playbook

ssh  by  default : 基於ssh工作

strong  multi-tier  solution : 可實現多級指揮




 Ansible下載和安裝

可以下載阿里的centos7網絡yum源配置文件,下載epel第三方擴展網絡yum源配置文件


步驟:

在阿里雲的yum源網站查看centos , epel的yum源幫助 ,下載阿里雲centos7的yum源文件和epel第三方擴展網絡yum源配置文件


阿里雲的yum源網站 : https://opsx.alibaba.com/mirror

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo


清除yum緩存 , 並生成新的yum緩存雲數據

yun  clean  all

yum  makecache  fast

image.png


用yum下載ansible軟件

yum  install  ansible  --downloadonly  --downloaddir=/ansible7       #下載ansible , 並指定目錄爲/ansible7

ls  /ansible7                              #查看/ansible7目錄

createrepo  /ansible7              #生成yum的repodata倉庫數據庫(metadata 元數據)文件夾和文件 

image.png


註解: metadata元數據,又稱中介數據、中繼數據,爲描述數據的數據(data about data),主要是描述數據屬性(property)的信息,用來支持如指示存儲位置、歷史數據、資源查找、文件記錄等功能。




創建ansible7的yum配置文件(此處以腳本方式) 

cat  > /etc/yum.repos.d/ansible7.repo <<EOF
[ansible7]
name=ansible 7 software
baseurl=file:///ansible7
enabled=1
gpgcheck=0
EOF

image.png  



刪除網絡yum源配置文件 , 清除yum緩存 , 用ansible的本地yum源來安裝此軟件

cd /etc/yum.repos.d
ls
rm -fv  C*.repo  epel.repo
yum  clean  all
yum  repolist
yum  search  ansible
yum  install  -y  ansible

image.png

image.png


查看ansible配置文件

rpm  -qc  ansible

image.png

/etc/ansible/ansible.cfg      #主配置文件,主要設置一些ansible初始化的信息,比如日誌存放路徑、模塊、插件等配置信息

/etc/ansible/hosts               #主機清單文件,定義所管理的主機組及主機,可以在主配置文件中修改


       主機清單文件配置格式

       [webservers]
       192.168.11.11
       Bar.example.com
       up.example.com:5309           #指定 SSH 端口 5309
       web1  ansible_ssh_host=192.168.1.50  #設置主機別名爲 web1
       www[01:50].example.com     #支持通配符匹配www01,www02,...,www50
       db-[a:f].example.com             #通配符匹配db-a,db-b,...,db-f   

       -----------------------------------------------------------------
       爲每個主機單獨指定一些變量,這些變量可以在 playbooks 中使用:
       [atlanta]
       host1 http_port=80 maxRequestsPerChild=808
       host2 http_port=303 maxRequestsPerChild=909
       ------------------------------------------------------------------
       爲一個組指定變量,組內每個主機都可以使用該變量:
       [atlanta]
       host1
       host2
       [atlanta:vars]
       ntp_server=ntp.atlanta.example.com
       proxy=proxy.atlanta.example.com
       -----------------------------------------------------------------
       組可以包含其他組:
       [atlanta]
       host1
       host2
       [raleigh]
       host3
       host4
       [southeast:children]
       atlanta
       raleigh
       [southeast:vars]
       some_server=foo.southeast.example.com
       halon_system_timeout=30
       ===================================
       hosts文件支持一些特定指令:
       ansible_ssh_host:指定主機別名對應的真實 IP
       ansible_ssh_port:指定連接到這個主機的 ssh 端口,默認 22
       ansible_ssh_user:連接到該主機的 ssh 用戶
       ansible_ssh_pass:連接到該主機的 ssh 密碼,安全考慮還是建議使用私鑰,或在命令行指定-k 選項輸入
       ansible_sudo_pass:sudo 密碼
       ansible_sudo_exe(v1.8+的新特性):sudo 命令路徑
       ansible_connection:連接類型,可以是 local、ssh 或 paramiko等
       ansible_ssh_private_key_file:私鑰文件路徑
       ansible_shell_type:目標系統的 shell 類型,默認爲 sh,如果設置 csh/fish,那麼命令需要遵循它們語法
       ansible_python_interpreter:python 解釋器路徑,默認是/usr/bin/python,但是如要要連*BSD系統的話,就需要該指令修改   python 路徑



 Ansible的簡單使用


基本命令格式:


    ansible  <pattern>  -m  <module_name>  -a  <arguments>

    pattern : 主機清單裏定義的主機組名 , 主機名 , IP , 別名等  all表示所有的主機 , 支持通配符 , 正則表達式

                   (:)- 多個組 , 組名之間用冒號隔開

                    *web* -組名或主機名中含web的

                    webservers[0] - webservers組中的第一臺主機

                    以~開頭 , 匹配正則

              -m  moddule_name :模塊名稱 , 默認爲command

              -a  arguments : 傳遞給模塊的參數


幫助信息查看:

    ansible-doc  -l                           #查看所有信息模塊

    ansible-doc  module_name      #查看模塊幫助信息


配置過程: 在控制節點安裝ansible --> 在控制節點生成密鑰 , 把公鑰傳到所有的被控制節點 --> 編輯主機清單文件 , 加入被管控的節點




簡單使用示例:

準備3臺Linux系統主機[主機1:192.168.11.11   主機2:192.168.11.12   主機3:192.168.11.12]


控制節點[192.168.11.11]

生成密鑰對 , 上傳公鑰給要管理的主機:

ssh-keygen                                          #生成密鑰

ssh-copy-id  [email protected]      #上傳公鑰

ssh-copy-id  [email protected]

ssh  [email protected][13]  date     #驗證雙機互信

image.png

編輯主機清單文件 vim  /etc/ansible/hosts :

[gg]                            #組名

192.168.11.12            #成員

192.168.11.13 

image.png

測試ansible的使用 :

ansible    主機組名或IP   -m   模塊名     -a   '模塊的選項和參數'

-m   指定模塊,常見的模塊有ping、shell、command、cron、user、group、yum等
-a    指定模塊的選項參數,參數中state狀態有present(現在就有,用於創建)、absent(缺席的,用於刪除)兩種


   1.ping 上述gg組的所有成員

   image.png

   2.使用ansible指定shell模塊對192.168.11.12進行查看IP的操作 

   ansible   192.168.11.12   -m  shell   -a   'ip  a'

   image.png

   3.使用ansible對192.168.11.13查看192.168.11.13主機上/etc/passwd文件最後5行

   image.png

   4.用ansible給gg主機組中的所有主機新增ggg用戶然後刪除ggg用戶:

   ansible  gg  -m   user   -a  "name='ggg'  shell='/sbin/nologin'   state='present'"   #調用user模塊來創建用戶

   ansible  gg  -m   shell  -a   'id  ggg;tail  -5  /etc/passwd'

   ansible  gg  -m   user   -a  "name='ggg'  remove='yes' state='absent'"                   #調用user模塊來創建用戶

   ansible  gg  -m   shell  -a   'id  ggg;tail  -5  /etc/passwd'

   image.png




 ansible常用模塊


setup : 查看遠程主機的基本信息   例:ansible   qf  -m   setup

作用 : 收集可用的facts,收集每個節點的相關信息, 如: 架構信息,IP,時間,域名,網卡,MAC,主機名,CPU等信息

ping: 測試遠程主機的運行狀態
file: 設置文件屬性   例:ansible  192.168.11.12  -m  file  "path='/ak/bk'  state='directory'"

copy: 把主控端的文件複製到遠程主機

shell: shell命令
ansible默認使用的模塊是command,支持多數shell命令,但不支持某些shell變量及管道,如果要使用,用shell模塊

user: 用戶管理

cron: 計劃任務管理

script: 將本地腳本傳輸到遠程執行

service: 服務管理(el7:systemd)

lineinfile: 文件編輯

yum: 使用yum管理軟件包


模塊選項和詳細使用可用 ansible-doc  module_name 查看模塊 , 例如:

查看user模塊 , 可以看到user模塊的選項和實例等;

image.png

image.png




 

 Ansible--playbook


Playbooks 是 Ansible 管理配置、部署應用和編排的語言,可以使用 Playbooks 來描述你想在遠程主機執行的策略或者執行的一組步驟過程等 ; 如果說 Ansible 模塊是工作中的工具的話,那麼 playbooks 就是方案 , Playbooks 採用 YAML 語法結構


Playbooks  組成
Target section : 定義將要執行 playbook 的遠程主機組
Variable section : 定義 playbook 運行時需要使用的變量
Task section :定義將要在遠程主機上執行的任務列表
Handler section : 定義 task 執行完成以後需要調用的任務


簡單示例1:
[root@master ~]# cd /etc/ansible/
[root@master ansible]# vim test.yml                             #後綴爲yml
    ---
       - hosts: testhost
         user: root
         tasks:
           - name: playbook_test
             shell: touch /tmp/playbook.txt
注意:

ansible playbook 配置文件非常嚴謹 , 一個空格都會導致出錯 

hosts參數指定了對哪些主機進行操作;
user參數指定了使用什麼用戶登錄遠程主機操作;
tasks指定了一個任務,其下面的name參數同樣是對任務的描述,在執行過程中會打印出來。


例:用absible給gg組的成員創建/tmp/playbook.txt文件

image.png

image.png

在主機192.168.11.12和主機192.168.11.13上可以驗證結果 , 發現都已創建playbook.txt文件

image.png

image.png


簡單示例2:
[root@master ansible]# vim create_user.yml
    ---
       - name: create_user
         hosts: testhost
         user: root
         gather_facts: false
         vars:
           - user: "msiyuetian"
         tasks:
           - name: create user
             user: name="{{ user }}"
注意:
name參數對該playbook實現的功能做一個概述,後面執行過程中,會打印 name變量的值 ,可以省略;
gather_facts參數指定了在以下任務部分執行前,是否先執行setup模塊獲取主機相關信息,這在後面的task會使用到setup獲取的信息時用到;
vars參數指定了變量,這裏指字一個user變量,其值爲test ,需要注意的是,變量值一定要用引號引住;
user指定了調用user模塊,name是user模塊裏的一個參數,而增加的用戶名字調用了上面user變量的值。
[root@master ansible]# ansible-playbook create_user.yml

簡單示例3:關於劇本中的when條件語句的應用
[root@master ansible]# cd  /etc/ansible
[root@master ansible]# vim when.yml
    ---
       - hosts: testhost
         user: root
         gather_facts: True
         tasks:
           - name: use when
             shell: touch /tmp/when.txt
             when: ansible_fqdn == "clone2.qf.com"

注意:只有當參數 facter_ipaddress 爲 192.168.10.110 時纔在該機器上新建指定文件;意思就是隻對 testhost 組中特定的主機進行操作,忽略組內其他的主機。我們可以通過setup模塊查看各個參數的值
[root@master ansible]# ansible-playbook when.yml

簡單示例4:關於劇本中的handler語句的應用
[root@master ansible]# vim handlers.yml
    ---
       - name: handlers test
         hosts: testhost
         user: root
         tasks:
           - name: test copy
             copy: src=/etc/passwd dest=/tmp/handlers.txt
             notify: test handlers        此處的test  handlers必須是handlers設置中的name的值
         handlers:
           - name: test handlers    
             shell: echo "www.qf.com" >> /tmp/handlers.txt

說明:只有 copy 模塊真正執行後,纔會去調用下面的 handlers 相關的操作,追加內容。所以這種比較適合配置文件發生更改後,需要重啓服務的操作。

可以對比示例1 , 自行舉例驗證實驗 !!



 Ansible實例說明


目標:  

使用ansible在主機192.168.11.11上給主機192.168.11.12和主機192.168.11.13部署apache服務器 , 然後進行測試


步驟:

查看服務是否安裝:

image.png

給這兩臺主機安裝apache所需要的軟件:

image.png

給這兩臺主機啓用apache服務 , 並查看狀態:

image.png

給這兩臺主機設置主頁:

image.png

在192.168.11.11編寫一個/apache腳本 , 併發送給這兩臺主機:

image.png

image.png

在192.168.11.11上測試這兩臺apache服務:

image.png

window測試 :

image.png

從上圖可以看出訪問成功 , 同理 , 在瀏覽器訪問192.168.11.13 , 出來的頁面就是node13.com .




















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章