Ansible 劇本快速入門(mén)指南
我們已經(jīng)寫(xiě)了兩篇關(guān)于 Ansible 的文章,這是第三篇。
如果你是 Ansible 新手,我建議你閱讀下面這兩篇文章,它會(huì)教你一些 Ansible 的基礎(chǔ)以及它是什么。
如果你已經(jīng)閱讀過(guò)了,那么在閱讀本文時(shí)你才不會(huì)感到突兀。
什么是 Ansible 劇本?
劇本比點(diǎn)對(duì)點(diǎn)命令模式更強(qiáng)大,而且完全不同。
它使用了 /usr/bin/ansible-playbook 二進(jìn)制文件,并且提供豐富的特性使得復(fù)雜的任務(wù)變得更容易。
如果你想經(jīng)常運(yùn)行一個(gè)任務(wù),劇本是非常有用的。此外,如果你想在服務(wù)器組上執(zhí)行多個(gè)任務(wù),它也是非常有用的。
劇本是由 YAML 語(yǔ)言編寫(xiě)。YAML 代表一種標(biāo)記語(yǔ)言,它比其它常見(jiàn)的數(shù)據(jù)格式(如 XML 或 JSON)更容易讀寫(xiě)。
下面這張 Ansible 劇本流程圖將告訴你它的詳細(xì)結(jié)構(gòu)。
理解 Ansible 劇本的術(shù)語(yǔ)
- 控制節(jié)點(diǎn):Ansible 安裝的機(jī)器,它負(fù)責(zé)管理客戶端節(jié)點(diǎn)。
- 受控節(jié)點(diǎn):控制節(jié)點(diǎn)管理的主機(jī)列表。
- 劇本:一個(gè)劇本文件包含一組自動(dòng)化任務(wù)。
- 主機(jī)清單:這個(gè)文件包含有關(guān)管理的服務(wù)器的信息。
- 任務(wù):每個(gè)劇本都有大量的任務(wù)。任務(wù)在指定機(jī)器上依次執(zhí)行(一個(gè)主機(jī)或多個(gè)主機(jī))。
- 模塊: 模塊是一個(gè)代碼單元,用于從客戶端節(jié)點(diǎn)收集信息。
- 角色:角色是根據(jù)已知文件結(jié)構(gòu)自動(dòng)加載一些變量文件、任務(wù)和處理程序的方法。
- 動(dòng)作:每個(gè)劇本含有大量的動(dòng)作,一個(gè)動(dòng)作從頭到尾執(zhí)行一個(gè)特定的自動(dòng)化。
- 處理程序: 它可以幫助你減少在劇本中的重啟任務(wù)。處理程序任務(wù)列表實(shí)際上與常規(guī)任務(wù)沒(méi)有什么不同,更改由通知程序通知。如果處理程序沒(méi)有收到任何通知,它將不起作用。
基本的劇本是怎樣的?
下面是一個(gè)劇本的模板:
--- [YAML 文件應(yīng)該以三個(gè)破折號(hào)開(kāi)頭]- name: [腳本描述]hosts: group [添加主機(jī)或主機(jī)組]become: true [如果你想以 root 身份運(yùn)行任務(wù),則標(biāo)記它]tasks: [你想在任務(wù)下執(zhí)行什么動(dòng)作]- name: [輸入模塊選項(xiàng)]module: [輸入要執(zhí)行的模塊]module_options-1: value [輸入模塊選項(xiàng)]module_options-2: value.module_options-N: value
如何理解 Ansible 的輸出
Ansible 劇本的輸出有四種顏色,下面是具體含義:
- 綠色:
ok代表成功,關(guān)聯(lián)的任務(wù)數(shù)據(jù)已經(jīng)存在,并且已經(jīng)根據(jù)需要進(jìn)行了配置。 - 黃色:
changed指定的數(shù)據(jù)已經(jīng)根據(jù)任務(wù)的需要更新或修改。 - 紅色:
FAILED如果在執(zhí)行任務(wù)時(shí)出現(xiàn)任何問(wèn)題,它將返回一個(gè)失敗消息,它可能是任何東西,你需要相應(yīng)地修復(fù)它。 - 白色:表示有多個(gè)參數(shù)。
為此,創(chuàng)建一個(gè)劇本目錄,將它們都放在同一個(gè)地方。
$ sudo mkdir /etc/ansible/playbooks
劇本-1:在 RHEL 系統(tǒng)上安裝 Apache Web 服務(wù)器
這個(gè)示例劇本允許你在指定的目標(biāo)機(jī)器上安裝 Apache Web 服務(wù)器:
$ sudo nano /etc/ansible/playbooks/apache.yml---- hosts: webbecome: yesname: "Install and Configure Apache Web server"tasks:- name: "Install Apache Web Server"yum:name: httpdstate: latest- name: "Ensure Apache Web Server is Running"service:name: httpdstate: started
$ ansible-playbook apache1.yml
如何理解 Ansible 中劇本的執(zhí)行
使用以下命令來(lái)查看語(yǔ)法錯(cuò)誤。如果沒(méi)有發(fā)現(xiàn)錯(cuò)誤,它只顯示劇本文件名。如果它檢測(cè)到任何錯(cuò)誤,你將得到一個(gè)如下所示的錯(cuò)誤,但內(nèi)容可能根據(jù)你的輸入文件而有所不同。
$ ansible-playbook apache1.yml --syntax-checkERROR! Syntax Error while loading YAML.found a tab character that violate indentationThe error appears to be in '/etc/ansible/playbooks/apache1.yml': line 10, column 1, but maybe elsewhere in the file depending on the exact syntax problem.The offending line appears to be:state: latest^ hereThere appears to be a tab character at the start of the line.YAML does not use tabs for formatting. Tabs should be replaced with spaces.For example:- name: update toolingvars:version: 1.2.3# ^--- there is a tab there.Should be written as:- name: update toolingvars:version: 1.2.3# ^--- all spaces here.
或者,你可以使用這個(gè) URL YAML Lint 在線檢查 Ansible 劇本內(nèi)容。
執(zhí)行以下命令進(jìn)行“演練”。當(dāng)你運(yùn)行帶有 --check 選項(xiàng)的劇本時(shí),它不會(huì)對(duì)遠(yuǎn)程機(jī)器進(jìn)行任何修改。相反,它會(huì)告訴你它將要做什么改變但不是真的執(zhí)行。
$ ansible-playbook apache.yml --checkPLAY [Install and Configure Apache Webserver] ********************************************************************TASK [Gathering Facts] *******************************************************************************************ok: [node2.2g.lab]ok: [node1.2g.lab]TASK [Install Apache Web Server] *********************************************************************************changed: [node2.2g.lab]changed: [node1.2g.lab]TASK [Ensure Apache Web Server is Running] ***********************************************************************changed: [node1.2g.lab]changed: [node2.2g.lab]PLAY RECAP *******************************************************************************************************node1.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0node2.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
如果你想要知道 ansible 劇本實(shí)現(xiàn)的詳細(xì)信息,使用 -vv 選項(xiàng),它會(huì)展示如何收集這些信息。
$ ansible-playbook apache.yml --check -vvansible-playbook 2.9.2config file = /etc/ansible/ansible.cfgconfigured module search path = ['/home/daygeek/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']ansible python module location = /usr/lib/python3.8/site-packages/ansibleexecutable location = /usr/bin/ansible-playbookpython version = 3.8.1 (default, Jan 8 2020, 23:09:20) [GCC 9.2.0]Using /etc/ansible/ansible.cfg as config filePLAYBOOK: apache.yml *****************************************************************************************************1 plays in apache.ymlPLAY [Install and Configure Apache Webserver] ****************************************************************************TASK [Gathering Facts] ***************************************************************************************************task path: /etc/ansible/playbooks/apache.yml:2ok: [node2.2g.lab]ok: [node1.2g.lab]META: ran handlersTASK [Install Apache Web Server] *****************************************************************************************task path: /etc/ansible/playbooks/apache.yml:6changed: [node2.2g.lab] => {"changed": true, "msg": "Check mode: No changes made, but would have if not in check mode", "rc": 0, "results": ["Installed: httpd"]}changed: [node1.2g.lab] => {"changed": true, "changes": {"installed": ["httpd"], "updated": []}, "msg": "", "obsoletes": {"urw-fonts": {"dist": "noarch", "repo": "@anaconda", "version": "2.4-16.el7"}}, "rc": 0, "results": []}TASK [Ensure Apache Web Server is Running] *******************************************************************************task path: /etc/ansible/playbooks/apache.yml:10changed: [node1.2g.lab] => {"changed": true, "msg": "Service httpd not found on host, assuming it will exist on full run"}changed: [node2.2g.lab] => {"changed": true, "msg": "Service httpd not found on host, assuming it will exist on full run"}META: ran handlersMETA: ran handlersPLAY RECAP ***************************************************************************************************************node1.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0node2.2g.lab : ok=3 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
劇本-2:在 Ubuntu 系統(tǒng)上安裝 Apache Web 服務(wù)器
這個(gè)示例劇本允許你在指定的目標(biāo)節(jié)點(diǎn)上安裝 Apache Web 服務(wù)器。
$ sudo nano /etc/ansible/playbooks/apache-ubuntu.yml---- hosts: webbecome: yesname: "Install and Configure Apache Web Server"tasks:- name: "Install Apache Web Server"yum:name: apache2state: latest- name: "Start the Apache Web Server"service:name: apaceh2state: started- name: "Enable mod_rewrite module"apache2_module:name: rewritestate: presentnotify:- start apachehandlers:- name: "Ensure Apache Web Server is Running"service:name: apache2state: restartedenabled: yes
劇本-3:在 Red Hat 系統(tǒng)上安裝軟件包列表
這個(gè)示例劇本允許你在指定的目標(biāo)節(jié)點(diǎn)上安裝軟件包。
方法-1:
$ sudo nano /etc/ansible/playbooks/packages-redhat.yml---- hosts: webbecome: yesname: "Install a List of Packages on Red Hat Based System"tasks:- name: "Installing a list of packages"yum:name:- curl- httpd- nano- htop
方法-2:
$ sudo nano /etc/ansible/playbooks/packages-redhat-1.yml---- hosts: webbecome: yesname: "Install a List of Packages on Red Hat Based System"tasks:- name: "Installing a list of packages"yum: name={{ item }} state=latestwith_items:- curl- httpd- nano- htop
方法-3:使用數(shù)組變量
$ sudo nano /etc/ansible/playbooks/packages-redhat-2.yml---- hosts: webbecome: yesname: "Install a List of Packages on Red Hat Based System"vars:packages: [ 'curl', 'git', 'htop' ]tasks:- name: Install a list of packagesyum: name={{ item }} state=latestwith_items: "{{ packages }}"
劇本-4:在 Linux 系統(tǒng)上安裝更新
這個(gè)示例劇本允許你在基于 Red Hat 或 Debian 的 Linux 系統(tǒng)上安裝更新。
$ sudo nano /etc/ansible/playbooks/security-update.yml---- hosts: webbecome: yesname: "Install Security Update"tasks:- name: "Installing Security Update on Red Hat Based System"yum: name=* update_cache=yes security=yes state=latestwhen: ansible_facts['distribution'] == "CentOS"- name: "Installing Security Update on Ubuntu Based System"apt: upgrade=dist update_cache=yeswhen: ansible_facts['distribution'] == "Ubuntu"




























