運維自動化之ansible
項目場景:
公司計劃在年底做一次大型市場促銷活動,全面沖刺下交易額,為明年的上市做準備。公司要求各業務組對年底大促做準備,運維部要求所有業務容量進行三倍的擴容,並搭建出多套環境可以共開發和測試人員做測試。
技術說明:
ansible聚集以上部署和命令執行於一身,能夠完整輕易的實現應用部署和批量命令功能,適用於主機數量中型規模,再大的規模用puppet。
ansible是基於 paramiko 開發的,並且基於模塊化工作,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。ansible不需要在遠程主機上安裝client/agents
ansible工作模式:
Ansible系統由控制主機對被管節點的操作方式可分為兩類,即ad- hoc和playbook:
ad-hoc模式(點對點)使用單個模塊,支持批量執行單條命令。 ad-hoc 命令是一種可以快速輸入的命令,而且不需要保存起來的命令。就相當於bash中的一句話shell。
playbook模式是Ansible主要管理方式,也是Ansible功能強大的關鍵所在。playbook通過多個task集合完成一類功能,如Web服務的安裝部署、數據庫服務器的批量備份等。可以簡單地把playbook理解為通過組合多條ad-hoc操作作的配置文件。
ansible特點:
1、部署簡單,只需在主控端部署Ansible環境,被控端無需做任何操作;
2、默認使用SSH協議對設備進行管理;
3、有大量常規運維操作模塊,可實現日常絕大部分操作。
4、配置簡單、功能強大、擴展性強;
5、支持API及自定義模塊,可通過Python輕松擴展;
6、通過Playbooks來定制強大的配置、狀態管理;
7、輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可;
8、提供一個功能強大、操作性強的Web管理界面和REST API接口 ——AWX平臺。
Ansiblie命令執行過程
1、加載自己的配置文件 默認/etc/ansible/ansible.cfg
2、查找對應的主機配置文件,找到要執行的主機或者組
3、加載自己對應的模塊文件,如command
4、通過ansible將模塊或命令生成對應的臨時py文件,並將該文件傳輸至遠程服務器
5、對應主機執行用戶的家目錄的.ansible/tmp/XXX/XXX.PY文件
6、給文件+x執行
7、執行並返回結果
8、刪除臨時py文件,sleep 0退出
Ansible常用命令集
/usr/bin/ansible 臨時命令執行工具,常用於臨時命令的執行。
/usr/bin/ansible-doc 模塊功能查看工具。
/usr/bin/ansible-playbook 定制自動化的任務集編排工具,即按照劇本執行命令的
常用命令示例:
查看模塊列表:ansible-doc -l
獲取指定模塊的使用幫助:ansible-doc -s MOD_NAME
臨時命令執行:ansible <host-pattern> [-f forks] [-m module_name] [-a args] [-C] [-v]
Host-pattern指明單個主機或者主機組
-f 指定並發連接數
-m 指明使用的模塊
-a 指明使用的模塊參數
-C表示只是測試而不真正執行,可以用來預測
-v 顯示詳細信息,還可以使用-vv、-vvv、....
項目準備:
Ansible服務器node1:ip:172.17.13.134
主機組web:node2及node3:ip:172.17.13.135 172.17.13.136
項目實現:
一、安裝ansible,有兩種方式,任選一種即可
1、使用yum安裝:yum install ansible -y
2、使用pip(python的包管理模塊)安裝:yum install python-pip;pip install ansible
二、配置ansible使用公鑰驗證,實現無密碼遠程連接:
雖然ansible支持其他主機認證方式,但是我們最常用的的還是基於秘鑰的認證:
1、首先生成秘鑰
ssh-keygen -t rsa -P ''
2、然後向主機分發秘鑰:
ssh-copy-id [root@]ip #@後面跟主機名或者IP地址
實現效果:無密碼連接
三、配置主機組:
在/etc/ansible/hosts文件中加入主機組
比如[web]
172.17.13.135
172.17.13.136 表示在web主機組裏配置兩個主機
組成員也可以使用通配符來匹配,如下 172.17.13.[135:137] #表示匹配從172.17.13.135-172.17.13.137的主機。
也可以直接添加主機而不需要主機組。
四、主機連通性測試:
ansible web -m ping
五、利用Ansible的模塊來實現運維自動化
1、Command
命令模塊接受命令名稱,後面是空格分隔的列表參數。給定的命令將在所有選定的節點上執行。它不會通過shell進行處理,比如$HOME操作和”小於”<“,”>”, “|”, “;”,”&”等操作。
Command模塊的參數:
①chdir # 在執行命令之前,先切換到該目錄
示例:切換到/tmp目錄之後再使用ls查看文件
ansible web -m command -a 'chdir=/tmp ls'
②creates # 一個文件名,當這個文件存在,則該命令不執行,可以用來做判斷
示例:當/tmp存在則不執行後面的命令
ansible web -m command -a 'creates=/tmp ls'
③executable # 切換shell來執行命令,需要使用命令的絕對路徑
④free_form # 要執行的Linux指令,一般使用Ansible的-a參數代替。
⑤removes # 一個文件名,這個文件不存在,則該命令不執行,與creates相反的判斷
示例:當/tmp存在則執行後面的命令
ansible web -m command -a 'removes=/tmp ls'
2、shell模塊在遠程主機上調用shell解釋器運行命令,支持shell的各種功能,例如管道等
示例:過濾出/etc/passwd文件中的root
ansible web -m shell -a 'cat /etc/passwd |grep "root"'
3、copy:復制文件到遠程主機,可以改權限等
用法:
(1) 復制文件
-a “src= dest= ”
(2) 給定內容生成文件
-a 'content= dest= mode="'
相關選項如下:
backup:在覆蓋之前,將源文件備份,備份文件包含時間信息。yes|no代表備份|不備份
content:用於替代“src”,可以直接設定指定文件的內容
dest:必選項。要將源文件復制到的遠程主機的絕對路徑,如果源文件是一個目錄,那麽該路徑也必須是個目錄
mode:設定權限
directory_mode:遞歸設定目錄的權限,默認為系統默認權限
force:如果目標主機包含該文件,但內容不同,如果設置為yes,則強制覆蓋,如果為no,則只有當目標主機的目標位置不存在該文件時,才復制。默認為yes
others:所有的file模塊裏的選項都可以在這裏使用
src:被復制到遠程主機的本地文件,可以是絕對路徑,也可以是相對路徑。如果路徑是一個目錄,它將遞歸復制。在這種情況下,如果路徑使用“/”來結尾,則只復制目錄裏的內容,如果沒有使用“/”來結尾,則包含目錄在內的整個內容全部復制,類似於rsync。
示例:
①對web主機組的主機創建/tmp/test.ansible文件,內容為hello\nworld,權限為666:
ansible web -m copy -a 'content="hello\nworld" dest=/tmp/test.ansible mode=666'
②拷貝本機的圖片到對應主機組中主機的/data/photo,權限為644,且覆蓋之前備份:
ansible web -m copy -a 'src=/root/2345_image_file_copy_2.jpg dest=/data/photo mode=644 backup=yes'
4、file 設置文件屬性:
創建目錄:-a “path= state=directory”
創建鏈接文件:-a “path= src= state=link”
刪除文件:-a “path= state=absent”
參數使用:
force:需要在兩種情況下強制創建軟鏈接,一種是源文件不存在,但之後會建立的情況下;另一種是目標軟鏈接已存在,需要先取消之前的軟鏈,然後創建新的軟鏈,有兩個選項:yes|no代表是否強制創建
group:定義文件/目錄的屬組
mode:定義文件/目錄的權限
owner:定義文件/目錄的屬主
path:必選項,定義文件/目錄的路徑
recurse:遞歸設置文件的屬性,只對目錄有效
src:被鏈接的源文件路徑,只應用於state=link的情況
dest:被鏈接到的路徑,只應用於state=link的情況
state:
directory:如果目錄不存在,就創建目錄
file:即使文件不存在,也不會被創建
link:創建軟鏈接
hard:創建硬鏈接
touch:如果文件不存在,則會創建一個新的文件,如果文件或目錄已存在,則更新其最後修改時間
absent:刪除目錄、文件或者取消鏈接文件
示例:
ansible web -m file -a 'path=/data/webapp state=directory' 創建目錄
ansible web -m file -a 'path=/data/webapp state=absent' 刪除目錄
ansible web -m file -a 'path=/data/img src=/data/photo state=link' 創建軟鏈接
ansible web -m file -a 'dest=/data/img2 src=/data/photo state=link' 創建軟鏈接
ansible web -m file -a 'path=/data/haha state=touch' 創建文件
5、fetch 從遠程某主機獲取文件到本地:
dest:用來存放文件的目錄
例如存放目錄為backup,源文件名稱為/etc/profile,在主機pythonserver中,那麽保存為/backup/pythonserver/etc/profile
Src:在遠程拉取的文件,並且必須是一個file,不能是目錄
示例:
ansible web -m fetch -a 'src=/data/photo dest=/data/photo'
6、cron 管理cron計劃任務:
-a “”: 設置管理節點生成定時任務
action:
cron backup= # 如果設置,則根據其值(yes|no)確定是否創建一個crontab備份
cron_file= #如果指定, 使用這個文件cron.d,而不是單個用戶
day= #應該運行的工作日( 1-31, *, */2)
hour= # 小時 ( 0-23, *, */2 )
minute= #分鐘( 0-59, *, */2 )
month= # 月( 1-12, *, /2 )
weekday # 周 ( 0-6 for Sunday-Saturday,, )
job= #指明運行的命令是什麽
name= #定時任務描述
reboot # 任務在重啟時運行,不建議使用,建議使用special_time
special_time #特殊的時間範圍,參數:reboot(重啟時),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小時)
state #指定狀態,present表示添加定時任務,也是默認設置。absent 表示刪除定時任務
user # 以哪個用戶的身份執行
示例:每天同步一次時間:
ansible web -m cron -a 'name="ntp" special_time=daily job="/sbin/ntpdate 172.17.0.1 &>/dev/null"'
每五分鐘同步一次時間:
ansible web -m cron -a 'name="ntp update" minute="*/5" job="/sbin/ntpdate 172.17.0.1 &>/dev/null"'
在web主機組對應的主機查看計劃任務
ansible web -m cron -a 'name="ntp update" minute="*/5" job="/sbin/ntpdate 172.17.0.1 &>/dev/null" state=absent' 刪除計劃任務
7、yum 安裝軟件
conf_file #設定遠程yum安裝時所依賴的配置文件。
disable_gpg_check #是否禁止GPG checking,只用於`present‘ or `latest’。
disablerepo #臨時禁止使用yum庫。 只用於安裝或更新時。
enablerepo #臨時使用的yum庫。只用於安裝或更新時。
name= #所安裝的包的名稱,可以是軟件,也可以是rpm包
state= #present安裝, latest安裝最新的, absent 卸載軟件。
update_cache #強制更新yum的緩存。
示例:
ansible web -m yum -a 'name=htop state=present disable_gpg_check=yes' 安裝htop
ansible web -m yum -a 'name=htop state=absent disable_gpg_check=yes' 卸載htop
8、service: 服務程序管理
arguments #命令行提供額外的參數
enabled #設置開機啟動,true|false,yes|no
name= #服務名稱
runlevel #開機啟動的級別,一般不用指定。
sleep #在重啟服務的過程中,是否等待。如sleep 2在服務關閉以後等待2秒再啟動。
state #started啟動服務, stopped停止服務, restarted重啟服務, reloaded重載配置
示例:啟動nginx服務並設置開機自啟動:
ansible web -m service -a 'name=nginx state=started enabled=true'
重啟nginx服務,在服務關閉兩秒後再啟動:
ansible web -m service -a 'name=nginx state=restarted sleep=2s'
9、user 用戶模塊,管理用戶帳號action: user
comment # 用戶的描述信息
createhome # 是否創建家目錄
force # 在使用state=absent時, 行為與userdel force一致.
group # 指定基本組
groups # 指定附加組,如果指定為(groups=)表示刪除所有組
home # 指定用戶家目錄
move_home # 如果設置為home=時, 試圖將用戶主目錄移動到指定的目錄
name # 指定用戶名
non_unique # 該選項允許改變非唯一的用戶ID值
password # 指定用戶密碼.指定完之後使用openssh加密,將加密密碼寫進/etc/shadow
remove # 在使用state=absent時, 行為與userdel remove一致
shell # 指定默認shell
state # 設置帳號狀態,不指定為創建,指定值為absent表示刪除
system # 當創建一個用戶,設置這個用戶是系統用戶。這個設置不能更改現有用戶
uid # 指定用戶的uid
示例:創建用戶tom,密碼123456,uid1066,默認shell為/bin/bash
ansible web -m user -a 'name=tom password=123456 uid=1066 shell=/bin/bash'
創建用戶tom並指明uid,主組,附加組,默認shell,家目錄
ansible web -m user -a 'name=tom comment="tom is tom" uid=1066 group=tom groups=wheel
shell=/bin/zshell home=/home/tomhome'
10、group 用戶組模塊,添加或刪除組
action: group
gid # 設置組的GID號
name= # 管理組的名稱
state # 指定組狀態,默認為創建,設置值為absent為刪除
system # 設置值為yes,表示為創建系統組
示例:創建名為tom的組
ansible web -m group -a 'name=tom state=present'
11、script 在指定節點運行服務端的腳本
vim test.sh
#/bin/bash
touch /tmp/test.sh.log
echo “hello” >> /tmp/test.sh.log
加執行權限:chmod +x test.sh
執行:ansible web -m script -a ‘/root/test.sh’
查看效果:ansible web -m shell -a ‘cat /tmp/test.sh.log’
12、setup模塊
facts組件是Ansible用於采集被管機器設備信息的一個功能,我們可以使用setup模塊查機器的所有facts信息,可以使用filter來查看指定信息。整個facts信息被包裝在一個JSON格式的數據結構中,ansible_facts是最上層的值。
facts就是變量,內建變量 。每個主機的各種信息,cpu顆數、內存大小等。會存在facts中的某個變量中。調用後返回很多對應主機的信息,在後面的操作中可以根據不同的信息來做不同的操作。如redhat系列用yum安裝,而debian系列用apt來安裝軟件。
setup模塊,主要用於獲取主機信息,在playbooks裏經常會用到的一個參數gather_facts就與該模塊相關。setup模塊下經常使用的一個參數是filter參數。
示例:
ansible web -m setup 獲取web主機組裏主機的所有信息
ansible web -m setup -a 'filter=ansible_*_mb' //查看主機內存信息
ansible web -m setup -a 'filter=ansible_eth[0-2]' //查看接口為eth0-2的網卡信息
ansible all -m setup --tree /tmp/facts //將所有主機的信息輸入到/tmp/facts目錄下,每臺主機的信息輸入到對應主機名文件中(/etc/ansible/hosts裏的主機名)
項目總結:
以上都是命令行式的操作,操作比較繁瑣,而且不容易排錯與維護,所以我們可以使用Ansible playbook來實現。具體用法參看博客:
運維自動化之ansible