溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ansible--基礎(chǔ)

發(fā)布時(shí)間:2020-07-22 15:25:43 來(lái)源:網(wǎng)絡(luò) 閱讀:939 作者:Gavin7216 欄目:MySQL數(shù)據(jù)庫(kù)

馬哥出品 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


向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI