問:node
Q1.請問你如何去高效率管理已開機的且有系統的10000臺計算機?例如,給這10000臺計算機安裝vsftpd軟件。
A.採用ssh來批量遠程管理或採用ansible、puppet(由google公司開發)、saltstack等自動化部署工具來遠程管理這10000臺服務器。python
Q2.如何採用ansible來遠程管理這10000臺服務器?
A.只須要在linux工程師的我的電腦上安裝ansible軟件,並添加須要管理的10000臺計算機的IP地址信息到這臺電腦上,在這臺電腦上用ssh-keygen生成祕鑰對(私鑰和公鑰),用ssh-copy-id root@192.168.11.$i將公鑰id_rsa.pub發送到這10000臺計算機上。最後用ansible來遠程管理這1萬臺計算機。linux
一 . Ansible簡介
web
ansible基於python開發 , 集合了衆多運維工具(puppet , cfengine , chef , func , fabric)的優勢 , 實現了批量系統配置 , 批量程序部署 , 批量運行命令等功能 ; ansible是基於模塊工做的 , 自己沒有批量部署的能力 , 真正具備批量部署的是ansible所運行的模塊 ,ansible只是提供一種框架 .正則表達式
幾種運維工具比較shell
Puppet | 基於 Ruby 開發,採用 C/S 架構,擴展性強,基於 SSL,遠程命令執行相對較弱 |
SaltStack | 基於 Python 開發,採用 C/S 架構,相對 puppet 更輕量級,配置語法使用 YAML,使得配置腳本更簡單 |
Ansible | 基於 Python paramiko 開發,分佈式,無需客戶端,輕量級,配置語法使用YAML 及 Jinja2模板語言,更強的遠程命令執行操做 |
ansible圖解:數據庫
connection plugins:鏈接插件,負責和被管理端實現通訊,有SSH,ZEROMQ等,默認使用SSH鏈接
host inventory:主機清單,是一個配置文件裏面定義監控的主機。配置文件位於/etc/ansible/hosts
modules : 模塊,核心模塊、command模塊、ping模塊、shell模塊、cron模塊、file模塊、自定義模塊等
plugins : modules功能的補充,包括鏈接插件,郵件插件等
playbook:編排(即劇本、腳本功能),定義 Ansible 多任務配置文件,非必需apache
Ansible特性vim
no agents : 不須要在被管主機上安裝任何客戶端 , 更新時 , 只須要在操縱機上進行一次更新便可centos
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
用yum下載ansible軟件
yum install ansible --downloadonly --downloaddir=/ansible7 #下載ansible , 並指定目錄爲/ansible7
ls /ansible7 #查看/ansible7目錄
createrepo /ansible7 #生成yum的repodata倉庫數據庫(metadata 元數據)文件夾和文件
註解: 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
刪除網絡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
查看ansible配置文件
rpm -qc ansible
/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 root@192.168.11.12 #上傳公鑰
ssh-copy-id root@192.168.11.13
ssh root@192.168.11.12[13] date #驗證雙機互信
編輯主機清單文件 vim /etc/ansible/hosts :
[gg] #組名
192.168.11.12 #成員
192.168.11.13
測試ansible的使用 :
ansible 主機組名或IP -m 模塊名 -a '模塊的選項和參數'
-m 指定模塊,常見的模塊有ping、shell、command、cron、user、group、yum等
-a 指定模塊的選項參數,參數中state狀態有present(如今就有,用於建立)、absent(缺席的,用於刪除)兩種
1.ping 上述gg組的全部成員
2.使用ansible指定shell模塊對192.168.11.12進行查看IP的操做
ansible 192.168.11.12 -m shell -a 'ip a'
3.使用ansible對192.168.11.13查看192.168.11.13主機上/etc/passwd文件最後5行
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'
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模塊的選項和實例等;
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文件
在主機192.168.11.12和主機192.168.11.13上能夠驗證結果 , 發現都已建立playbook.txt文件
簡單示例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服務器 , 而後進行測試
步驟:
查看服務是否安裝:
給這兩臺主機安裝apache所須要的軟件:
給這兩臺主機啓用apache服務 , 並查看狀態:
給這兩臺主機設置主頁:
在192.168.11.11編寫一個/apache腳本 , 併發送給這兩臺主機:
在192.168.11.11上測試這兩臺apache服務:
window測試 :
從上圖能夠看出訪問成功 , 同理 , 在瀏覽器訪問192.168.11.13 , 出來的頁面就是node13.com .