您好,登錄后才能下訂單哦!
馬哥出品 ansible中文文檔:http://www.ansible.com.cn/index.html
ansible介紹:
ansible是個(gè)什么東西呢?官方的title是“Ansible is Simple IT Automation”——簡(jiǎn)單的自動(dòng)化IT運(yùn)維管理工具。這個(gè)工具的目標(biāo)有這么幾項(xiàng):讓我們自動(dòng)化部署APP;自動(dòng)化管理配置項(xiàng);自動(dòng)化的持續(xù)交付;自動(dòng)化的(AWS)云服務(wù)管理?;赑ython開(kāi)發(fā),可實(shí)現(xiàn)對(duì)多臺(tái)服務(wù)器進(jìn)行批量配置、程序的部署及指令的運(yùn)行。大大減少了在運(yùn)維工程中的工作量。
ansible是基于模塊工作的,本身沒(méi)有批量部署的能力。真正具有批量部署的是ansible所運(yùn)行的模塊,ansible只是提供一種框架。主要包括:
(1)、連接插件connection plugins:負(fù)責(zé)和被監(jiān)控端實(shí)現(xiàn)通信;
(2)、host inventory:指定操作的主機(jī),是一個(gè)配置文件里面定義監(jiān)控的主機(jī);
(3)、各種模塊核心模塊、command模塊、自定義模塊;
(4)、借助于插件完成記錄日志郵件等功能;
(5)、playbook:劇本執(zhí)行多個(gè)任務(wù)時(shí),非必需可以讓節(jié)點(diǎn)一次性運(yùn)行多個(gè)任務(wù)。
ansible特點(diǎn):
1.簡(jiǎn)單,ansible自然的自動(dòng)化語(yǔ)言與允許運(yùn)維人員,開(kāi)發(fā)者,和IT管理人員在很短的時(shí)間內(nèi)完成自動(dòng)化項(xiàng)目。
2.無(wú)代理,默認(rèn)使用SSH而不需要客戶端。避免了額外的端口開(kāi)啟,提高安全性,避免不必要的管理,減少CPU的使用
3.干的活多,ansible能干自動(dòng)完成軟件部署,配置管理,流程化管理,和cloud provisioning。
ansible安裝:
由于ansible是用python開(kāi)發(fā)的,安裝過(guò)程中依賴(lài)眾多python模塊,這里建議yum安裝ansible,想要更新版本的可下載源碼編譯安裝,
yum install ansible -y
yum安裝ansible的默認(rèn)配置文件路徑,ansible.cfg是ansible的主配置文件,
ansible]# ls /etc/ansible/
ansible.cfg hosts roles
hosts是默認(rèn)的hostfile路徑,可配置DNS域名,ip。
通過(guò)ssh key方式連接遠(yuǎn)端客戶機(jī),省去密碼環(huán)節(jié)
ssh-keygen -t rsa -P ''
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.137.130
注意這個(gè)地方是有個(gè)坑的,由于ansible執(zhí)行的時(shí)候需要把臨時(shí)模塊拷貝到客戶端,而默認(rèn)的拷貝方式是通過(guò)sftp來(lái)的方式拷貝的,如果你的客戶端沒(méi)有裝sftp,那么執(zhí)行ansible會(huì)出錯(cuò)的。
如果沒(méi)裝sftp可以用scp。 下面的這一行本來(lái)是注釋起來(lái)的,把注釋去掉就OK了
ansible]# grep "scp_if_ssh" /etc/ansible/ansible.cfg
scp_if_ssh = True
還有個(gè)坑,即使裝了sftp也不一定能用,你的ssh要啟用它才OK。
ansible]# grep "Subsystem" /etc/ssh/sshd_config
Subsystem sftp /usr/lib/openssh/sftp-server
ansible的基本工作流程:
1.ansible通過(guò)OPENSSH或者python的pramamiko連接客戶端
2.把a(bǔ)nsible module推送到客戶端。
ansible]# grep "remote_tmp" /etc/ansible/ansible.cfg
remote_tmp = $HOME/.ansible/tmp
ansible]# ansible one -a "ls ~/.ansible"
salt-master | success | rc=0 >>
tmp
3.通過(guò)ssh執(zhí)行客戶端上的ansible module
4.執(zhí)行完畢
5.刪除剛剛推送過(guò)去的ansible module
ansible基本命令行模塊:
ansible-doc -s 模塊名 ##查看模塊用法幫助
ansible-doc -l ##查看有哪些可用模塊
1.臨時(shí)做小事情或一次性行為可用命令行,大型或經(jīng)常重復(fù)使用的活用play-book
2.命令行三劍客:command(默認(rèn)),shell(支持管道,變量,),raw(客戶機(jī)不能裝python時(shí)使用)
3.官方建議用command,shell和raw需要用到的時(shí)候再用
command:命令模塊,默認(rèn)模塊,用于遠(yuǎn)程執(zhí)行命令
-a 'COMMAND'
ansible]# grep -n "module_name" ansible.cfg
97:#module_name = command
ansible all -a 'date'
user:
-a 'name= state={present|absent} system= uid='
# ansible one -m user -a 'name=mysql uid=306 system=yes group=mysql'
# ansible one -m user -a 'name=mysql shell=/sbin/nologin createhome=no'
group:
-a 'name= gid= state= system='
# ansible one -m group -a 'name=mysql gid=306 system=yes'
cron:修改定時(shí)任務(wù)
-a 'name="" minute= hour= day= month= weekday= job= user= state='
state狀態(tài)
present:增加
absent:刪除,配置name就可移除
# ansible one -m cron -a 'minute="*/10" job="/bin/echo hello" name="test cron job"'
copy:復(fù)制文件到遠(yuǎn)程主機(jī)
-a 'dest= src= mode= owner= group='
src=:定義本地源文件路徑
dest=:定義遠(yuǎn)程目標(biāo)文件路徑
content=:取代src=,表示直接用此處指定的信息生成目標(biāo)文件內(nèi)容;
# ansible all -m copy -a 'src=/etc/fstab dest=/tmp/fstab.ansible owner=/root mode=640'
# ansible all -m copy -a 'content="Hello Ansible\nHi MageEdu" dest=/tmp/test.ansible'
file:設(shè)定文件屬性
-a 'path= mode= owner= group= state={directory|link|present|absent} src='
path=:指定文件路徑,可以使用name或dest來(lái)替換
創(chuàng)建文件的符號(hào)鏈接
src=:指明源文件
path=:指明符號(hào)鏈接文件路徑
# ansible all -m file -a 'path=/tmp/fstab.link src=/tmp/fstab.ansible state=link'
# ansible all -m file -a "path=/tmp/resolv.conf state=absent"
# ansible salt-master -m file -a 'dest=/tmp/ansible.log owner=lixc group=lixc mode=644
state=touch' #touch:遠(yuǎn)程主機(jī)創(chuàng)建文件
force:需要在兩種情況下強(qiáng)制創(chuàng)建軟鏈接,
一種是源文件不存在,但之后會(huì)建立的情況下;
另一種是目標(biāo)軟鏈接已存在,需要先取消之前的軟鏈,然后創(chuàng)建新的軟鏈,有兩個(gè)選項(xiàng):yes|no
group:定義文件/目錄的屬組
mode:定義文件/目錄的權(quán)限
owner:定義文件/目錄的屬主
path:必選項(xiàng),定義文件/目錄的路徑
recurse:遞歸設(shè)置文件的屬性,只對(duì)目錄有效
src:被鏈接的源文件路徑,只應(yīng)用于state=link的情況
dest:被鏈接到的路徑,只應(yīng)用于state=link的情況
state:
directory:創(chuàng)建遞歸文件,如果目錄不存在,就創(chuàng)建目錄,
file:即使文件不存在,也不會(huì)被創(chuàng)建
link:創(chuàng)建軟鏈接
hard:創(chuàng)建硬鏈接
touch:如果文件不存在,則創(chuàng)建一個(gè)新的文件,如果文件或目錄已存在,則更新其最后修改時(shí)間
absent:刪除目錄、文件或者取消鏈接文件
ping:測(cè)試指定主機(jī)能否連接
yum:安裝程序包
-a 'name= state={present|latest|absent}'
name:指明要安裝的程序包,可以帶上版本號(hào)
state=:present,latest表示安裝,absent表示卸載
# ansible one -m yum -a 'name=mysql-server state=latest|installed'
還有一個(gè)后臺(tái)執(zhí)行的功能。
-B 30是設(shè)置后臺(tái)執(zhí)行時(shí)間為30秒,
-P2是沒(méi)兩秒鐘報(bào)告一次狀態(tài),這個(gè)當(dāng)你的任務(wù)要執(zhí)行很長(zhǎng)時(shí)間的時(shí)候可以用。
# ansible one -m yum -a 'name=apache2 state=installed' -B 30 -P2 >>/dev/null
service:指定運(yùn)行狀態(tài)
-a 'name= state={started|stopped|restarted} enabled='
name=:服務(wù)名稱(chēng)
state=:狀態(tài),取值有started,stopped,restarted
enabled=:是否開(kāi)機(jī)自動(dòng)啟動(dòng),取值為true或者false
shell: ##可支持管道,變量,command模塊不支持,
例:echo "centos" |passwd --stdin centos
# ansible storm_cluster -m shell -a "/tmp/rocketzhang_test.sh"
script: ##將本地腳本復(fù)制到遠(yuǎn)程主機(jī)并運(yùn)行之;要使用相對(duì)路徑指定腳本
-a '/path/to/script'
setup: ##收集遠(yuǎn)程主機(jī)的facts
每個(gè)被管理節(jié)點(diǎn)在接收并運(yùn)行管理命令之前,會(huì)將自己主機(jī)相關(guān)信息,如操作系統(tǒng)版本,ip地址等報(bào)告給遠(yuǎn)程的ansible主機(jī)
Inventory的默認(rèn)路徑是在/etc/ansible/hosts,分為靜態(tài)和動(dòng)態(tài)兩種
靜態(tài):需要手工的把你要管理的主機(jī)寫(xiě)進(jìn)去。
動(dòng)態(tài):事先有一個(gè)資源管理系統(tǒng),里面有所有主機(jī)信息,用腳本程序把資源管理系統(tǒng)里的信息給拉過(guò)來(lái),以json格式呈現(xiàn)
配置靜態(tài)Inventory:
ansible]# cat -n /etc/ansible/hosts
1 [alltest:children]
2 salt
3 leihuo
4
5 [salt]
6 salt-master ansible_ssh_user=lixc ansible_ssh_pass=123456
7 10.240.162.112 ansible_connection=paramiko
8
9 [leihuo]
10 lixc ansible_ssh_host=192.168.131.203 ansible_ssh_port=21100
11 10.240.162.11[1:9]:22
第1行,alltest這個(gè)組包含倆子組分別是下面的salt,和leihuo
第6行可以設(shè)置主機(jī)的默認(rèn)連接用戶,及密碼
第7行可以設(shè)置ssh的連接方式,默認(rèn)是openssh,我這里用paramiko,不用官網(wǎng)推薦用openssh,因?yàn)閛penssh查詢(xún)key的時(shí)候,很耗時(shí),效率不高。
第10行,可以給主機(jī)隨便取個(gè)別名,這里的“l(fā)ixc”就是一個(gè)別名,如果ssh默認(rèn)端口不是22,這里可以
指定特定的端口,
指定ssh端口也可以像第11行,這么指定。
不過(guò)以上兩種指定ssh端口方法,只針對(duì)我們有少部分的主機(jī)是特殊端口,如果我們所有主機(jī)都是指定的端口,配置文件里有個(gè)選項(xiàng),改成我們需要的端口就OK了,修改后對(duì)全局有效
ansible]# grep "remote_port" /etc/ansible/ansible.cfg
remote_port = 22
第7行和11行,是倆相同的主機(jī),說(shuō)明同一主機(jī)可以在不同的組中。在現(xiàn)實(shí)當(dāng)中就像我一臺(tái)服務(wù)器即可以裝mysql也可以裝apache是一個(gè)道理。
變量:
ansible的變量主要給后面的playbook使用,分為主機(jī)變量和組變量
ansible]# cat -n /etc/ansible/hosts
1 [alltest:children]
2 salt
3 leihuo
4
5 [salt]
6 salt-master salt-port=4505 mysql-port=3306
7 10.240.162.112 salt-path=/usr/bin/salt-call
8
9 [leihuo]
10 lixc ansible_ssh_host=192.168.131.203 ansible_ssh_port=21100
11 10.240.162.11[1:9]:22
12 [alltest:vars]
13 ls-path=/bin/ls
14 liss=lisisi
6,7行設(shè)置主機(jī)變量
12-14行,設(shè)置的為alltest這個(gè)組的變量。組變量就是,我這個(gè)組的成員都可以用
當(dāng)然我們也可以不在/etc/ansible/hosts里面定義變量,也可以把變量寫(xiě)進(jìn)單獨(dú)的文件里,不過(guò)變量定義的形式就不是誰(shuí)=誰(shuí),這么個(gè)形式了。而是遵循yaml語(yǔ)法的key: value的形式。
把變量寫(xiě)進(jìn)文件:
ansible]# for dir in {host_vars,group_vars};do ls /etc/ansible/${dir};done
10.240.162.112 salt-master
alltest
文件定義格式:
ansible]# cat /etc/ansible/host_vars/salt-master
---
salt-port: 4505
mysql-port: 3306
ansible目標(biāo)主機(jī)匹配patterns:
匹配所有主機(jī)
*或者all
匹配多個(gè)組
salt:leihuo
在salt這個(gè)組里,但不能在leihuo這個(gè)組里的主機(jī)
salt:!leihuo
取兩個(gè)組的交集
salt:&leihuo
排除某一主機(jī)
ansible-playbook site.yaml --limit salt-msater
當(dāng)然也可以用正則,在/etc/ansible/hosts里面去定義。如
~salt(master|minion)\.li*\.com
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。