高度模塊化,調用特定的模塊,完成特定的任務,基於Yaml,來完成批量任務的模板化,來支持playbook。基於Python語言實現,主要使用Paramiko、PyYAML和JinJa2三個關鍵模塊,部署簡單(agentless),主從模式,支持自定義模塊,支持playbook,冪等性:容許重複執行N次,沒有變化時,只會執行第一次。html
特色:node
PS:集成了上面括號中的工具的主要功能python
主要由模塊、插件、主機羣、以及劇本的組成,各部分含義以下:mysql
1.核心模塊(core modules):Ansible 自帶的模塊。
2.自定義模塊(custom Modules):若是核心模塊不足以完成某種功能,能夠自行添加自定義模塊(支持市面上大部分的編程語言)。
3.插件(Plugins):支持使用插件的方式對ansible自己的功能進行擴展。模塊是用來實現任務的,加強ansible平臺本身的功能就須要使用插件(loggin插件記錄日誌,email插件發送郵件)
- 其中最經常使用是:鏈接插件(Connectior Plugins) :ansibile基於鏈接插件鏈接到各個主機上,雖然默認狀況下ansible使用ssh鏈接到各個主機上,但它還支持其餘的鏈接方法(mq)。
4.主機羣(Host Inventory): 主機清單,定義ansible管理的主機,還能夠存放一下針對不一樣主機的變量,也能夠寫入主機的用戶名和密碼
5.劇本(playbooks):ansible的任務配置文件,將多個任務定義在劇本中,由ansible自動執行
linux
yum install -y ansible
運行原理:把命令翻譯成shell命令,拷貝到目標主機(/root/.ansible/tmp/下),再執行,執行完畢後刪除tmp文件。nginx
ansible 命令主要參數信息git
# 基於主機清單: ansible -i /etc/ansible/hosts test -u root -m command -a 'ls /home' -k (ansible 依賴 sshpass) | --> ansible test -a 'ls /home' -k # 上面兩條命令默認狀態下效果相同 # 咱們知道ansible經過ssh的方式來遠程管理多臺主機,因此咱們須要使用ssh key的方式來進行ssh認證,固然你也可使用ansible的時候加上-k,來經過交互式輸入密碼。當有了ssh key之後,那麼咱們就能夠直接使用ansbile來執行任務了,好比:ansible all -m ping # 基於主機: ansible 127.0.0.1 -m ping
/etc/ansible/hosts:(默認的Inventory)github
[test] # 用於定義主機組,all表示全部主機,因此儘可能避免使用all做爲組名 127.0.0.1 # 該組的主機列表,能夠是主機名(dns解析)或者IP地址,或者用符號來表示連續的主機 192.168.1.[80:88] # 表示 192.168.1.80 - 192.168.1.88
[web:children] # 表示子組
nginx # nginx組
test # test組
配置文件中的變量及參數:web
[nginx] 127.0.0.1 ansible_ssh_user=root ansible_ssh_host=web1 # 更細緻的配置 - ansible_ssh_user : 用於指定管理遠程主機的賬號 - ansible_ssh_host : 用於指定被管理的主機 - ansible_ssh_port :用於指定ssh的端口 - ansible_ssh_private_key_file :指定key文件 - host_key_checking=False :當第一次鏈接主機時,會提示yes/no,跳過這次環節
ansible 查找 Ansible.cfg 文件遵循如下順序:sql
Ansible.cfg中的經常使用配置:
- inventory:指定inventory文件的路徑 - remote_user:SSH鏈接時使用的用戶名 - remote_port:SSH鏈接時使用的端口號 - private_key_file:SSH鏈接時使用的私鑰文件 - roles_path:查找roles的路徑,能夠指定多個查找路徑,多個路徑之間用冒號分隔 - log_path:Ansible的日誌文件路徑 - host_key_checking:相似於ssh命令中的StrictHostKeyChecking選項,當等於False時,不檢查遠程主機是否存在於Konw_hosts文件中 - forks:並行進程的數量 - gathering:控制收集Facts變量的策略
ssh相關
- ssh_args:能夠經過這個參數控制Ansible的ssh鏈接 - pipelining: 多個task之間共享SSH鏈接,開啓pipelining可以有效提高Ansible的執行速度 - control_path:保存ControlPath socket的路徑
權限提高相關
- become:是否進行權限提高 - become_method:權限提高的方式,默認爲sudo - become_user:提高爲哪一個用戶的權限,默認爲root - become_ask_pass:默認爲False,表示權限提高時不須要密碼(設置爲true時,手動輸入密碼,或者配置ansible_become_pass變量)
查看模塊的幫助:
ansible-doc -l # 查看核心的模塊(包含模塊的大體說明,比較慢) ansible-doc -s 'command' # 執行模塊名,能夠列出模塊的用法
用於統計系統的相關信息
# 例子 ansible test -m setup # 參數 - filter: 過濾要顯示的內容 - ansible test -m setup -a "filter=ansible_python_version" -k # 只獲取主機ansible_python_version的值 - 更多的幫助 ansible-doc -s setup
設置文件屬性
# 參數 - force: 在兩種狀況下會強制建立軟鏈接,默認值爲 no - 源文件不存在但以後會創建的狀況下 - 目標軟鏈接已存在,須要先取消以前的軟連,而後建立新的軟鏈 - group:定義文件的屬組 - mode:定義文件的權限 - owner:定義文件的屬主 - path:必選項,定義文件的路徑 - recurse:遞歸設置文件的屬性,只對目錄生效(-R) - src:要被連接的源文件的屬性,只應用於state=link的狀況 - dest:被連接到的路徑,只應用與state=link的狀況 - state: - directory:若是目錄不存在建立目錄 - file:即便文件不存在,也不會被建立 - link:建立軟鏈接 - hard:建立硬連接 - touch:若是文件不存在,則會建立一個新的文件,若是文件存在,則會更新其最後修改時間 - absent:刪除目錄,文件或者取消連接文件 # 例子 ansible test -m file -a 'src=/etc/fstab dest=/tmp/fstab state=link' -k # 等於 ln -s /etc/fstab /tmp/fstab ansible test -m file -a 'path=/tmp/fstab state=absent' -k # 刪除文件 ansible test -m file -a 'path=/tmp/lixin.txt state=touch owner=nobody group=nobody mode=666' -k # 建立文件指定其屬主,屬組,權限
複製文件到遠程主機,每次備份會產生一個md5sum,若是兩次賦值文件的md5sum相同,那麼就不會再次執行復制動做。
# 參數 - backup:在覆蓋以前將原文件備份,備份文件名包含時間信息。有兩個選項:yes | no - src:源文件,若是是目錄的話,會遞歸賦值,包括目錄自己,若是目錄爲/,那麼只會複製目錄下的文件 - dest:目標文件路徑 - others:全部file模塊裏的選項均可以在這裏使用 - content:用於替代'src',能夠直接設定文件的值 - directory_mode:遞歸設定目錄的權限,默認爲系統默認權限 - force:若是目標主機包含該文件,但內容不一樣,若是設置爲yes,則強制覆蓋,若是爲no,則只有當前目標主機的目標位置不存在該文件時,才複製,默認爲yes。 # 例子: ansible test -m copy -a "content='hello world' dest=/tmp/tmp.txt" -k # 在目錄主機上建立tmp.txt文件,內容爲hello world
在遠程主機上執行命令。(默認模塊)
# 參數 - creates:文件名,當該文件存在時,則不執行後面的命令 - chdir:執行命令前,先修改當前路徑 - removes:文件名,當文件不存在時,則不執行後面的命令 - executable:切換shell來執行命令,該執行路徑必須是一個絕對路徑
和command模塊相同,參數也相同。
# command,shell,raw,script模塊同屬於commands類,都是用來執行命令,不一樣的是: - command模塊執行的命令中不能包含:|,<,>,& 符號。 - shell模塊:能夠執行遠程服務器上的shell腳本文件,也支持 管道符等,腳本須要使用絕對路徑。 - raw模塊和shell模塊相同,能夠執行任意命令就像在本機同樣,至關於ssh之直接執行Linux命令,不會進入到ansible的模塊子系統中。 - script模塊,用來執行一個shell腳本,其實將管理端的shell腳本copy到被管理端上而後執行,至關於 scp + shell 的組合。(須要在腳本所在目錄下執行) # 官方建議使用command模塊,若是需求不知足,可使用raw模塊
用於管理服務
# 參數 - arguments: 給命令行提供一些選項 - enable:是否開機啓動 yes | no - name:服務名稱 - pattern:定義一個模式,若是經過status命令來查看服務的狀態時,沒有響應,就會經過ps指令在進程中根據該模式進行查找,若是匹配到,則認爲該服務已經在運行,不然會認爲未啓動( ps aux | grep `pattern` ) - runlevel:運行級別 - sleep:若是執行了,restarted,則在 stop 和 start 之間沉睡幾秒鐘 - state:started、stoped、restarted和reloaded,其中started和stoped是冪等的,也就是說若是服務已經中止,那麼運行stoped不會執行任何操做 # 例子 ansible test -m service -a 'name=nginx state=started enabled=yes' -k # 啓動nginx進程,並設置爲開機啓動 ansible test -m service -a 'name=nginx state=stopped' -k # 關閉nginx進程 ansible test -m service -a 'name=network state=restarted arguments=eth0' -k # 重啓network進程,並傳遞eth0 做爲參數,即:重啓eth0網卡 ansible test -m service -a 'name=nginx pattern=/usr/local/nginx state=started' -k # 若是沒法使用 service nginx status查尋到nginx的狀態,那麼會使用 ps 來過濾 pattern指定的關鍵字,若是存在,則表示程序已經正常啓動
用於管理定時任務(crontab 來操做)
# 參數 - backup: 對遠程主機上的原計劃內容修改以前作備份 - cront_file: 若是指定該選項,則用該文件替換遠程主機上的cron.d目錄下的用戶計劃任務 - day: 日(1-31,*,*/2,......) - hour: 小時(0-23,*,*/2,......) - minute: 分鐘(0-59,*,*/2,......) - mouth: 月(1-12,*,*/2,......) - weekday: 周(0-7,*,......) - job: 要執行的任務,依賴於state=present - name: 該任務的描述,必選項。 - special_time:指定何時執行(被觸發),參數:reboot,yearly,annually,monthly,weekly,daily,hourly。 - state:確認該任務計劃是建立仍是刪除 Present(啓用) | Absent(停用) - user:以哪一個用戶的身份執行 # 例子 ansible test -m cron -a "hour=3 month=2 day=1 job='echo hello' name='test' state=present " -k # 添加一條定時任務,* 3 1 2 * echo hello ansible test -m cron -a 'name=test state=absent' -k # 刪除name爲test的計劃任務
用於在塊設備上建立文件系統。
# 參數 - dev:目標塊設備 - force:在一個已有的文件系統的設備上強制建立 - fstype:文件系統類型 - opts:傳遞給mkfs命令的選項
使用yum包管理軟件包
# 參數 - config_file:yum的配置文件 - disable_gpg_check: 關閉gpg_check - disablerepo: 不啓用某個源 - enablerepo:啓用某個源 - list:列出repo源 - name:軟件包的名稱,能夠爲一個url路徑,或者本地一個rpm包的路徑 - state:狀態 # 安裝 - present - installed * - latest # 刪除 - absent - removed * # 例子 ansible test -m yum -a 'name=httpd state=installed' -k # yum 安裝 httpd
用於管理用戶(useradd,userdel) 也能夠用command模塊來執行shell命令建立和管理用戶
# 參數 - home:指定用戶的家目錄 - createhome: 是否建立用戶家目錄 yes | no - groups:用戶的屬組 - uid:用戶的uid - password:用戶的密碼 - name:用戶的名稱 - system:是不是系統用戶 - remove:是否刪除用戶家目錄 - state:具體的操做, 刪除/添加, present | absent - shell: 指定用戶的shell
使用rsync同步文件
# 參數 - archive:是否進行歸檔,默認爲yes,至關於同時開啓recursive,links,perms,times,owner,group -D等選項 - checksum:是否校驗和 - copy_links:是否複製連接文件 - delete:刪除源中沒有而目標存在的文件 - dest_port: 對方用於接收的端口 - dirs: 非遞歸傳輸目錄 - mode:模式,推和拉模式, push | pull ,默認爲push(推) - src:同步的數據源的位置 - rsync_opts: 指定rsync的選項,多個選項能夠用逗號分隔 - dest:目標文件 - compress: 默認爲yes,表示在文件同步過程當中是否啓用壓縮
# 例子 ansible test -m synchronize -a 'src=/etc/yum.repos.d/epel.repo dest=/tmp/epel.repo' -k # rsync 傳輸文件 ansible test -m synchronize -a 'src=/tmp/123/ dest=/tmp/456/ delete=yes' -k # 相似於 rsync --delete ansible test -m synchronize -a 'src=/tmp/123/ dest=/tmp/test/ rsync_opts="-avz,--exclude=passwd"' -k # 同步文件,添加rsync的參數-avz,而且排除passwd文件 ansible test -m synchronize -a 'src=/tmp/test/abc.txt dest=/tmp/123/ mode=pull' -k # 把遠程的文件,拉到本地的/tmp/123/目錄下
用於磁盤掛載相關操做
# 參數 - fstype:掛載文件的類型 - name:掛載點 - opts:傳遞給mount命令的參數 - src:要掛載的文件 - state: - present:只會在 fstab 中添加,不會操做磁盤 - mounted:自動建立掛載點並掛載 - unmounted:卸載 - absent:只會在 fstab 中刪除,不會操做磁盤 # 例子 ansible test -m mount -a 'fstype=ext4 src=/dev/loop0 name=/aaa state=mounted' -k # 掛在/dev/loop0 設備
模版,用於將模版文件渲染後,輸出到遠程主機上,模版文件通常以.j2爲結尾,標識其是一個jinja2模版文件
# 參數 - src:模版文件的路徑 - dest:拷貝到遠程主機上的位置 - mode:權限 - attributes: 特殊權限 相似於 chattr - force:存在覆蓋 - group:屬組 - owner:屬主
從互聯網下載數據到本地,做用相似於Linux下的curl命令。
# 參數 - url:必傳參數,文件的下載地址 - dest:必傳參數,文件保存的絕對路徑 - mode:文件的權限mode - othes:全部file模塊裏的選項均可以在這裏使用 - checksum:文件的校驗碼 - headers:傳遞給下載服務器的 HTTP Headers - backup:若是本地已經存在同名的配置文件,先行備份 - timeout:下載的超時時間
用於解壓文件,其做用相似於Linux下的tar命令,默認狀況下unarchive的做用是將控制節點的壓縮包拷貝到遠程服務器上,而後進行解壓
# 參數 - remote_src: 用來表示須要解壓的文件存在遠程服務器中仍是本地服務器中,默認爲no,表示解壓前先將控制節點上的文件複製到遠程主機上中,而後再進行解壓。 - src:指定壓縮文件的路徑,該選項取決於remote_src的取值,若是remote_src取值爲yes,則src指定的是遠程服務器中壓縮包的地址,若是remote_src取值爲no,則src指向的是控制節點中的路徑 - dest:該選項指定的是遠程服務器上的絕對路徑,表示壓縮文件解壓的路徑 - list_files: 默認狀況下該選項的取值爲no,若是該選項取值爲yes,也會解壓縮文件,而且在ansible的返回值中列出壓縮包裏的文件; - exclude:解壓文件時排出exclude選項指定的文件或目錄列表 - keep_newer: 默認值爲False,若是該選項爲True,那麼當目標地址中存在同名文件,而且文件比壓縮包中的文件更新時,不進行覆蓋。 - owner:文件或目錄解壓之後的全部者 - group: 文件或目錄解壓之後所屬的羣組 - mode: 文件或目錄解壓之後的權限
在遠程服務器上執行git相關操做。依賴於git命令,須要在遠程主機上先進性安裝。
# 參數 - repo:遠程git庫的地址,能夠是一個git協議,ssh協議或者http協議的git庫地址 - dest:必選參數,git庫clone到本地服務器之後保存的絕對路徑 - version:克隆遠程git庫的版本,取值能夠爲HEAD,分支名稱,tag的名稱,也能夠是一個commit的hash值 - foces:默認爲no,當該選項爲yes時,若是本地git庫有修改,將會拋棄本地的修改(強制覆蓋) - accept_hostkey: 當該選項取值爲yes時,若是git庫服務器再也不know_hosts中,則添加到know_hosts中,key_file指定克隆遠程git庫地址時使用的私鑰。
用於獲取遠程服務器上的文件信息,相似於Linux下的stat命令
# 參數 - path:用於指定文件或目錄的路徑
與Linux下的sysctl命令類似,用來控制Linux內核參數
# 參數: - name:須要設置的參數 - value:須要設置的值 - sysctl_file: sysctl.conf文件的絕對路徑,默認路徑爲/etc/sysctl.conf - reload:該選項能夠取值爲 yes 或 no,默認爲yes,用於表示設置完之後是否須要實行sysctl -p的操做 # 例子 ansible test -m sysctl -a 'name=vm.overcommit_memory value=1' # 修改vm.overcommit_memory的值爲1
Ansible經過模塊來執行具體的操做,因爲模塊功能千差萬別,因此執行模塊操做後,Ansible會根據不一樣的須要返回不一樣的結果,Ansible中一些常見的返回值以下:
ansible中使用YAML基礎元素:
變量僅能由字母、數字、下劃線組成,且只能以字母開頭
1.facts
facts是由正在通訊的遠程目標主機返回的信息,這些信息被保存在ansible變量中,要獲取指定的遠程主機所所支持的facts,可使用setup模塊。
2.register(註冊器)
把任務的輸入定義爲變量,而後用於其它任務
task: - shell:/usr/bin/foo register: foo_result ignore_errors: True - name: test shell: echo ‘hello world' when: foo_result.success # wen條件判斷foo_result
3.經過命令行傳遞變量
在運行playbook的時候也能夠傳遞一些變量提供playbook使用:
ansible-playbook test.yaml --extra-vars 'hosts=www user=www'
4.經過roles傳遞變量
當給一個主機英語角色的時候,能夠傳遞變量,而後在角色內使用這些變量
- host: webservers roles: - common # common 角色 - {roles:foo_app_instance,dir:'/var/lib/html',port:8080} # 傳遞變量參數
ansible的主要功能在於批量主機操做,爲了便捷地使用其中的部分主機,能夠在Inventory file中講其分組命名,默認的Inventory file爲/etc/ansible/hosts。
1.文件格式
Inventory文件遵循INI文件風格,中括號中的字符表示組名。能夠將同一個主機同時歸併到多個不一樣的組中,此外,當若是目標主機使用了非默認的SSH端口,還能夠在主機名稱以後使用冒號加端口號來標明。
192.168.1.1 # 直接列出主機 [web] 192.168.1.2 www.daxin.com [web] db[1:3].daxin.com # 表示 db1.daxin.com db2.daxin.com db3.daxin.com # 字母或者數字是連續的那麼,可使用列表的方式進行標識
2.主機變量
能夠在 Inventory 中自定義主機時爲其添加主機變量以便於在playbook中使用
[nginx] 127.0.0.1 http_port=8080 user=daxin
PS:定義主機時傳遞的專有的變量,在playbook中能夠直接調用
3.組變量
組變量是指賦予給指定組內全部主機上的在playbook中可用的變量。
[nginx] 192.168.1.1 192.168.1.2 [nginx:vars] # 固定用法 ntp_server = ntp1.daxin.com nfs_server = nfs1.daxin.com
4.組嵌套
inventory 中,組還能夠包含其餘組,而且也能夠向組中的主機指定變量,不過,這些變量只能在ansible-playbook中使用,而ansible不支持。
[nginx] 192.168.1.1 [apache] 192.168.1.2 [web:children] # 引用其餘組做爲本身組內的主機(子組) nginx # nginx組 apache # apache組
5.inenvtory 參數
ansible基於ssh鏈接inventory中指定的遠程主機時,還能夠經過參數指定其交互方式:
- ansible_ssh_user : 用於指定管理遠程主機的賬號 - ansible_ssh_host : 用於指定被管理的主機 - ansible_ssh_port :用於指定ssh的端口 - ansible_ssh_private_key_file :指定key文件 - host_key_checking=False :當第一次鏈接主機時,會提示yes/no,跳過這次環節 - ansible_ssh_pass : 用於ssh登陸的密碼 - ansible_sudo_pass : 用於用戶sudo時的密碼 - ansible_connection : 鏈接客戶端的類型(local,ssh,paramiko), 1.2版本之前模式爲paramiko,後面版本爲ssh
若是須要根據變量,facts或此前任務的執行結果來作爲某task執行與否的前提時要用到條件測試。
when語句:在task後添加when子句便可使用條件測試:when語句支持Jinja2表達式語法
tasks: - name: 'shutdown redhat system' command: /sbin/shutdown -h now when: ansible_os_family == 'redhat' # ansible_os_family 是 setup中收集到的信息,這裏能夠直接進行調用
當有須要重複性執行的任務時,可使用迭代機制,其使用格式爲將須要迭代的內容定義爲item變量引用,並經過with_items語句來指明迭代的元素列表便可。
tasks: - name: add user user: name={{ item }} state=present groups=wheel # 必需要用 {{item}} 來表示迭代。 with_items: - daxin1 - daxin2 # 等同於: tasks: - name: add user user: name=daxin1 state=present groups=wheel - name: add user user: name=daxin2 state=present groups=wheel
事實上,with_items中還可使用元素爲hashes,例如:
tasks: - name: add users user: name={{item.name}} state=parsent groups={{items.group}} with_items: - {name:'daxin',group='daxin'} - {name:'daxin2',group='daxin2'}
注意:with_items中的列表值也能夠是字典,但引用時要使用item.key
playbook是由一個或多個play組成的列表。play的主要功能在於將事先歸併爲一組的主機裝扮成經過ansible中的task定義好的角色。從根本上講,所謂task無非是調用ansible的一個module。將多個play組織在一個playbook中,便可讓他們聯合起來按事先編排的機制完成某一任務。
PS:有一個形象的好比,Ansible中的模塊相似於Linux下的命令,而Ansible的Playbook則相似於Linux下的shell腳本。Shell腳本將各個Linux命令組合起來,以此實現複雜的功能。
在Ansible中,一個play必須包含兩部份內容,hosts,tasks,play配置文件例如:
[root@linux-node2 ~]# cat httpd.yaml --- #yaml的默認開頭格式 - hosts: test user: root vars: - info: 'hello world' tasks: - name: setup a infomation # task名稱 copy: dest=/tmp/info content="{{info}}" notify: say something handlers: - name: say something # handlers名稱 command: echo 'copy ok'
一個playbook針對配置區域劃分,主要分爲4類:
細化一點的話playbook的結構爲:
Inventory:操做的主機 * Modules:使用的模塊 * Ad Hoc Commands:在主機上指定的命令 Playbooks Tasks:任務,即調用模塊完成的某操做 * Variables:變量 Templates:模板 Handlers:處理器,由某事件觸發完成的操做 Roles:角色
- hosts:定義遠程的主機組 - user:執行該任務的用戶 - remote_user: 遠端運行該play的用戶,能夠細分到每個task - *sudo:若是設置爲yes,執行該任務組的用戶在執行任務的時候,獲取root權限 - *sudo_user: 若是你設置user爲tom,速度設置爲yes,sudo_user爲jerry,則tom用戶則會獲取jerry用戶的權限 - connection:經過什麼方式鏈接到遠程主機,默認爲ssh - become:是否提權 - become_method: 提權得方式(sudo) - notify:當任務執行完畢後,通知handler section 中的任務模塊(出發執行) - set_fact: 模塊能夠自定義facts,這些自定義的facts能夠經過template或者變量的方式在playbook中使用。若是你想要獲取一個進程使用的內存的百分比,則必須經過set_fact來進行計算以後得出其值,並將其值在playbook中引用。set_fact: innodb_buffer_pool_size_mb="{{ ansible_memtotal_mb / 2 }}" - gather_facts:除非你明確說明不須要在遠程主機上執行setup模塊,不然會默認自動執行。若是你的確不須要setup模塊所傳遞過來的變量,你能夠啓用該選項 # 可使用setup獲取到的字典中的key,來渲染對應的值 # 當值的類型爲字典嵌套時,可使用點來進行深刻查找 {{ansible_eth0.ipv4.address}} # 當值的類型爲列表時,{{ansible[0].xxx}}
- vars:定義一個變量。key:value,多個變量,可使用{key:value,key2:value2} - vars_files:定義一個變量文件。這裏列出變量文件的絕對路徑便可。 變量文件中的直接使用key:value定義便可。 - vars_prompt: 經過交互的方式輸入的值 - name:變量的值 - prompt:提示信息 - private:是否爲私有變量,yes | no, yes時輸入的變量不在屏幕上顯示,不然會顯示在屏幕上
play的主體部分是task list,task list中的各任務被按次序諸葛在hosts中 指定的全部主機上運行,即在全部主機上完成第一個任務後再開始第二個.在運行自上而下某個playbook時,若是中途發生錯誤,全部已執行任務均可以能回滾,所以,在更正playbook後從新執行一次便可.
task的目的是使用指定的參數運行模塊,而在模塊參數中可使用變量,模塊執行是冪等的,這意味着屢次執行是安全的,由於其結果一致.
每一個task都應該有其name,用於playbook的執行結果輸出,建議其內容儘量清晰的描述任務執行步驟。若是未提供name,則action的結果將用於輸出。
定義任務的三種方式
# 方式1(action) - name: task的名稱 action:要作的操做 # 例如: action: yum name= httpd state=installed # 方式2(直接寫模塊名) - name: task的名稱 copy: src=files/httpd.conf dest=/etc/httpd/conf/httpd.conf # 方式3(模塊名時,模塊的參數也能夠用下列方式使用) - name: task的名稱 service: name:httpd state:restarted
在衆多模塊中只有command和shel模塊僅須要給定一個列表而無需使用key=value格式
tasks: - name: disable selinux command: /sbin/setenforce 0
若是命令或腳本的輸出碼不以0,可使用以下方式替代
tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand || /bin/true # 強行成功
或者使用ignore_errors來忽略錯誤信息
tasks: - name: run this command and ignore the result shell: /usr/bin/somecommand ignote_errors:True
經常使用參數:
- ignote_errors: 是否忽略錯誤 - register: 註冊變量,即把當前任務的結果註冊到register指定的變量後,在後續的task中能夠進行調用,或者判斷 - when:當when後面的條件爲真時纔會執行當前task,通常配合register來作,固然,when也能夠讀取變量
# when支持多條件
# 一、當多個條件是列表時,它們之間是而且的關係 when: - ansible_distribution == "Centos" - ansible_distribution == "ubuntu" # 二、若是要表達更復雜的關係,能夠用and/or, when: (ansible_distribution == "Centos" and ansible_distribution_major_version == "6" ) or (ansible_distribution == "ubuntu")
用於當關注的醫院發生變化時採起必定的操做
- Handlers 也是一些 task 的列表,經過名字來引用,它們和通常的 task 並無什麼區別。
- Handlers 是由通知者進行 notify, 若是沒有被 notify,handlers 不會執行。
- 無論有多少個通知者進行了 notify,等到 play 中的全部 task 執行完成以後,handlers 也只會被執行一次。
- Handlers 最佳的應用場景是用來重啓服務,或者觸發系統重啓操做.除此之外不多用到了。
例子:
tasks: - name: template configuration file template: src=template.j2 dest=/etc/configuration.conf notify: - restart memcached handlers: - name: restart memcached service: name=memcached state=restart
playbook須要使用ansible-playbook來運行,它具備ansible的部分參數,以及本身獨有的參數:
tags: 在playbook中,能夠爲某個任務或某些任務定義一個「標籤」,在執行此playbook時,經過爲ansible-playbook 使用 --tags選項能實現僅指定的tasks,而非全部的。
tasks: - name: user add user: name='daxin' state=parsent - name: config file file: src=/tmp/daxin.txt dest=/tmp/daxin.txt tags: - copyfile # 運行時 ansible-playbook test.yaml --tags='copyfile'
include:在playbook中,通常狀況下,一個yaml文件包含一個play,好比我要同時安裝db.yaml 和 web.yaml,那麼咱們能夠用include的方式來進行聚合
cat all.yaml --- - include:db.yaml - include:web.yaml
這時只須要執行all.yaml便可。 ansible all all.yaml
strategy: free,任務策略
默認狀況下,ansible是按照順序執行task的,當匹配到的全部主機執行完task1後,再繼續指定task2。
從Ansible 2.0開始,ansible支持free的任務執行策略,容許較快的遠程服務器提早完成play的部署,不用等待其餘遠程服務器一塊兒執行task。
更多知識: https://github.com/lorin/ansible-quickref
ansible自1.2版本引入的新特性,用於層次性、結構化地組織playbook,roles可以根據層次型結構自動裝載變量文件、tasks以及handles等。要使用roles,只須要在playbook中使用include指令便可。簡單來說,roles就是經過分別將變量、文件、任務、模塊及處理器放置於單獨的目錄中,並能夠便捷的經過include它們的一種機制。角色通常用於基於主機構建服務的場景中,但也能夠是用於構建守護進程等場景中。
建立roles的步驟
role內各目錄中的文件說明
tasks目錄:至少應該包含一個main.yml的文件,其定義了此角色的任務列表;此文件可使用include包含其餘的位於此目錄的task文件 files目錄:存放由copy或script等模塊調用的文件 templates目錄:templates模塊會自動在此目錄中尋找Jinja2模版文件 handlers目錄:此目錄中應該包含一個main.yml yml文件,用於定義此角色用到的各handler,在handler中使用include包含的其餘handler文件也應該位於此目錄中 vars目錄:應當包含一個main.yml文件,用於定義此角色用到的變量 meta目錄:應當包含一個main.yml文件,用於定於此角色的特殊設定及依賴關係,ansible1.3 之後才支持 default目錄: 爲當前角色設定默認變量時使用此目錄,應當包含一個main.yml文件
例子:
# 目錄結構: ├── db.yaml └── roles └── db ├── files ├── handler ├── tasks │ └── main.yml ├── templates │ └── my.cnf.j2 └── vars └── main.yml # db.yaml 文件 - hosts: test roles: - db # tasks.main.yml 文件 --- - name: Install MySQL yum: name: mariadb-server state: present - name: copy File template: src: "my.cnf.j2" dest: "/etc/my.cnf" - name: Start MySQL service: name: mariadb state: started # vars.main.yml 文件 --- mysql_port: 3307 # templates.my.cnf.j2 文件 [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 port = {{ mysql_port }} bind = {{ ansible_all_ipv4_addresses[0] }} [mysqld_safe] log-error=/var/log/mariadb/mariadb.log pid-file=/var/run/mariadb/mariadb.pid
# 運行
ansible-playbook -i hosts db.yaml
咱們能夠利用ansible-galaxy來快速建立並初始化一個roles
ansible-galaxy init roles/mysql
咱們在galaxy.ansible.com 上找到適合本身的roles時,只須要運行 ansible-galaxy install 做者id.角色包名稱便可完成安裝
# 安裝別人寫好的roles:(galaxy.ansible.com) ansible-galaxy install -p /etc/ansible/roles bennojoy.mysql # 安裝到指定目錄 ansible-galaxy -p ./roles install bennojoy.ntp
默認狀況下role存放在/etc/ansible/roles目錄,也能夠在ansible.cfg 中 使用 roles_path ,來制定roles的目錄
列出已經安裝的roles:
ansible-galaxy list
查看已安裝的roles信息:
ansible-galaxy info bennojoy.mysql
卸載roles:
ansible-galaxy remove bennojoy.mysql