運(yùn)維工具的分類:
agent(有客戶端):puppet(重量級(jí)) func, ...
agentless(無(wú)客戶端ssh):ansible(輕量級(jí)), fabric
1.Ansible簡(jiǎn)介
Ansible是一個(gè)簡(jiǎn)單的自動(dòng)化運(yùn)維工具,可用于自動(dòng)化部署??梢宰詣?dòng)化部署應(yīng)用,配置等。
2.為什么選擇Ansible?
· Ansible完全基于Python開(kāi)發(fā),方便Ansible二次開(kāi)發(fā)
· 豐富的內(nèi)置模塊
· Ansible去中心化,一次簡(jiǎn)單的復(fù)制即可完成配置中心的遷移
· Ansible無(wú)客戶端只有主機(jī)端
· 底層基于OpenSSH
· 沒(méi)有額外的軟件包消耗系統(tǒng)性能
3.Ansible核心主要組件

Ansible:Ansible的核心程序
Host Lnventory:記錄了每一個(gè)由Ansible管理的主機(jī)信息,信息包括ssh端口,root帳號(hào)密碼,ip地址等等。可以通過(guò)file來(lái)加載,可以通過(guò)CMDB加載
Playbooks:YAML格式文件,多個(gè)任務(wù)定義在一個(gè)文件中,使用時(shí)可以統(tǒng)一調(diào)用,“劇本”用來(lái)定義那些主機(jī)需要調(diào)用那些模塊來(lái)完成的功能.
Core Modules:Ansible執(zhí)行任何管理任務(wù)都不是由Ansible自己完成,而是由核心模塊完成;Ansible管理主機(jī)之前,先調(diào)用core Modules中的模塊,然后指明管理Host Lnventory中的主機(jī),就可以完成管理主機(jī)。
Custom Modules:自定義模塊,完成Ansible核心模塊無(wú)法完成的功能,此模塊支持任何語(yǔ)言編寫(xiě)。
Connection Plugins:連接插件,Ansible和Host通信使用
4.Ansible執(zhí)行過(guò)程

5.Ansible目錄結(jié)構(gòu)介紹
? 配置文件目錄: /etc/ansible/
· ansible.cfg:自身配置文件
· hosts:資產(chǎn)清單
? 執(zhí)行文件目錄:/usr/bin/
? Lib庫(kù)依賴目錄: /usr/lib/pythonX.X/site-packages/ansible/
? Help文檔目錄:/usr/share/doc/ansible-X.X.X/
? Man文檔目錄:/usr/share/man/man1
? 插件目錄:/usr/share/ansible_plugins
6.工具集
Ansible命令執(zhí)行的方式有Ad-HOC、Ansible-playbook兩種方式
(1)ansible命令
主要運(yùn)用場(chǎng)景:
- 非固化需求
比如工作共臨時(shí)查看某個(gè)服務(wù)器是否存活
ansible一般用三種顏色來(lái)表示返回結(jié)果:
綠色:所有任務(wù)均正常執(zhí)行
紅色:執(zhí)行過(guò)程中有異常,一般會(huì)不執(zhí)行剩下所有的任務(wù)
橘黃色:執(zhí)行過(guò)程中沒(méi)有異常,但是結(jié)束后目標(biāo)有狀態(tài)的變化
臨時(shí)一次性操作
二次開(kāi)發(fā)調(diào)用接口
(2)ansible-galaxy
GitHub或PIP功能,通過(guò)ansible-galaxy命令,我們可以根據(jù)下載量和關(guān)注量等信息,查找和安裝優(yōu)秀的Role。下載地址為https://galaxy.ansible.com
ansible-galaxy命令分為三大部分:
1)[init|info|install|list|remove|login|import|delete|setup]等
? init:初始化本地的Roles配置,以備上傳Roles至galaxy
? info:列表指定Role詳細(xì)信息
? install:下載并安裝galaxy指定的Roles到本地
? list:列出本地已下載Roles
? remove:刪除本地已下載的Roles
2)help用法顯示[--help]
eg:
ansible-galaxy init --help
3)參數(shù)項(xiàng)[options]
eg:
ansible-galaxy init [options] role_name
(4)ansible-pull
該指令涉及Ansible另外一種工作模式:pull模式 (ansible默認(rèn)使用push模式)
ansible-pull [options] [playbook.yml]
ansible-pull一般在配置大批量機(jī)器的場(chǎng)景下會(huì)使用,靈活性稍有欠缺,但是效率性會(huì)有所提升
此模式適合以下場(chǎng)景:
①有數(shù)據(jù)巨大的機(jī)器需要配置,即使使用高并發(fā)線程依舊要花費(fèi)很多時(shí)間;
②要在剛啟動(dòng)的,沒(méi)有網(wǎng)絡(luò)聯(lián)機(jī)的主機(jī)上運(yùn)行ansible;
(5)ansible-doc
ansible-doc是模塊文檔說(shuō)明,相當(dāng)于Linux系統(tǒng)man命令類似
ansible-doc [option] [module...]
eg:
ansible-doc -l #列出支持的模塊
ansible-doc ping #ping 模塊功能說(shuō)明
(6)ansible-playbook
工作中使用頻率最高的命令,工作機(jī)制是:通過(guò)讀取預(yù)先編寫(xiě)好的playbook文件實(shí)現(xiàn)批量管理。
要實(shí)現(xiàn)的功能和ansible一樣。
ansible-playbook命令后面跟yaml格式的playbook文件,執(zhí)行實(shí)現(xiàn)編排好的任務(wù)集 eg:
ansible-playbook playbook.yaml
(7) ansible-vault
ansible-vault主要用于配置文件加密,如編寫(xiě)的playbo配置文件中包含敏感信息,不希望其他人
隨意查看,ansible-vault可加密/解密這個(gè)配置文件
ansible-vault [create|decrypt|edit|encrypt|rekey|view] [--help] [options] file-name
eg:
1)設(shè)定如下密碼,加密a.yml文件
ansible-vault encrypt a.yml
2)解密后正常查看
ansible-vault decrypt a.yaml
(8)ansible-console
ansible-console是Ansible為用戶提供的一款交互式工具
一般主要用到的三個(gè)是:ansible,ansible-playbook,ansible-doc
7.Ansible Iventory(資產(chǎn)清單)配置及詳解
Inventory是Ansible管理主機(jī)信息的配置文件,相當(dāng)于系統(tǒng)的Hosts功能,默認(rèn)放
在/etc/ansible/hosts里。如果有多個(gè)可以用-i指定。
eg:
ansible -i /etc/ansible/inven webs -m ping
如果只有一個(gè)Inventory時(shí)可不用指定路徑,默認(rèn)讀取/etc/ansible/hosts
1) 定義主機(jī)和組
· Inventory配置文件遵循INI風(fēng)格,中括號(hào)中的字符為組名
· 支持將一個(gè)主機(jī)同時(shí)歸并到多個(gè)不同的組中
· 若目標(biāo)主機(jī)使用了非默認(rèn)的SSH端口,還可以使用冒號(hào)加端口來(lái)標(biāo)明,默認(rèn)端口是22
· 可以直接使用IP地址
· 支持hostname
eg:
[webserver]
10.10.10.1
10.10.10.1:2222
ymd
ymd:2222
連續(xù)主機(jī)也可以用數(shù)字或字母表示:
web[1:10] 相當(dāng)于web1,web2...web10
db-[a-c] 相當(dāng)于db-a,db-b.db-c
2) Iventory參數(shù)列表
- ansible_ssh_host:
將要連接的遠(yuǎn)程主機(jī)名.與你想要設(shè)定的主機(jī)的
別名不同的話,可通過(guò)此變量設(shè)置.
- ansible_ssh_port:
ssh端口號(hào)如果不是默認(rèn)的端口號(hào),通過(guò)此變量設(shè)置.
- ansible_ssh_user :
默認(rèn)的 ssh 用戶名 root
- ansible_ssh_pass:
ssh 密碼(這種方式并不安全,我們強(qiáng)烈建議使用 --ask-pass 或 SSH 密鑰)
- ansible_sudo_pass:
sudo 密碼(這種方式并不安全,我們強(qiáng)烈建議使用 --ask-sudo-pass)
- ansible_connection:
與主機(jī)的連接類型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默認(rèn)使用
paramiko.1.2 以后默認(rèn)使用 'smart','smart' 方式會(huì)根據(jù)是否支持 ControlPersist, 來(lái)判斷'ssh' 方
式是否可行
- ansible_ssh_private_key_file ssh :
使用的私鑰文件.適用于有多個(gè)密鑰,而你不想使用 SSH 代理的情況.
- ansible_shell_type :
目標(biāo)系統(tǒng)的shell類型.默認(rèn)情況下,命令的執(zhí)行使
用 'sh' 語(yǔ)法,可設(shè)置為 'csh' 或 'fish'.
- ansible_python_interpreter :
目標(biāo)主機(jī)的 python 路徑.適用于的情況: 系統(tǒng)中有多個(gè) Python, 或者命令路徑不
是"/usr/bin/python",比如 \*BSD, 或者 /usr/bin/python 不是 2.X 版本的 Python.我們
不使用 "/usr/bin/env" 機(jī)制,因?yàn)檫@要求遠(yuǎn)程用戶的路徑設(shè)置正確,且要求 "python" 可執(zhí)行程序名
不可為 python以外的名字(實(shí)際有可能名為python26). 與 ansible_python_interpreter 的工
作方式相同,可設(shè)定如 ruby 或 perl 的路徑...
3) Ansible與正則
(1)all(全量)匹配
匹配所有主機(jī),all護(hù)著*(星號(hào))功能相同,但星號(hào)需引起來(lái)
eg:
ansible all -m ping
ansible "*" -m ping
檢查10.10.10.1/24網(wǎng)段所有主機(jī)存活狀況
ansible 192.168.1.* -m ping
(2)邏輯或(or)匹配
如果我們希望對(duì)多個(gè)主機(jī)或者多個(gè)組同時(shí)執(zhí)行,相互之間用“:”(冒號(hào))
eg:
ansible "web1:web2" -m ping
(3)邏輯非(!)匹配
主要針對(duì)多重條件的匹配原則
eg:
webserver:!staging
//所有在webserver組里面而不再staging組里面
(4)邏輯與(&)匹配
eg:
webserver:&staging
//webserver和staging組里面共同的主機(jī)
(5)模糊匹配
*通配符表示0或者多個(gè)字符
eg:
*.com
(6)域切割
[webservers]
cobweb
webbing
weber
這相當(dāng)于一個(gè)數(shù)組:
webservers=[cobweb,webbing,weber]
可以用數(shù)組下表獲取對(duì)應(yīng)的變量值:
webservers[0] //cobweb
webservers[0:1] //cobweb,webbing
(7)支持正則匹配
8.ansible命令介紹:
Ansible [option] Options:
-a MODULE_ARGS, --args=MODULE_ARGS 模塊的參數(shù),如果執(zhí)行默認(rèn)COMMAND模塊,即是命令參數(shù),如:“date”,"pwd"等等
-k, --ask-pass 登錄密碼,提示輸入SSH密碼而不是假設(shè)基于密鑰的驗(yàn)證
--ask-su-pass su切換密碼
-K, --ask-sudo-pass 提示密碼使用sudo,sudo表示提權(quán)操作
--ask-vault-pass vault密碼
-B SECONDS, --background=SECONDS 后臺(tái)運(yùn)行超時(shí)時(shí)間
-C, --check 只是測(cè)試一下會(huì)改變什么內(nèi)容,不會(huì)真正去執(zhí)行
-c CONNECTION, --connection=CONNECTION 連接類型使用??赡艿倪x項(xiàng)是paramiko(SSH),SSH和地方。當(dāng)?shù)刂饕怯糜赾rontab或啟動(dòng)。
-f FORKS, --forks=FORKS 并行任務(wù)數(shù)。NUM被指定為一個(gè)整數(shù),默認(rèn)是5
-h, --help 打開(kāi)幫助文檔API
-i INVENTORY, --inventory-file=INVENTORY 指定庫(kù)存主機(jī) 文件的路徑,默認(rèn)為/etc/ansible/hosts
-l SUBSET, --limit=SUBSET 進(jìn)一步限制所選主機(jī)/組模式 --limit=192.168.91.135 只對(duì)這個(gè)ip執(zhí)行
--list-hosts 列出符合條件的主機(jī)列表
-m MODULE_NAME, --module-name=MODULE_NAME 執(zhí)行模塊的名字,默認(rèn)使用 command 模塊,所以如果是只執(zhí)行單一命令可以不用 -m參數(shù)
-M MODULE_PATH, --module-path=MODULE_PATH 要執(zhí)行的模塊的路徑,默認(rèn)為/usr/share/ansible/
-o, --one-line 標(biāo)準(zhǔn)輸出至一行
-P POLL_INTERVAL, --poll=POLL_INTERVAL 定期返回后臺(tái)進(jìn)度
--private-key=PRIVATE_KEY_FILE 私鑰路徑,使用這個(gè)文件來(lái)驗(yàn)證連接
-S, --su run operations with su 用 su 命令
-R SU_USER, --su-user=SU_USER 指定SU的用戶,默認(rèn)是root用戶
-s, --sudo 相當(dāng)于Linux系統(tǒng)下的sudo命令
-U SUDO_USER sudo到哪個(gè)用戶,默認(rèn)為 root
-T TIMEOUT, --timeout=TIMEOUT 指定SSH默認(rèn)超時(shí)時(shí)間, 默認(rèn)是10S
-t TREE, --tree=TREE 將日志內(nèi)容保存在該輸出目錄,結(jié)果保存在一個(gè)文件中在每臺(tái)主機(jī)上。
-u REMOTE_USER, --user=REMOTE_USER 遠(yuǎn)程用戶, 默認(rèn)是root用戶
--vault-password-file=VAULT_PASSWORD_FILE
-v, --verbose 詳細(xì)信息
--version 輸出ansible的版本
9.Ansible常用模塊
(1)ping:探測(cè)目標(biāo)主機(jī)是否存活;
eg:
# ansible hosts -m ping
(2)command:在遠(yuǎn)程主機(jī)執(zhí)行命令;不支持|管道命令
相關(guān)選項(xiàng):
creates:一個(gè)文件名,當(dāng)該文件存在,則該命令不執(zhí)行
free_form:要執(zhí)行的linux指令
chdir:在執(zhí)行指令之前,先切換到該目錄
removes:一個(gè)文件名,當(dāng)該文件不存在,則該選項(xiàng)不執(zhí)行
executable:切換shell來(lái)執(zhí)行指令,該執(zhí)行路徑必須是一個(gè)絕對(duì)路徑
eg:
- name: test
command: /usr/bin/make_database.sh arg1 arg2
args:
chdir: somedir/
creates: /path/to/database
(3)shell:在遠(yuǎn)程主機(jī)上調(diào)用shell解釋器運(yùn)行命令,支持shell的各種功能,例如管道等 ;
注意:command和shell模塊的核心參數(shù)直接為命令本身;而其它模塊的參數(shù)通常為“key=value”格式;
eg:
---
- hosts: node1
gather_facts: flase #(gather_facts獲取節(jié)點(diǎn)的信息)
tasks:
- name: "hello world"
shell: echo "hello world" `date` by `hostname` > /tmp/hello.log
(4)copy:復(fù)制本地文件到遠(yuǎn)程或者遠(yuǎn)程到遠(yuǎn)程主機(jī),此時(shí)的遠(yuǎn)程主機(jī)為一個(gè),可以改權(quán)限等
用法:
(1) 復(fù)制文件
-a "src= dest= "
(2) 給定內(nèi)容生成文件
-a "content= dest= "
相關(guān)選項(xiàng)如下:
backup:在覆蓋之前,將源文件備份,備份文件包含時(shí)間信息。有兩個(gè)選項(xiàng):yes|no content:用于替代“src”,可以直接設(shè)定指定文件的值
dest:必選項(xiàng)。要將源文件復(fù)制到的遠(yuǎn)程主機(jī)的絕對(duì)路徑,如果源文件是一個(gè)目錄,那么該路徑也必須是個(gè)目錄
directory_mode:遞歸設(shè)定目錄的權(quán)限,默認(rèn)為系統(tǒng)默認(rèn)權(quán)限 force:如果目標(biāo)主機(jī)包含該文件,但內(nèi)容不同,如果設(shè)置為yes,則強(qiáng)制覆蓋,如果為no,則只有當(dāng)目標(biāo)主機(jī)的目標(biāo)位置不存在該文件時(shí),才復(fù)制。默認(rèn)為
yes others:所有的file模塊里的選項(xiàng)都可以在這里使用
src:被復(fù)制到遠(yuǎn)程主機(jī)的本地文件,可以是絕對(duì)路徑,也可以是相對(duì)路徑。如果路徑是一個(gè)目錄,它將遞歸復(fù)制。在這種情況下,如果路徑使用“/”來(lái)結(jié)尾,則只復(fù)制目錄里的內(nèi)容,如果沒(méi)有使用“/”來(lái)結(jié)尾,則包含目錄在內(nèi)的整個(gè)內(nèi)容全部復(fù)制,類似于rsync。
(5)file :設(shè)置文件屬性。
用法:
(1) 創(chuàng)建目錄:
-a "path=。。。 state=directory"
(2) 創(chuàng)建鏈接文件:
-a "path=。。。 src=... state=link"
(3) 刪除文件:
-a "path=。。。 state=absent"
相關(guān)選項(xià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)建目錄
file:即使文件不存在,也不會(huì)被創(chuàng)建
link:創(chuàng)建軟鏈接
hard:創(chuàng)建硬鏈接
touch:如果文件不存在,則會(huì)創(chuàng)建一個(gè)新的文件,如果文件或目錄已存在,則更新其最后修改時(shí)間
absent:刪除目錄、文件或者取消鏈接文件
(6)fetch:從遠(yuǎn)程某一個(gè)主機(jī)獲取文件到本地
Dest: 用來(lái)存放文件的目錄
Fail_on_missing:當(dāng)源文件不存在的時(shí)候,標(biāo)識(shí)為失敗
Flat:允許覆蓋默認(rèn)行為從hostname/path到/file,如果 dest以/結(jié)尾,它將使用源文件的基礎(chǔ)名稱
Src:在遠(yuǎn)程拉去的文件,并且必須是一個(gè)file,不能是目錄
Validate_checksum:當(dāng)文件fetch之后進(jìn)行md5檢查
注意:在拉取的時(shí)候,必須是文件,不能拉取文件夾
(7)raw:類似于shell,推薦優(yōu)先使用raw
(8)cron: 管理cron計(jì)劃任務(wù)
- a "": 設(shè)置管理節(jié)點(diǎn)生成定時(shí)任務(wù)
action:
cron backup= #如果設(shè)置,創(chuàng)建一個(gè)crontab備份
cron_file= #如果指定, 使用這個(gè)文件cron.d,而不是單個(gè)用戶crontab day= #日應(yīng)該運(yùn)行的工作( 1-31, *, */2, etc ) hour= # 小時(shí) ( 0-23, *, */2, etc )
job= #指明運(yùn)行的命令是什么
minute= #分鐘( 0-59, *, */2, etc )
month= #月( 1-12, *, */2, etc )
name= #定時(shí)任務(wù)描述
reboot #任務(wù)在重啟時(shí)運(yùn)行,不建議使用,建議使用special_time special_time # 特殊的時(shí)間范圍,參數(shù):reboot(重啟時(shí)),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小時(shí))
state #指定狀態(tài),prsent表示添加定時(shí)任務(wù),也是默認(rèn)設(shè)置,absent表示刪除定時(shí)任務(wù)
user #以哪個(gè)用戶的身份執(zhí)行 weekday # 周 ( 0-6 for Sunday-Saturday, *, etc )
(9)yum:yum安裝軟件,也有apt,zypper
conf_file #設(shè)定遠(yuǎn)程yum安裝時(shí)所依賴的配置文件。如配置文件沒(méi)有在默認(rèn)的位置。
disable_gpg_check#是否禁止GPG checking,只用于`present' or `latest'。
disablerepo #臨時(shí)禁止使用yum庫(kù)。只用于安裝或更新時(shí)。
enablerepo #臨時(shí)使用的yum庫(kù)。只用于安裝或更新時(shí)。
name= #所安裝的包的名稱
state #present安裝, latest安裝最新的, absent 卸載軟件。
update_cache #強(qiáng)制更新yum的緩存。
(10)service: 服務(wù)程序管理
arguments #命令行提供額外的參數(shù)
enabled #設(shè)置開(kāi)機(jī)啟動(dòng)。
name= #服務(wù)名稱
runlevel #開(kāi)機(jī)啟動(dòng)的級(jí)別,一般不用指定。
sleep #在重啟服務(wù)的過(guò)程中,是否等待。如在服務(wù)關(guān)閉以后等待2秒再啟動(dòng)。
state #started啟動(dòng)服務(wù), stopped停止服務(wù), restarted重啟服務(wù), reloaded重載配置
(11)group: 組管理
[root@node1 ~]# ansible-doc -s group
- name: 添加或刪除組
action: group
gid # 設(shè)置組的GID號(hào)
name= # 管理組的名稱
state # 指定組狀態(tài),默認(rèn)為創(chuàng)建,設(shè)置值為absent為刪除
system # 設(shè)置值為yes,表示為創(chuàng)建系統(tǒng)組
(11)User:用戶管理
-a ""
action: user
comment # 用戶的描述信息
createhom # 是否創(chuàng)建家目錄
force # 在使用`state=absent'是, 行為與`userdel --force'一致.
group # 指定基本組
groups # 指定附加組,如果指定為('groups=')表示刪除所有組
home # 指定用戶家目錄
login_class #可以設(shè)置用戶的登錄類 FreeBSD, OpenBSD and NetBSD系統(tǒng).
move_home # 如果設(shè)置為`home='時(shí), 試圖將用戶主目錄移動(dòng)到指定的目錄
name= # 指定用戶名
non_unique # 該選項(xiàng)允許改變非唯一的用戶ID值
password # 指定用戶密碼
remove # 在使用 `state=absent'時(shí), 行為是與 `userdel --remove'一致.
shell # 指定默認(rèn)shell
state #設(shè)置帳號(hào)狀態(tài),不指定為創(chuàng)建,指定值為absent表示刪除
system # 當(dāng)創(chuàng)建一個(gè)用戶,設(shè)置這個(gè)用戶是系統(tǒng)用戶。這個(gè)設(shè)置不能更改現(xiàn)有用戶。
uid #指定用戶的uid
update_password # 更新用戶密碼
expires #指明密碼的過(guò)期時(shí)間
10、playbook

1.基本YAML語(yǔ)法
1)文件必須以yaml或者yml結(jié)尾
2) “- - -”(3個(gè)減號(hào))是文件的開(kāi)始行,表明一個(gè)文件的開(kāi)始;“...”表示一個(gè)文件的結(jié)束
3)#號(hào)代表注釋
4)縮進(jìn)代表層級(jí)關(guān)系,縮進(jìn)必須統(tǒng)一,不能空格和Tab混用
5)縮進(jìn)級(jí)別一致必須左對(duì)齊
6)大小寫(xiě)敏感
7)元素用鍵值(k/v)方式寫(xiě),使用“:”冒號(hào)分割,冒號(hào)后空一格,再寫(xiě)值
8)一個(gè)完整的代碼塊功能最少元素須包括name和task
9)每個(gè)“:”和“-”后邊都需要跟一個(gè)空格
10)一個(gè)name只能包含一個(gè)task
2.playbook 組成結(jié)構(gòu)
-
hosts:執(zhí)行這個(gè)劇本的主機(jī)或者主機(jī)組
tasks:任務(wù) 即調(diào)用模塊完成的某操作
- name:簡(jiǎn)述任務(wù)的功能 moudule:option Vars:變量 Templates:模板 根據(jù)客戶端的情況來(lái)生成一些的數(shù)據(jù) Handlers:處理器 由某條件滿足能觸發(fā)執(zhí)行的操作
Roles:角色
(1)playbook中的每一個(gè)play的目的都是為了讓某個(gè)或者某些主機(jī)以某個(gè)指定的用戶身份來(lái)執(zhí)行任務(wù)
如下面所示
- hosts: webnodes
remote_user: root
hosts: 是用于指定要執(zhí)行的指定任務(wù)的主機(jī),其可以是一個(gè)或者多個(gè)以冒號(hào)分割的主機(jī)組,
remote_users:則用于指定遠(yuǎn)程主機(jī)上的執(zhí)行任務(wù)的用戶
不過(guò) remote_users 也可以用于每個(gè)task中,也可以通過(guò)指定其通過(guò)sudo的方式在遠(yuǎn)程的主機(jī)上執(zhí)行任務(wù),其可以于play全局或者某任務(wù)中,此外,甚至可以在sudo時(shí)使用sudo_user 指定sudo時(shí)切換的用戶
- hosts: webnodes
remote_user: bds
tasks:
- name: test connection
ping:
remote_user: bds
sudo: yes
(2)任務(wù)列表和action
play的主體部分是task list
task list中的各任務(wù)按次序逐個(gè)在hosts中指定的所有主機(jī)上執(zhí)行,即在所有主機(jī)上完成第一個(gè)任
務(wù)后在開(kāi)始第二個(gè)任務(wù),在運(yùn)行自上而下某個(gè)playbook時(shí),如果中途發(fā)生錯(cuò)誤,所有已經(jīng)執(zhí)行的任務(wù)都會(huì)講回滾,因此,在更正playbook后重新執(zhí)行一次即可
task目的是使用指定的參數(shù)執(zhí)行模塊,而在模塊參數(shù)中可以使用變量,模塊執(zhí)行是具有冪等性的,這意味著多次執(zhí)行是安全的,因?yàn)槠浣Y(jié)構(gòu)均一致
每個(gè)task都應(yīng)該有其name ,用于playbook執(zhí)行結(jié)果輸出,建議其內(nèi)容盡可能清晰地描述任務(wù)執(zhí)行步驟,如果未提供name,則action的結(jié)果將用于輸出
定義task的可以使用“action: module option”或者module: options
推薦使用后者以實(shí)現(xiàn)向后兼容,如果action 一行的內(nèi)容過(guò)多,也可以使用在行首使用幾個(gè)空白字符進(jìn)行換行。
tasks:
- name: make sure apache is running
service: name=httpd state=running
在眾多模塊中,只用command和shell模塊僅需要給定一個(gè)列表而無(wú)需使用“key=value”格式例如
tasks:
- name: disable selinux
shell: /sbin/setenforce 0
(3)執(zhí)行playbook
ansible-playbook命令來(lái)執(zhí)行劇本
1)- -limit:我們可以通過(guò)"-hosts:"字段來(lái)指定哪些主機(jī)將會(huì)應(yīng)用Playbook操作,也可以直接用ansible-playbook執(zhí)行
eg:
ansible-playbook palybook.yaml --limit node1
2)--list-hosts:被執(zhí)行的主機(jī)
eg:
ansible-playbook palybook.yaml --limit-hosts
3)用戶權(quán)限設(shè)置
(1)--remote-user
如果在playbook中,hosts字段下面沒(méi)有定義users關(guān)鍵字,那么Ansible將使用Inventory文件中定義的用戶,如果Inventory也沒(méi)有定義用戶,Ansible將默認(rèn)使用系統(tǒng)用戶身份來(lái)通過(guò)SSH連接遠(yuǎn)程主機(jī)。我們也可以在playbook中使用--remote-user選項(xiàng)指定用戶。
(2)--ask=sudo-pass
為了保證可以傳遞sudo密碼到遠(yuǎn)程主機(jī),可以用此選項(xiàng)來(lái)交互式的輸入密碼
(3)--sudo
使用--sudo選項(xiàng),可以強(qiáng)制所有play都使用sudo用戶,同時(shí)使用--sudo-user選項(xiàng)指定sudo可以執(zhí)行哪個(gè)用戶的權(quán)限,如果不指定,則默認(rèn)以root身份運(yùn)行
eg:
ansible-playbook playbook,yaml --sudo --sudo-user=ymd --ask-sudo-pass
執(zhí)行過(guò)程中,會(huì)要求用戶輸入ymd密碼
4)--syntax-check
檢測(cè)playbook語(yǔ)法
5)--forks=NUM(-f NUM)
指定迸發(fā)時(shí)的任務(wù)數(shù)
6)-verbose(v)
顯示詳細(xì)輸出,-vvv更詳細(xì)輸出
7)--connection=type (-c TYPE)
指定連接遠(yuǎn)程主機(jī)的連接方式,默認(rèn)是SSH,設(shè)為local時(shí),則在本地執(zhí)行playbook,建議不做修改
8)inventory=PATH (-i PATH)
指定inventory文件,默認(rèn)文件是/etc/ansible/hosts
9)--start-at-task="task_name"
運(yùn)行某個(gè)特定的task
10)--check
檢測(cè)執(zhí)行,并不是真正執(zhí)行
3.playbook條件和循環(huán)
條件判斷使用when,循環(huán)使用with_items 1)條件判斷 需要開(kāi)啟gather_facts功能,默認(rèn)開(kāi)啟
eg:
---
- hosts: node1,node2
gather_facts: yes
tasks:
- name: "RedHat"
shell: echo "RedHat" `date` by `hostname` >> /tmp/hello.log
when: ansible_os_family == "RedHat"
- name: "other linux"
shell: echo "Not RedHat" `date` by `hostname` >> /tmp/hello.log
when: ansible_os_family == "RedHat"
2)標(biāo)準(zhǔn)循環(huán)
- hosts: node1,node2
tasks:
- name: "with_items"
shell: echo {{item}} `date` by `hostname` >> /tmp/hello.log
with_items:
- item1
- item2
- item3
4.playbook中使用變量
1)將變量定義在inventory文件(默認(rèn)為/etc/ansible/hosts)
eg:定義一個(gè)linux_os變量
---
#針對(duì)單個(gè)主機(jī)定義變量
10.10.10.1 linux_os=RedHat
[test]
10.10.10.1
#組定義變量
[test:vars]
linux_os=centos
注意:
①組定義變量的作用范圍是租下的所有主機(jī)
②當(dāng)兩種定義方式同時(shí)存在時(shí),ansible會(huì)優(yōu)先采用單個(gè)主機(jī)定義的變量值
# cat test.yaml
---
- hosts:
remote_user: root
tasks:
- name: debug
debug: msg="The {{ iventory_hostname }} Value is {{ keyvalue }}"
2)通過(guò)ansible-playbook命令行轉(zhuǎn)入
ansible-playbook test.yaml -e "linux_os=RedHat"
3)直接在yaml文件中使用vars字段定義
eg:
# cat test.yaml
---
- hosts: test
vars:
linux_os: playbook
tasks:
- name: debug
debug: msg="The {{ iventory_hostname }} Value is {{ keyvalue }}"
4)通過(guò)host_var和group_vars目錄來(lái)定義變量
在/etc/ansible目錄文件下創(chuàng)建host_vars和group_vars兩個(gè)目錄用來(lái)存放定義變量的文件。
①針對(duì)單機(jī)定義的變量
cat host_vars/10.10.10.1
---
linux_os: 10.10.10.1@host_vars
②針對(duì)test組變量
cat group_vars/test
---
linux_os: test@group_vars
ansible變量使用的優(yōu)先級(jí):
ansible-playbook命令直接傳入變量
yaml文件定義vars關(guān)鍵字
host_vars下定義變量
inventory中定義主機(jī)變量
group_vars下定義變量
inventory中組定義變量
5)在yaml文件中使用vars_files字段定義
eg:
# cat test.yaml
---
- hosts: test
vars_files:
- vars.yaml #定義變量的文件
tasks:
- name: debug
debug: msg="The {{ iventory_hostname }} Value is {{ keyvalue }}"
6)使用register傳遞變量 register用于在task之間傳遞變量
cat register.yaml
---
- hosts: test
tasks:
- name: register test
shell: hostname
register: info
- name: display info
debug: msg="Hostname is {{ info }}"
register定義的info變量在第二個(gè)task中用來(lái)查看第一個(gè)task中執(zhí)行的hostname命令的結(jié)果

如果只想看到stdout部分信息,可以通過(guò)info['stdout']來(lái)引用
cat register.yaml
---
- hosts: test
tasks:
- name: register test
shell: hostname
register: info
- name: display info
debug: msg="Hostname is {{ info['stdout'] }}"

7)使用vars_prompt交互式傳入變量 在playbook中定義vars_prompt變量名和交互式提示信息,就可以實(shí)現(xiàn)在運(yùn)行playbook時(shí),通過(guò)交互的傳入變量值。
cat prompt.yaml
---
- hosts: test
vars_prompt:
- name: "var1"
prompt: "input value for var1"
private: no
- name: "var2"
prompt: "input value for var2"
private: yes
default: 'test vars'
tasks:
- name: display var1
debug: msg="The value of var1 is {{ var1 }}"
- name: display var2
debug: msg="The value of var1 is {{ var2 }}"
5.handle觸發(fā)之后才可執(zhí)行
# cat handler.yaml
- hosts: 10.10.10.1
remote_user: root
tasks:
- name: install nginx
yum: name=nginx state=present
- name: installl configure file
notify: restart httpd service
template: src=nginx.conf.j2 dest=/etc/nginx/conf/nginx.conf
- name:start nginx service
service: name=nginx state=started
handlers:
- name: restart nginx service
service: name=nginx state=restarted
某任務(wù)的狀態(tài)在運(yùn)行后為changed時(shí),可通過(guò)“notify”通知給相應(yīng)的handlers;
6.運(yùn)行playbook
1)從制定的任務(wù)開(kāi)始執(zhí)行playbook,使用“--start-at”選項(xiàng):
ansible-playbook playbook.yaml --start-at="install packages"
上面的命令就會(huì)從名字為“install packages”的任務(wù)開(kāi)始執(zhí)行你的playbook
2)分步運(yùn)行playbook --step選項(xiàng)來(lái)交互式的執(zhí)行playbook:
ansible-playbook playbook.yaml --step
(y/n/c):
y:會(huì)執(zhí)行該任務(wù)
n:回答會(huì)跳過(guò)該任務(wù)
c:回答會(huì)繼續(xù)執(zhí)行剩余的所有任務(wù)而不再詢問(wèn)你
拷貝遠(yuǎn)程主機(jī)文件到FTP主機(jī)
# cat lftp.yaml
- hosts: YMD_ZONE
tasks:
- name: Tansfer file to 10ftp
raw: lftp -c "open -u ftpuser,ftpuser ftp://10.10.10.1;mkdir {{ ansible_date_time.date }};cd {{ ansible_date_time.date }};mkdir {{ ansible_hostname }};cd {{ ansible_hostname }};put /root/app/testfile/test.dat"
角色(roles):
角色集合:
roles/
mysql/
httpd/
nginx/
memcached/
每個(gè)角色,以特定的層級(jí)目錄結(jié)構(gòu)進(jìn)行組織:
mysql/
files/ :存放由copy或script模塊等調(diào)用的文件;
templates/:template模塊查找所需要模板文件的目錄;
tasks/:至少應(yīng)該包含一個(gè)名為main.yml的文件;其它的文件需要在此文件中通過(guò)include進(jìn)行包含;
handlers/:至少應(yīng)該包含一個(gè)名為main.yml的文件;其它的文件需要在此文件中通過(guò)include進(jìn)行包含;
vars/:至少應(yīng)該包含一個(gè)名為main.yml的文件;其它的文件需要在此文件中通過(guò)include進(jìn)行包含;
meta/:至少應(yīng)該包含一個(gè)名為main.yml的文件,定義當(dāng)前角色的特殊設(shè)定及其依賴關(guān)系;其它的文件需要在此文件中通過(guò)include進(jìn)行包含;
default/:設(shè)定默認(rèn)變量時(shí)使用此目錄中的main.yml文件;
在playbook調(diào)用角色方法1:
- hosts: websrvs
remote_user: root
roles:
- mysql
- memcached
- nginx
在playbook調(diào)用角色方法2:傳遞變量給角色
- hosts:
remote_user:
roles:
- { role: nginx, username: nginx }
鍵role用于指定角色名稱;后續(xù)的k/v用于傳遞變量給角色;
還可以基于條件測(cè)試實(shí)現(xiàn)角色調(diào)用;
roles:
- { role: nginx, when: "ansible_distribution_major_version == '7' " }
ansible-vcs:
https://github.com/andrewrothstein/ansible-vcs \