Linux:ansible-playbook配置文件(劇本)_ansible-playbook -i參數-CSDN博客https://blog.csdn.net/w14768855/article/details/132579492?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170930036016800215061982%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=170930036016800215061982&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-132579492-null-null.nonecase&utm_term=ansible&spm=1018.2226.3001.4450上面這個鏈接是基礎文章
如果把ansible的模塊比喻成linux命令,那么咱的playbook就好比是shell腳本
Playbook介紹?
Playbook
與ad-hoc
相比,是一種完全不同的運用ansible的方式,類似與saltstack
的state
狀態文件。ad-hoc
無法持久使用,playbook
可以持久使用。playbook
是由一個或多個play
組成的列表,play
的主要功能在于將事先歸并為一組的主機裝扮成事先通過ansible
中的task
定義好的角色。從根本上來講,所謂的task
無非是調用ansible
的一個module
。將多個play
組織在一個playbook
中,即可以讓它們聯合起來按事先編排的機制完成某一任務
Playbook核心元素?
- Hosts 執行的遠程主機列表
- Tasks 任務集
- Variables 內置變量或自定義變量在playbook中調用
- Templates 模板,即使用模板語法的文件,比如配置文件等
- Handlers 和notity結合使用,由特定條件觸發的操作,滿足條件方才執行,否則不執行
- tags 標簽,指定某條任務執行,用于選擇運行playbook中的部分代碼。
Playbook語法?
playbook
使用yaml
語法格式,后綴可以是yaml
,也可以是yml
。
- 在單一一個
playbook
文件中,可以連續三個連子號(---
)區分多個play
。還有選擇性的連續三個點好(...
)用來表示play
的結尾,也可省略。- 次行開始正常寫
playbook
的內容,一般都會寫上描述該playbook
的功能。- 使用#號注釋代碼。
- 縮進必須統一,不能空格和
tab
混用。- 縮進的級別也必須是一致的,同樣的縮進代表同樣的級別,程序判別配置的級別是通過縮進結合換行實現的。
YAML
文件內容和Linux
系統大小寫判斷方式保持一致,是區分大小寫的,k/v
的值均需大小寫敏感k/v
的值可同行寫也可以換行寫。同行使用:分隔。v
可以是個字符串,也可以是一個列表- 一個完整的代碼塊功能需要最少元素包括
name: task
1.簡單的示例
由于這不是是基礎章,里面的寫法我就大概進行一個介紹了
?
hosts是指定哪些主機執行
remote_user是遠程主機執行的用戶
tasks下面就是一個任務列表,里面包含了一些任務模塊
name就是一個類似聲明的一個操作
name下面的就是各個模塊加上他的參數?
---
- hosts : allremote_user : roottasks :- name : 寫入開機自動掛載鏡像mount : src=/dev/cdrom path=/mnt fstype=iso9660 state=present- name : 掛載鏡像mount : src=/dev/cdrom path=/mnt fstype=iso9660 state=mounted- name : 搭建yum倉庫yum_repository : name=local description="local" baseurl=file:///mnt enabled=1 gpgcheck=no file=tarro- name : 下載httpdyum : name=httpd state=installed- name : 啟動httpdservice : name=httpd state=started- name : 修改indexcopy : content="KALItarro" dest=/var/www/html/index.html
...
2.主機與用戶
可以看到我們一開始寫了在被管理機上執行的用戶,我們除了在開頭寫還可以在下面寫,如圖
除了在里面可以指定某條模塊執行的角色以外還可以使用sudo進行一個授權執行?????????
?
3.觸發器與動作
Handlers(動作)與Notify(觸發)?
?這倆非常好理解,觸發器就是我們在某處觸發,觸發我們指定下面的某個動作
動作就是一般寫在文件最下面,我們在上面通過動作名稱去觸發,觸發了就執行指定的動作
很多時候當我們某一個配置發生改變,我們需要重啟服務,(比如httpd配置文件文件發生改變了)這時候就可以用到handlers和notify了;(當發生改動時)notify actions會在playbook的每一個task結束時被觸發,而且即使有多個不同task通知改動的發生,notify actions知會被觸發一次;比如多個resources指出因為一個配置文件被改動,所以apache需要重啟,但是重新啟動的操作知會被執行一次
---
- hosts : allremote_user : roottasks:- name : "先對http的端口進行修改后,再通過觸發器去執行動作"shell : sed -i 's/Listen 80/Listen 8080/g' /etc/httpd/conf/httpd.confnotify :- restart httpdhandlers :- name : restart httpdservice : name=httpd state=restarted
...
?通過在上面的觸發,直接觸發了下面的對應名稱的動作
4.playbook中的變量
命令行指定變量?
執行playbook時候通過參數-e傳入變量,這樣傳入的變量在整個playbook中都可以被調用,屬于全局變量
---
- hosts: allremote_user: roottasks:- name : "安裝指定的變量名的軟件"yum : name={{ a }} state=installed
...
ansible-playbook -e "a=httpd" ins.yaml
使用這條命令的時候使用了-e傳入變量
hosts文件中定義變量?
/etc/ansible/hosts?
---
- hosts: 192.168.6.2remote_user: root tasks:- name: "b=lrzsz變量"yum: name={{ b }} state=installed
...
---
- hosts: allremote_user: root tasks:- name: "a=httpd"yum: name={{ a }} state=installed
...
playbook文件中定義變量
---
- hosts: allremote_user: rootvars:a: httpdb: lrzsztasks:- name: "a=httpd"yum: name={{ a }} state=installed- name: "b=lrzsz"yum: name={{ b }} state=installed
...
?
重新定義原有變量?
?
?我這里有個名為pkg的變量,默認是安裝gcc的一個變量,我只需在執行時候去通過命令重新定義變量即可完成替換
ansible-playbook -e "pkg=httpd" 1.yaml
?
這樣就被定義成為新變量了
在其他文件中定義變量
我創建了一個名為var.yaml的文件并寫入了
?
這兩個內容
我再去修改一下playbook文件導入一下變量
?
?模塊自帶變量
playbook同樣可以調用內部的一些自帶變量,如setup模塊里的一些
?
標簽
一個playbook文件中,執行時如果想執行某一個任務,那么可以給每個任務集進行打標簽,這樣在執行的時候可以通過-t選擇指定標簽執行,還可以通過--skip-tags選擇除了某個標簽外全部執行等。
?
tags下面的就是標簽,并且可以搭配變量如in{{ na }}? 就是inhttpd? ? ,還可以打多個標簽
?當我們想正常依次執行playbook直接執行就行了
ansible-playbook 3.yaml
我這個playbook中包含了安裝,開啟,重啟,假設我就像執行這個劇本里的開啟,我可以通過標簽這樣操作
ansible-playbook -t sthttpd 3.yaml
這樣就 只執行了一個
如果我們現在不想執行開啟httpd
ansible-playbook --skip-tags sthttpd 3.yaml
?那么現在就只執行安裝和重啟
如果現在不想執行開啟和重啟
ansible-playbook --skip-tags sthttpd,rehttpd 3.yaml
?可以通過? “,” 去隔開
Playbook中模板的使用?
template模板為我們提供了動態配置服務,使用jinja2語言,里面支持多種條件判斷、循環、邏輯運算、比較操作等。其實說白了也就是一個文件,和之前配置文件使用copy一樣,只是使用copy,不能根據服務器配置不一樣進行不同動態的配置。這樣就不利于管理。說明:1、多數情況下都將template文件放在和playbook文件同級的templates目錄下(手動創建),這樣playbook文件中可以直接引用,會自動去找這個文件。如果放在別的地方,也可以通過絕對路徑去指定。2、模板文件后綴名為.j2。
實例:
?4.yaml里的內容是使用123.j2模板? 將模板傳輸到被管機上的/opt目錄下名為321
?
?123.j2里面的內容如下
執行一下playbook ,到被管理機器上看一下
?
?
template之when
條件測試:如果需要根據變量、facts或此前任務的執行結果來做為某task執行與否的前提時要用到條件測試,通過when語句執行,在task中使用jinja2的語法格式、when語句:在task后添加when子句即可使用條件測試;when語句支持jinja2表達式語法。
?
---
- hosts: testAtasks:- name: 我要輸出dgfshell: echo -n "dgf"register: xingmingignore_errors: True- name: 我要判斷file: name=/alex state=directorywhen: xingming is success
?修改playbook
文件,通過setup模塊獲取系統版本去判斷
---
- hosts: allremote_user: rootvars:- listen_port: 88tasks:- name: Install Httpdyum: name=httpd state=installed- name: Config System6 Httpdtemplate: src=httpd6.conf.j2 dest=/etc/httpd/conf/httpd.confwhen: ansible_distribution_major_version == "6" #判斷系統版本,為6便執行上面的template配置6的配置文件notify: Restart Httpd- name: Config System7 Httpdtemplate: src=httpd7.conf.j2 dest=/etc/httpd/conf/httpd.confwhen: ansible_distribution_major_version == "7" #判斷系統版本,為7便執行上面的template配置7的配置文件notify: Restart Httpd- name: Start Httpdservice: name=httpd state=startedhandlers:- name: Restart Httpdservice: name=httpd state=restarted
?
template之with_items
?
上面的意思就是依次安裝httpd vsftpd? nginx
---
- hosts: allremote_user: roottasks:- name: Create New Groupgroup: name={{ item }} state=presentwith_items: - group1- group2- group3 - name: Create New Useruser: name={{ item.name }} group={{ item.group }} state=presentwith_items:- { name: 'user1', group: 'group1' } - { name: 'user2', group: 'group2' } - { name: 'user3', group: 'group3' }
?這個案例是把用戶加入不同的用戶組
template之for if
?實例:
---
- hosts: allremote_user: rootvars:nginx_vhosts:- web1:listen: 8081server_name: "web1.example.com"root: "/var/www/nginx/web1"- web2:listen: 8082server_name: "web2.example.com"root: "/var/www/nginx/web2"- web3:listen: 8083server_name: "web3.example.com"root: "/var/www/nginx/web3"tasks:- name: Templage Nginx Configtemplate: src=nginx.conf.j2 dest=/tmp/nginx_vhost.conf
模板文件編寫
{% for vhost in nginx_vhosts %}server{listen: {{ vhost.listen }};server_name: {{ vhost.server_name }};root: {{ vhost.root }};
}
{% endfor %}
?