有pc網(wǎng)站 移動網(wǎng)站怎么做關(guān)鍵詞怎么找出來
目錄
一、ansible是什么?
二、ansible的特點?
三、ansible與其他運維工具的對比
四、ansible的環(huán)境部署
第一步:配置主機清單
第二步:完成密鑰對免密登錄
五、ansible基于命令行完成常用的模塊學(xué)習(xí)
模塊1:command模塊
模塊2:shell模塊
模塊3:cron模塊
模塊4:user模塊
模塊5:group模塊
模塊6:copy模塊
模塊7:file模塊
模塊8:hostname模塊
模塊9:ping模塊
模塊10:yum/apt模塊
模塊11:service/systemd模塊
模塊12:script模塊
模塊13:mount模塊
模塊14:archive模塊
模塊15:unarchive模塊
模塊16:replace模塊
模塊17:setup模塊
六、inventory 主機清單
一、ansible是什么?
Ansible是一個基于Python開發(fā)的配置管理和應(yīng)用部署工具,現(xiàn)在也在自動化管理領(lǐng)域大放異彩。它融合了眾多老牌運維工具的優(yōu)點,Pubbet和Saltstack能實現(xiàn)的功能,Ansible基本上都可以實現(xiàn)。
Ansible能批量配置、部署、管理上千臺主機。比如以前需要切換到每個主機上執(zhí)行的一或多個操作,使用Ansible只需在固定的一臺Ansible控制節(jié)點上去完成所有主機的操作。
二、ansible的特點?
(1)、Ansible是基于模塊工作的,它只是提供了一種運行框架,它本身沒有完成任務(wù)的能力,真正執(zhí)行操作的是Ansible的模塊, 比如copy模塊用于拷貝文件到遠(yuǎn)程主機上,service模塊用于管理服務(wù)的啟動、停止、重啟等。
(2)、Ansible其中一個比較鮮明的特性是Agentless,即無Agent的存在,它就像普通命令一樣,并非C/S軟件,也只需在某個作為控制節(jié)點的主機上安裝一次Ansible即可。
(3)、ansible通?;?span style="color:#fe2c24;">ssh連接來控制遠(yuǎn)程主機,遠(yuǎn)程主機上不需要安裝Ansible或其它額外的服務(wù)。
使用者在使用時,在服務(wù)器終端輸入命令或者playbooks,會通過預(yù)定好的規(guī)則將playbook拆解為play,再組織成ansible可以識別的任務(wù),調(diào)用模塊和插件,根據(jù)主機清單通過SSH將 臨時文件發(fā)給遠(yuǎn)程的客戶端執(zhí)行并返回結(jié)果,執(zhí)行結(jié)束后自動刪除
(4)、Ansible的另一個比較鮮明的特性是它的絕大多數(shù)模塊都具備冪等性(idempotence)。所謂冪等性,指的是無論執(zhí)行多少次同樣的運算,結(jié)果都是相同的,即一條命令,任意多次執(zhí)行所產(chǎn)生的影響均與一次執(zhí)行的影響相同。比如執(zhí)行 systemctl stop xxx 命令來停止服務(wù),當(dāng)發(fā)現(xiàn)要停止的目標(biāo)服務(wù)已經(jīng)處于停止?fàn)顟B(tài),它什么也不會做, 所以多次停止的結(jié)果仍然是停止,不會改變結(jié)果,它是冪等的,而 systemctl restart xxx 是非冪等的。
Ansible的很多模塊在執(zhí)行時都會先判斷目標(biāo)節(jié)點是否要執(zhí)行任務(wù),所以,可以放心大膽地讓Ansible去執(zhí)行任務(wù),重復(fù)執(zhí)行某個任務(wù)絕大多數(shù)時候不會產(chǎn)生任何副作用。
三、ansible與其他運維工具的對比
四、ansible的環(huán)境部署
ansible的安裝非常的簡單,只需要在控制節(jié)點安裝ansible服務(wù)即可
//管理端安裝 ansible
yum install -y epel-release //先安裝 epel 源
yum install -y ansible
//ansible 目錄結(jié)構(gòu)
/etc/ansible/
├── ansible.cfg #ansible的配置文件,一般無需修改
├── hosts #ansible的主機清單,用于存儲需要管理的遠(yuǎn)程主機的相關(guān)信息
└── roles/ #公共角色目錄
準(zhǔn)備實驗環(huán)境
管理端:192.168.20.15 ansible
被管理端
webserver:192.168.20.12 192.168.20.17
dbserver:192.168.20.16
第一步:配置主機清單
//配置主機清單
cd /etc/ansible
vim hosts
[webservers] #配置組名
192.168.20.12 #組里包含的被管理的主機IP地址或主機名(主機名需要先修改/etc/hosts文件)
192.168.20.17[dbservers]
192.168.20.16
第二步:完成密鑰對免密登錄
//配置密鑰對驗證
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsasshpass -p "123" ssh-copy-id -o StrictHostKeyChecking=no root@192.168.20.17
sshpass -p "123" ssh-copy-id -o StrictHostKeyChecking=no root@192.168.20.12
sshpass -p "123" ssh-copy-id -o StrictHostKeyChecking=no root@192.168.20.16
五、ansible基于命令行完成常用的模塊學(xué)習(xí)
命令格式:ansible <主機組名> -m <模塊名> -a '模塊參數(shù)'
ansible-doc -l #列出所有已安裝的模塊,按q退出
ansible-doc -l|wc -l #查看有多少模塊
模塊1:command模塊
command模塊是ansible的默認(rèn)模塊,在遠(yuǎn)程主機執(zhí)行命令,不支持管道,重定向等shell的特性。(ansible.cfg配置文件定義的)
查看模塊的參數(shù)
ansible-doc -s command #-s 列出指定模塊的描述信息和操作動作
ansible 192.168.20.17 -m command -a 'date' #指定 ip 執(zhí)行 date
ansible webservers -m command -a 'date' #指定組執(zhí)行 date
ansible dbservers -m command -a 'date'
ansible all -m command -a 'date' #all 代表所有 hosts 主機
ansible all -a 'ls /' #如省略 -m 模塊,則默認(rèn)運行 command 模塊//常用的參數(shù):
chdir:在遠(yuǎn)程主機上運行命令前提前進(jìn)入目錄
creates:判斷指定文件是否存在,如果存在,不執(zhí)行后面的操作
removes:判斷指定文件是否存在,如果存在,執(zhí)行后面的操作ansible all -m command -a "chdir=/home ls ./"
chdir:在遠(yuǎn)程主機上運行命令的前提進(jìn)入目錄
creates: 判斷指定文件是否存在 如果存在 不執(zhí)行后面的操作
removes: 判斷指定文件知否存在 如果存在 執(zhí)行后面的操作
模塊2:shell模塊
支持管道符號等功能
在遠(yuǎn)程主機執(zhí)行命令,相當(dāng)于調(diào)用遠(yuǎn)程主機的shell進(jìn)程,然后在該shell下打開一個子shell運行命令(支持管道符號等功能)
ansible-doc -s shell
?
chdir:在遠(yuǎn)程主機上運行命令的前提進(jìn)入目錄
creates: 判斷指定文件是否存在 如果存在 不執(zhí)行后面的操作
removes: 判斷指定文件知否存在 如果存在 執(zhí)行后面的操作
creates 判斷
?removes判斷
模塊3:cron模塊
在遠(yuǎn)程主機定義任務(wù)計劃。其中有兩種狀態(tài)(state):present表示添加(可以省略),absent表示移除。
ansible-doc -s cron #查看模塊常用的參數(shù)有哪些
//常用的參數(shù):
minute/hour/day/month/weekday:分/時/日/月/周
job:任務(wù)計劃要執(zhí)行的命令
name:任務(wù)計劃的名稱
user:指定計劃任務(wù)屬于哪個用戶,默認(rèn)是root用戶
?假設(shè)??每周二的兩點半去備份系統(tǒng)的日志
[root@localhost ansible]#ansible all -m cron -a "minute=30 hour=2 weekday=2 job='/bin/cp -f /var/log/messages /opt/' name="backup_log""
每2個月的10號的早上晚上10點都完成一次系統(tǒng)日志的備份
想要刪除計劃性任務(wù)?
cron 在遠(yuǎn)程主機設(shè)置crontab計劃任務(wù) minute hour day month weekday job name state=present|absent
cron 在遠(yuǎn)程主機設(shè)置crontab計劃任務(wù)
minute hour day month weekday job name state=present|absent
模塊4:user模塊
//用戶管理的模塊
ansible-doc -s user
常用的參數(shù)有:
name: 表示用戶名 必選的參數(shù)
state=present 或 absent 表示創(chuàng)建賬號或者刪除賬號 present表示創(chuàng)建 absent表示刪除
system=yes或no 表示是否為系統(tǒng)賬號
uid:表示用戶uid
group:用戶基本組
groups:用戶附加組
shell:默認(rèn)的shell
create_home=yes或no 表示是否創(chuàng)建家目錄
password 用戶的密碼 建議使用加密后的字符串
remove為yes或no 當(dāng)state為absent的時候? 是否刪除用戶的家目錄?
ansible dbservers -m user -a 'name="test01"' #創(chuàng)建用戶test01
ansible dbservers -m command -a 'tail /etc/passwd'
ansible dbservers -m user -a 'name="test01" state=absent' #刪除用戶test01
[root@localhost ansible]#ansible dbservers -m user -a 'name=nginx create_home=no shell=/sbin/nologin'
#創(chuàng)建nginx用戶 并不創(chuàng)建家目錄 以及shell類型為不登陸[root@localhost ansible]#ansible dbservers -m user -a 'name=lisi groups=wheel uid=1008'
#創(chuàng)建lisi用戶 其uid為1008 加入wheel組中
[root@localhost ansible]#ansible dbservers -m user -a 'name=zhangsan password=123456'
user 在遠(yuǎn)程主機設(shè)管理用戶賬戶 name uid group groups shell create_home remove state=present|absent
模塊5:group模塊
//用戶組管理的模塊
ansible-doc -s group
ansible dbservers -m group -a 'name=mysql gid=306 system=yes' #創(chuàng)建mysql組
ansible dbservers -a 'tail /etc/group'
ansible dbservers -m user -a 'name=test01 uid=306 system=yes group=mysql' #將test01用戶添加到mysql組中
ansible dbservers -a 'tail /etc/passwd'
ansible dbservers -a 'id test01'
模塊6:copy模塊
將ansible主機的文件/目錄/內(nèi)容復(fù)制到遠(yuǎn)程主機
dest:指出復(fù)制文件的目標(biāo)及位置,使用絕對路徑,如果源是目錄,指目標(biāo)也要是目錄,如果目標(biāo)文件已經(jīng)存在會覆蓋原有的內(nèi)容
src:指出源文件的路徑,可以使用相對路徑或絕對路徑,支持直接指定目錄,如果源是目錄則目標(biāo)也要是目錄
mode:指出復(fù)制時,目標(biāo)文件的權(quán)限?
owner:指出復(fù)制時,目標(biāo)文件的屬主
group:指出復(fù)制時,目標(biāo)文件的屬組
content:指出復(fù)制到目標(biāo)主機上的內(nèi)容,不能與src一起使用
在ansible主機上準(zhǔn)備了nginx.service文件,將其復(fù)制到遠(yuǎn)程主機的opt目錄中
[root@localhost ansible]#ansible webservers -m copy -a 'src=nginx.service dest=/opt/nginx.service mode=777 owner=xueyin'
[root@localhost ansible]#ansible dbservers -m copy -a 'content="helloworld" dest=/opt/hello.txt'
?
[root@localhost ansible]#ansible dbservers -m copy -a 'src=/etc/yum.repos.d/ dest=/opt/rh'
?
模塊7:file模塊
在遠(yuǎn)程主機管理文件/目錄,比如修改文件的權(quán)限? 創(chuàng)建空目錄 空文件 或者創(chuàng)建軟連接等
[root@localhost ansible]#ansible dbservers -m file -a 'path=/opt/hello.txt mode=777 owner=xueyin'
?給遠(yuǎn)程主機創(chuàng)建一個軟連接文件
?給遠(yuǎn)程主機創(chuàng)建一個空文件? 或者一個空目錄
?刪除遠(yuǎn)程主機上的某個文件或者目錄
模塊8:hostname模塊
?在遠(yuǎn)程主機設(shè)置主機名
//用于管理遠(yuǎn)程主機上的主機名
ansible dbservers -m hostname -a "name=mysql01"
?
模塊9:ping模塊
//檢測遠(yuǎn)程主機的連通性
ansible all -m ping
ping可以快速檢測與目標(biāo)主機的連通性
模塊10:yum/apt模塊
在遠(yuǎn)程主機上安裝與卸載軟件包
ansible-doc -s yum
在遠(yuǎn)程主機使用yum|apt-get管理軟件包
常用的參數(shù):
name:指定服務(wù)的名稱
state=present|absent|latest present表示當(dāng)前,absent表示刪除 卸載 latest表示最新
模塊11:service/systemd模塊
service|systemd ? ?在遠(yuǎn)程主機使用systemctl管理服務(wù)狀態(tài) ? ?
name:被管理的服務(wù)名稱
state=started|stopped|restarted|reloaded? 指定服務(wù)的狀態(tài),動作包含啟動關(guān)閉或者重啟
enabled=yes|no|true|false? 指定開機是否自啟
runlevel:如果設(shè)定了enabled開機自啟去,則要定義在哪些運行目標(biāo)下自啟動
模塊12:script模塊
在遠(yuǎn)程主機執(zhí)行ansible主機上的shell腳本
[root@localhost ansible]#ansible webservers -m script -a 'test.sh xueyin'
?支持位置變量,ansible主機上的腳本在遠(yuǎn)程主機上執(zhí)行
模塊13:mount模塊
掛載文件系統(tǒng)
?//常用的參數(shù):
src:定義掛載設(shè)備的路徑
path:定義掛載到哪個目錄,必須指定
fstype:指定掛載文件的系統(tǒng)類型,必須指定,xfs、iso9660、nfs...
opts:定義掛載的參數(shù),defaults、rw、ro...
state:定義掛載的狀態(tài),mounted(進(jìn)行掛載,修改/etc/fstab信息)、absent(永久性卸載,并修改 /etc/fstab信息)、unmounted(臨時卸載,不修改/etc/fstab信息)
比如掛載光盤鏡像
?比如創(chuàng)建一個新的硬盤掛載到/data空目錄下
?
在這個基礎(chǔ)上完成接掛載
?永久解掛載
模塊14:archive模塊
//打包壓縮
ansible-doc -s archive
//常用的參數(shù):
path: 必須參數(shù),遠(yuǎn)程主機上需要被打包壓縮的源文件/目錄
dest: 打包壓縮后的包文件路徑(包文件的父目錄必須存在);如果包文件已存在,則會被覆蓋
format: 指定壓縮類型,包括: bz2、gz(默認(rèn))、tar、xz、zip
remove=yes|no: 是否刪除源文件
假設(shè)需要通過ansible完成本地yum倉庫? 那么需要先把yum在線源打包壓縮?
?
注意:
該模塊的path支持通配符 如使用*.repo
該模塊下如果是想要打包多個文件? 那么需要每個文件寫絕對路徑用逗號隔開?
模塊15:unarchive模塊
解包解壓縮
常用的參數(shù):
copy:默認(rèn)為 copy=yes ,拷貝的文件從 ansible 主機復(fù)制到遠(yuǎn)程主機(也就是說默認(rèn)是從ansible主機解壓文件到遠(yuǎn)程主機),copy=no 表示在遠(yuǎn)程主機上尋找源文件解壓
src:tar包源路徑,可以是 ansible ?主機上的路徑,也可以是遠(yuǎn)程主機上的路徑,如果是遠(yuǎn)程主機上的路徑,則需設(shè)置 copy=no
dest:解壓后文件的目標(biāo)絕對路徑
remote_src: 和 copy 功能一樣且互斥,設(shè)置 remote_src=yes 表示文件在遠(yuǎn)程主機上,設(shè)置為 remote_src=no 表示文件在 ansible 主機上
?將 ansible 主機的壓縮文件拷貝到到遠(yuǎn)程主機并解壓
[root@localhost ansible]#ansible webservers -m unarchive -a 'copy=yes src=/etc/ansible/nginx-1.24.0.tar.gz dest=/opt/'
或者
[root@localhost ansible]#ansible webservers -m unarchive -a 'remote_src=no src=/etc/ansible/nginx-1.24.0.tar.gz dest=/opt/'
模塊16:replace模塊
//類似于sed命令,主要也是基于正則進(jìn)行匹配和替換
ansible-doc -s replace
//常用的參數(shù):
path:必須參數(shù),指定要修改的文件
regexp:必須參數(shù),指定一個正則表達(dá)式
replace:替換regexp參數(shù)匹配到的字符串
backup=yes|no: 修改源文件前創(chuàng)建一個包含時間戳信息的備份文件
before:如果指定,則僅替換/刪除此匹配之前的內(nèi)容,可以和after參數(shù)結(jié)合使用
after:如果指定,則僅替換/刪除此匹配之后的內(nèi)容,可以和before參數(shù)結(jié)合使用
owner:修改文件用戶名
group:修改文件組名
mode:修改文件權(quán)限
#匹配 333 并修改為 ccc
ansible dbservers -m replace -a "path=/opt/test.txt regexp='33' replace='cc'"
#匹配到任意一個或多個開頭的行增加注釋
ansible dbservers -m replace -a "path=/opt/test.txt regexp='^(.*)' replace='#\1'"
#取消注釋
ansible dbservers -m replace -a "path=/opt/test.txt regexp='^#(.*)' replace='\1'"
#匹配以 a 開頭的后面有一個或者多個字符的行,并在前面添加 # 注釋
ansible dbservers -m replace -a "path=/opt/test.txt regexp='^(a.*)' replace='#\1'"
模塊17:setup模塊
//facts 組件是用來收集被管理節(jié)點信息的,使用 setup 模塊可以獲取這些信息
ansible-doc -s setup
ansible webservers -m setup?? ??? ??? ??? ?#獲取mysql組主機的facts信息
ansible dbservers -m setup -a 'filter=*ipv4' ? ?#使用filter可以篩選指定的facts信息
六、inventory 主機清單
//Inventory支持對主機進(jìn)行分組,每個組內(nèi)可以定義多個主機,每個主機都可以定義在任何一個或多個主機組內(nèi)。
//如果是名稱類似的主機,可以使用列表的方式標(biāo)識各個主機。
vim /etc/ansible/hosts
[webservers]
192.168.20.11:2222?? ??? ?#冒號后定義遠(yuǎn)程連接端口,默認(rèn)是 ssh 的 22 端口
192.168.20.1[2:5]
[dbservers]
db-[a:f].example.org?? ?#支持匹配 a~f
//inventory 中的變量
Inventory變量名?? ? ? ? ? ? ? ? ?含義
ansible_host ? ? ? ? ? ? ? ? ?ansible連接節(jié)點時的IP地址
ansible_port ? ? ? ? ? ? ? ? ?連接對方的端口號,ssh連接時默認(rèn)為22
ansible_user ? ? ? ? ? ? ? ? ?連接對方主機時使用的用戶名。不指定時,將使用執(zhí)行ansible或ansible-playbook命令的用戶
ansible_password ? ? ? ? ? ? ?連接時的用戶的ssh密碼,僅在未使用密鑰對驗證的情況下有效
ansible_ssh_private_key_file ?指定密鑰認(rèn)證ssh連接時的私鑰文件
ansible_ssh_common_args ? ? ? 提供給ssh、sftp、scp命令的額外參數(shù)
ansible_become ? ? ? ? ? ? ? ?允許進(jìn)行權(quán)限提升
ansible_become_method ? ? ? ? 指定提升權(quán)限的方式,例如可使用sudo/su/runas等方式
ansible_become_user ? ? ? ? ? 提升為哪個用戶的權(quán)限,默認(rèn)提升為root
ansible_become_password ? ? ? 提升為指定用戶權(quán)限時的密碼
(1)主機變量(橫向表示)
[webservers]
192.168.20.11 ansible_port=22 ansible_user=root ansible_password=abc1234
(2)組變量(縱向表示)
[webservers:vars]?? ??? ??? ?#表示為 webservers 組內(nèi)所有主機定義變量
ansible_user=root
ansible_password=abc1234
[all:vars]?? ??? ??? ??? ??? ?#表示為所有組內(nèi)的所有主機定義變量
ansible_port=22
(3)組嵌套
[nginx]
192.168.20.20
192.168.20.21
192.168.20.22
[apache]
192.168.20.3[0:3]
[webs:children]?? ??? ?#表示為 webs 主機組中包含了 nginx 組和 apache 組內(nèi)的所有主機
nginx
apache