濰坊地區(qū)網(wǎng)站制作免費(fèi)輿情監(jiān)測(cè)平臺(tái)
playbooks概述
Ansible劇本(playbook)是用于配置、部署和管理被控節(jié)點(diǎn)的一種描述文件。通過(guò)編寫(xiě)詳細(xì)的劇本描述和執(zhí)行其中的任務(wù)(tasks),可以使遠(yuǎn)程主機(jī)達(dá)到預(yù)期的狀態(tài)。劇本由一個(gè)或多個(gè)"play"組成的列表構(gòu)成。當(dāng)需要在一臺(tái)機(jī)器上進(jìn)行多個(gè)操作時(shí),使用劇本會(huì)更加方便。使用Ansible劇本可以實(shí)現(xiàn)自動(dòng)化運(yùn)維。
playbooks組成
-
Tasks(任務(wù)):任務(wù)是劇本中最基本的組成部分,用于定義要在被控節(jié)點(diǎn)上執(zhí)行的操作。每個(gè)任務(wù)通常會(huì)調(diào)用一個(gè)或多個(gè)模塊來(lái)完成特定的功能。任務(wù)可以包括文件操作、軟件包安裝、服務(wù)管理等各種操作。即通過(guò) task 調(diào)用 ansible 的模板將多個(gè)操作組織在一個(gè) playbook 中運(yùn)行
-
Variables(變量):變量用于存儲(chǔ)和傳遞數(shù)據(jù),在劇本中可以定義各種類型的變量,包括全局變量、主機(jī)變量和組變量。變量可以在劇本的不同部分進(jìn)行引用和修改,使得劇本更加靈活和可配置。
-
Templates(模板):模板是一種用于生成配置文件或其他文本文件的機(jī)制。在劇本中可以使用Jinja2模板語(yǔ)言來(lái)定義模板,并通過(guò)填充變量的方式生成最終的文件。模板可以根據(jù)不同的主機(jī)或變量生成不同的配置文件。
-
Handlers(處理器):處理器是一種特殊的任務(wù),它會(huì)在特定的事件觸發(fā)時(shí)執(zhí)行。處理器通常用于在配置文件修改后重啟服務(wù)或執(zhí)行其他操作。當(dāng)某個(gè)任務(wù)的狀態(tài)(changed)滿足條件時(shí),可以通過(guò)(notify)關(guān)鍵字觸發(fā)執(zhí)行相應(yīng)的處理器。
-
Roles(角色):角色是一種組織和復(fù)用劇本的機(jī)制。通過(guò)定義角色,可以將相關(guān)的任務(wù)、變量和模板組織在一起,以便在多個(gè)劇本中進(jìn)行復(fù)用。角色可以使劇本更加模塊化和可維護(hù),提高代碼的復(fù)用性和可讀性。
playbooks原理
Ansible劇本(playbook)的原理是基于聲明式編程的自動(dòng)化工具。它使用YAML格式的文件來(lái)描述所需的配置和操作,然后通過(guò)Ansible引擎解析和執(zhí)行這些劇本。
下面是Ansible劇本的工作原理:
-
解析:Ansible引擎首先會(huì)解析劇本文件,將其轉(zhuǎn)換為內(nèi)部數(shù)據(jù)結(jié)構(gòu)。這個(gè)過(guò)程包括讀取和解析YAML文件,識(shí)別劇本中的任務(wù)、變量、模板等部分。
-
連接:Ansible會(huì)與被控節(jié)點(diǎn)建立SSH連接或使用其他連接插件進(jìn)行通信。這樣可以確保Ansible能夠遠(yuǎn)程執(zhí)行命令和操作被控節(jié)點(diǎn)。
-
主機(jī)選擇:根據(jù)劇本中定義的清單(Inventory),Ansible會(huì)確定要操作的目標(biāo)主機(jī)或主機(jī)組。這個(gè)過(guò)程可以根據(jù)主機(jī)的IP地址、主機(jī)名、標(biāo)簽等進(jìn)行選擇。
-
變量解析:Ansible會(huì)解析劇本中定義的變量,并根據(jù)清單中的主機(jī)和組信息進(jìn)行變量的匹配和替換。這樣可以根據(jù)不同的主機(jī)或組設(shè)置不同的變量值。
-
任務(wù)執(zhí)行:Ansible按照劇本中定義的順序執(zhí)行任務(wù)。每個(gè)任務(wù)通常會(huì)調(diào)用一個(gè)或多個(gè)模塊來(lái)完成特定的操作。模塊會(huì)在被控節(jié)點(diǎn)上執(zhí)行相應(yīng)的命令或操作,并返回執(zhí)行結(jié)果。
-
狀態(tài)管理:Ansible會(huì)跟蹤每個(gè)任務(wù)的執(zhí)行狀態(tài),包括任務(wù)是否成功、是否有變化等。這些狀態(tài)信息可以用于后續(xù)的條件判斷和處理。
-
處理器觸發(fā):當(dāng)某個(gè)任務(wù)的狀態(tài)滿足條件時(shí)(例如任務(wù)執(zhí)行成功或有變化),可以觸發(fā)相應(yīng)的處理器(Handlers)。處理器通常用于執(zhí)行一些特定的操作,如重啟服務(wù)或發(fā)送通知。
-
結(jié)果報(bào)告:在執(zhí)行完所有任務(wù)后,Ansible會(huì)生成執(zhí)行結(jié)果的報(bào)告。報(bào)告中包括每個(gè)任務(wù)的執(zhí)行狀態(tài)、變量的值等信息,以便用戶進(jìn)行查看和分析。
通過(guò)這樣的工作流程,Ansible劇本可以實(shí)現(xiàn)自動(dòng)化地配置、部署和管理被控節(jié)點(diǎn),提高運(yùn)維效率和一致性。同時(shí),Ansible的模塊化設(shè)計(jì)和豐富的模塊庫(kù),使得劇本可以適應(yīng)各種不同的場(chǎng)景和需求。
playbooks示例
vim test1.yaml---
- name: first play gather_facts: false hosts: webservers remote_user: root tasks: - name: test connection ping: - name: disable selinuxcommand: '/sbin/setenforce 0' ignore_errors: True - name: disable firewalldservice: name=firewalld state=stopped - name: install httpdyum: name=httpd state=latest- name: install configuration file for httpdcopy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf notify: "restart httpd" - name: start httpd serviceservice: enabled=true name=httpd state=startedhandlers: - name: restart httpd service: name=httpd state=restarted
##Ansible在執(zhí)行完某個(gè)任務(wù)之后并不會(huì)立即去執(zhí)行對(duì)應(yīng)的handler,而是在當(dāng)前play中所有普通任務(wù)都執(zhí)行完后再去執(zhí)行handler,這樣的好處是可以多次觸發(fā)notify,但最后只執(zhí)行一次對(duì)應(yīng)的handler,從而避免多次重啟。
這是一個(gè)使用Ansible編寫(xiě)的YAML文件,用于配置和管理Web服務(wù)器。下面是對(duì)每個(gè)部分的詳細(xì)解析:
-
---
: 這是YAML文件的分隔符,表示一個(gè)新的YAML文檔開(kāi)始,可省略 -
- name: first play
: 定義了一個(gè)名為"first play"的Play(任務(wù)集合),用于描述一組相關(guān)的任務(wù),可省略 -
gather_facts: false
: 禁用了Ansible的事實(shí)(facts)收集功能,即不收集關(guān)于目標(biāo)主機(jī)的信息,可省略 -
hosts: webservers
: 指定了這個(gè)Play要在名為"webservers"的主機(jī)組上執(zhí)行,如多個(gè)主機(jī)組用冒號(hào)分隔 -
remote_user: root
: 指定了遠(yuǎn)程執(zhí)行任務(wù)時(shí)使用的用戶名,這里是"root"。 -
tasks:
: 定義了一個(gè)任務(wù)列表,包含了一系列要執(zhí)行的任務(wù)。任務(wù)列表中的各任務(wù)按次序逐個(gè)在hosts中指定的主機(jī)上執(zhí)行 -
- name: test connection
: 自定義任務(wù)名稱,定義了一個(gè)名為"test connection"的任務(wù),用于測(cè)試與目標(biāo)主機(jī)的連接。 -
ping:
: 使用Ansible的ping模塊,向目標(biāo)主機(jī)發(fā)送一個(gè)ping請(qǐng)求,以測(cè)試連接。 -
- name: disable selinux
: 定義了一個(gè)名為"disable selinux"的任務(wù),用于禁用SELinux。 -
command: '/sbin/setenforce 0'
: 使用command模塊執(zhí)行命令/sbin/setenforce 0
,將SELinux設(shè)置為"0"(禁用)。 -
ignore_errors: True
: 如執(zhí)行命令的返回值不為0,就會(huì)報(bào)錯(cuò),tasks停止,可以忽略執(zhí)行該任務(wù)時(shí)的錯(cuò)誤,即使命令執(zhí)行失敗也不會(huì)導(dǎo)致任務(wù)失敗。 -
- name: disable firewalld
: 定義了一個(gè)名為"disable firewalld"的任務(wù),用于停止firewalld服務(wù)。 -
service: name=firewalld state=stopped
: 使用service模塊停止名為"firewalld"的服務(wù)。 -
- name: install httpd
: 定義了一個(gè)名為"install httpd"的任務(wù),用于安裝httpd軟件包。 -
yum: name=httpd state=latest
: 使用yum模塊安裝最新版本的名為"httpd"的軟件包。 -
- name: install configuration file for httpd
: 定義了一個(gè)名為"install configuration file for httpd"的任務(wù),用于安裝httpd的配置文件。 -
copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf
: 使用copy模塊將源文件"/opt/httpd.conf"復(fù)制到目標(biāo)位置"/etc/httpd/conf/httpd.conf"。 -
notify: "restart httpd"
: 當(dāng)任務(wù)執(zhí)行成功后,發(fā)送一個(gè)通知給名為"restart httpd"的處理程序。 -
- name: start httpd service
: 定義了一個(gè)名為"start httpd service"的任務(wù),用于啟動(dòng)httpd服務(wù)。 -
service: enabled=true name=httpd state=started
: 使用service模塊啟用并啟動(dòng)名為"httpd"的服務(wù)。 -
handlers:
: 定義了一個(gè)處理程序列表,包含了一系列處理程序。 -
- name: restart httpd
: 定義了一個(gè)名為"restart httpd"的處理程序,用于重新啟動(dòng)httpd服務(wù)。 -
service: name=httpd state=restarted
: 使用service模塊重新啟動(dòng)名為"httpd"的服務(wù)。
這個(gè)YAML文件的目標(biāo)是在"webservers"主機(jī)組上執(zhí)行一系列任務(wù),包括測(cè)試連接、禁用SELinux、停止firewalld服務(wù)、安裝httpd軟件包、安裝httpd的配置文件,并最后啟動(dòng)httpd服務(wù)。在任務(wù)執(zhí)行成功后,會(huì)觸發(fā)一個(gè)處理程序來(lái)重新啟動(dòng)httpd服務(wù)。
運(yùn)行playbooks
ansible-playbook test1.yaml
執(zhí)行該命令時(shí),Ansible將連接到目標(biāo)主機(jī)并按照playbook中定義的順序執(zhí)行任務(wù)。
運(yùn)行playbook時(shí),可以使用ansible-playbook
命令加上相應(yīng)的參數(shù)來(lái)執(zhí)行。
-
-k
(--ask-pass
): 該參數(shù)用于交互式地輸入SSH密碼。當(dāng)遠(yuǎn)程主機(jī)需要密碼進(jìn)行身份驗(yàn)證時(shí),會(huì)提示你輸入密碼。 -
-K
(--ask-become-pass
): 該參數(shù)用于交互式地輸入sudo密碼。當(dāng)需要提升權(quán)限執(zhí)行任務(wù)時(shí),會(huì)提示你輸入sudo密碼。 -
-u <username>
: 該參數(shù)用于指定執(zhí)行任務(wù)時(shí)使用的用戶名??梢酝ㄟ^(guò)-u
參數(shù)后跟用戶名來(lái)指定執(zhí)行任務(wù)的用戶。
ansible-playbook test1.yaml --syntax-check #檢查yaml文件的語(yǔ)法是否正確
ansible-playbook test1.yaml --list-task #檢查tasks任務(wù)
ansible-playbook test1.yaml --list-hosts #檢查生效的主機(jī)
ansible-playbook test1.yaml --start-at-task='install httpd' #指定從某個(gè)task開(kāi)始運(yùn)行
-
--syntax-check
: 使用該參數(shù)可以檢查YAML文件的語(yǔ)法是否正確,而不執(zhí)行任務(wù)。這對(duì)于在運(yùn)行playbook之前驗(yàn)證文件的正確性非常有用。 -
--list-task
: 使用該參數(shù)可以列出playbook中的所有任務(wù)(tasks)。這對(duì)于查看playbook中定義的任務(wù)非常有用。 -
--list-hosts
: 使用該參數(shù)可以列出playbook中生效的主機(jī)。這對(duì)于查看playbook將在哪些主機(jī)上執(zhí)行任務(wù)非常有用。 -
--start-at-task='<task_name>'
: 使用該參數(shù)可以指定從某個(gè)任務(wù)開(kāi)始運(yùn)行??梢酝ㄟ^(guò)--start-at-task
參數(shù)后跟任務(wù)名稱來(lái)指定從特定任務(wù)開(kāi)始執(zhí)行。
通過(guò)在ansible-playbook
命令后添加這些參數(shù),可以根據(jù)需要執(zhí)行playbook,并進(jìn)行各種檢查和配置。
定義、引用變量
使用Ansible編寫(xiě)的YAML文件,用于定義和引用變量,并在任務(wù)中使用這些變量。
- name: second playhosts: dbserversremote_user: rootvars: #定義變量- groupname: mysql #格式為 key: value- username: nginxtasks:- name: create groupgroup: name={{groupname}} system=yes gid=306 #使用 {{key}} 引用變量的值- name: create useruser: name={{username}} uid=306 group={{groupname}} #在setup模塊中可以獲取factsup={{groupname}}- name: copy file變量信息copy: content="{{ansible_default_ipv4}}" dest=/opt/vars.txt ansible-playbook test1.yaml -e "username=nginx" #在命令行里定義變量
-
- name: second play
: 定義了一個(gè)名為"second play"的Play,用于描述一組相關(guān)的任務(wù)。 -
hosts: dbservers
: 指定了這個(gè)Play要在名為"dbservers"的主機(jī)組上執(zhí)行。 -
remote_user: root
: 指定了遠(yuǎn)程執(zhí)行任務(wù)時(shí)使用的用戶名,這里是"root"。 -
vars:
: 定義了一個(gè)變量列表,用于存儲(chǔ)變量的鍵值對(duì)。 -
- groupname: mysql
: 定義了一個(gè)名為"groupname"的變量,并將其值設(shè)置為"mysql"。 -
- username: nginx
: 定義了一個(gè)名為"username"的變量,并將其值設(shè)置為"nginx"。 -
tasks:
: 定義了一個(gè)任務(wù)列表,包含了一系列要執(zhí)行的任務(wù)。 -
- name: create group
: 定義了一個(gè)名為"create group"的任務(wù),用于創(chuàng)建一個(gè)組。 -
group: name={{groupname}} system=yes gid=306
: 使用group模塊創(chuàng)建一個(gè)名為{{groupname}}(引用變量值)的組,設(shè)置system屬性為"yes",并指定gid為306。 -
- name: create user
: 定義了一個(gè)名為"create user"的任務(wù),用于創(chuàng)建一個(gè)用戶。 -
user: name={{username}} uid=306 group={{groupname}}
: 使用user模塊創(chuàng)建一個(gè)名為{{username}}(引用變量值)的用戶,設(shè)置uid為306,并將其添加到{{groupname}}組中。 -
- name: copy file變量信息
: 定義了一個(gè)名為"copy file變量信息"的任務(wù),用于將變量信息寫(xiě)入文件。 -
copy: content="{{ansible_default_ipv4}}" dest=/opt/vars.txt
: 使用copy模塊將變量ansible_default_ipv4
的值作為文件內(nèi)容,復(fù)制到目標(biāo)文件"/opt/vars.txt"中。
在命令行中,可以使用-e
參數(shù)來(lái)定義變量。例如,ansible-playbook test1.yaml -e "username=nginx"
將在執(zhí)行playbook時(shí)將變量"username"設(shè)置為"nginx"。
通過(guò)定義和引用變量,可以在Ansible playbook中實(shí)現(xiàn)更靈活和可配置的任務(wù)執(zhí)行。變量可以在不同的任務(wù)中共享和重用,并且可以在命令行中動(dòng)態(tài)定義,以適應(yīng)不同的執(zhí)行需求。
指定遠(yuǎn)程主機(jī)sudo切換用戶
---
- hosts: dbserversremote_user: zhangsan become: yes #2.6版本以后的參數(shù),之前是sudo,意思為切換用戶運(yùn)行become_user: root #指定sudo用戶為root
執(zhí)行playbook時(shí):ansible-playbook test1.yml -K <密碼>
這是一個(gè)使用Ansible編寫(xiě)的YAML文件,用于在遠(yuǎn)程主機(jī)上切換用戶并執(zhí)行任務(wù)。
-
- hosts: dbservers
: 指定了這個(gè)Play要在名為"dbservers"的主機(jī)組上執(zhí)行。 -
remote_user: zhangsan
: 指定了遠(yuǎn)程執(zhí)行任務(wù)時(shí)使用的用戶名,這里是"zhangsan"。 -
become: yes
: 這是Ansible 2.6版本以后的參數(shù),用于指定切換用戶運(yùn)行任務(wù)。之前的版本使用"sudo"參數(shù)來(lái)實(shí)現(xiàn)相同的功能。 -
become_user: root
: 指定了切換用戶后要使用的sudo用戶為"root"。也就是說(shuō),在執(zhí)行任務(wù)時(shí),將使用"root"用戶的權(quán)限來(lái)運(yùn)行任務(wù)。
在執(zhí)行playbook時(shí),可以使用-K
參數(shù)來(lái)提示輸入sudo密碼。例如,ansible-playbook test1.yml -K
將要求你輸入sudo密碼以切換到指定的sudo用戶(在這個(gè)例子中是"root")并執(zhí)行任務(wù)。
通過(guò)指定遠(yuǎn)程主機(jī)的sudo切換用戶,可以在Ansible中以不同的權(quán)限執(zhí)行任務(wù),以滿足不同的需求和安全要求。
when條件判斷
-
在執(zhí)行playbook時(shí),Ansible會(huì)根據(jù)條件判斷來(lái)決定是否執(zhí)行任務(wù)。如果條件為真,則任務(wù)將被執(zhí)行;如果條件為假,則任務(wù)將被跳過(guò)。
-
通過(guò)使用when條件判斷,可以根據(jù)不同的條件來(lái)靈活控制任務(wù)的執(zhí)行,實(shí)現(xiàn)根據(jù)需求選擇性地執(zhí)行任務(wù)。
vim test2.yaml
---
- hosts: allremote_user: roottasks:- name: shutdown host command: /sbin/shutdown -r now when: ansible_default_ipv4.address == "192.168.41.31" #when指令中的變量名不需要手動(dòng)加上 {{}}
或 when: inventory_hostname == "<主機(jī)名>"ansible-playbook test2.yaml
這是一個(gè)使用Ansible編寫(xiě)的YAML文件,用于根據(jù)條件判斷是否執(zhí)行任務(wù)。
-
- hosts: all
: 指定了這個(gè)Play要在所有主機(jī)上執(zhí)行。 -
remote_user: root
: 指定了遠(yuǎn)程執(zhí)行任務(wù)時(shí)使用的用戶名,這里是"root"。 -
tasks:
: 定義了一個(gè)任務(wù)列表,包含了一系列要執(zhí)行的任務(wù)。 -
- name: shutdown host
: 定義了一個(gè)名為"shutdown host"的任務(wù),用于關(guān)機(jī)主機(jī)。 -
command: /sbin/shutdown -r now
: 使用command模塊執(zhí)行命令/sbin/shutdown -r now
,即立即重啟主機(jī)。 -
when: ansible_default_ipv4.address == "192.168.41.31"
: 使用when指令來(lái)判斷是否執(zhí)行該任務(wù)。當(dāng)ansible_default_ipv4.address
的值等于"192.168.41.31"時(shí),任務(wù)將被執(zhí)行。這里的ansible_default_ipv4.address
是一個(gè)Ansible提供的變量,表示主機(jī)的IPv4地址。 -
或者可以使用
when: inventory_hostname == "<主機(jī)名>"
來(lái)根據(jù)主機(jī)名進(jìn)行條件判斷。當(dāng)inventory_hostname
的值等于指定的主機(jī)名時(shí),任務(wù)將被執(zhí)行。
迭代
vim test3.yaml
---
- name: play1hosts: dbserversgather_facts: falsetasks: - name: create directoriesfile:path: "{{item}}"state: directorywith_items: #等同于 loop:- /tmp/test1- /tmp/test2- name: add usersuser: name={{item.name}} state=present groups={{item.groups}}with_items:- name: test1groups: wheel- name: test2groups: root
或with_items:- {name:'test1', groups:'wheel'}- {name:'test2', groups:'root'}ansible-playbook test3.yaml
這是一個(gè)使用Ansible編寫(xiě)的YAML文件,用于在遠(yuǎn)程主機(jī)上執(zhí)行循環(huán)操作。
-
- name: play1
: 定義了一個(gè)名為"play1"的Play,用于描述一組相關(guān)的任務(wù)。 -
hosts: dbservers
: 指定了這個(gè)Play要在名為"dbservers"的主機(jī)組上執(zhí)行。 -
gather_facts: false
: 禁用了Ansible的事實(shí)(facts)收集功能,即不收集關(guān)于目標(biāo)主機(jī)的信息。 -
tasks:
: 定義了一個(gè)任務(wù)列表,包含了一系列要執(zhí)行的任務(wù)。 -
- name: create directories
: 定義了一個(gè)名為"create directories"的任務(wù),用于創(chuàng)建目錄。 -
file: path: "{{item}}" state: directory
: 使用file模塊創(chuàng)建目錄,路徑為{{item}}
(迭代的值),狀態(tài)為"directory"。 -
with_items:
: 使用with_items指令來(lái)進(jìn)行循環(huán)迭代。它用于迭代一個(gè)列表或字典。 -
- /tmp/test1 - /tmp/test2
: 定義了一個(gè)包含兩個(gè)路徑的列表,用于迭代創(chuàng)建目錄。 -
- name: add users
: 定義了一個(gè)名為"add users"的任務(wù),用于添加用戶。 -
user: name={{item.name}} state=present groups={{item.groups}}
: 使用user模塊添加用戶,用戶名為{{item.name}}
(迭代的值),狀態(tài)為"present",所屬組為{{item.groups}}
(迭代的值)。 -
with_items:
: 使用with_items指令進(jìn)行循環(huán)迭代。 -
- name: test1 groups: wheel - name: test2 groups: root
: 定義了一個(gè)包含兩個(gè)字典的列表,每個(gè)字典包含用戶名和所屬組的鍵值對(duì),用于迭代添加用戶。 -
或者可以使用
with_items:
指令后跟包含鍵值對(duì)的字典列表,例如- {name:'test1', groups:'wheel'} - {name:'test2', groups:'root'}
。
在執(zhí)行playbook時(shí),Ansible會(huì)根據(jù)循環(huán)迭代的方式,依次執(zhí)行任務(wù),并使用{{item}}
來(lái)獲取每次迭代的值。
通過(guò)使用循環(huán)結(jié)構(gòu),可以在Ansible中實(shí)現(xiàn)對(duì)列表或字典的迭代操作,從而批量執(zhí)行任務(wù)或根據(jù)不同的值執(zhí)行不同的操作。
Templates 模塊
-
Jinja是一個(gè)基于Python的模板引擎,用于生成動(dòng)態(tài)內(nèi)容。它提供了一種將變量和邏輯表達(dá)式嵌入到模板中的方式,以生成最終的文本輸出。
-
在Jinja中,模板文件被編譯為Template對(duì)象,然后可以通過(guò)傳遞變量給模板來(lái)替換模板中的標(biāo)記。這些標(biāo)記通常使用雙花括號(hào)
{{}}
表示,用于表示變量的值。Jinja還提供了條件語(yǔ)句、循環(huán)語(yǔ)句等控制結(jié)構(gòu),使得模板可以根據(jù)不同的條件生成不同的輸出。 -
Jinja模板引擎的優(yōu)勢(shì)在于它的靈活性和可擴(kuò)展性。它可以與各種類型的應(yīng)用程序集成,并支持自定義過(guò)濾器、宏等功能,以滿足不同的需求。
使用Ansible進(jìn)行配置管理的示例。
- 首先,準(zhǔn)備一個(gè)以
.j2
為后綴的模板文件httpd.conf.j2
,并設(shè)置引用的變量。使用以下命令將/etc/httpd/conf/httpd.conf
復(fù)制到/opt/httpd.conf.j2
:
cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2
然后,使用vim編輯器打開(kāi)/opt/httpd.conf.j2
文件,并修改以下行:
vim /opt/httpd.conf.j2Listen {{http_port}} # 修改第42行
ServerName {{server_name}} # 修改第95行
DocumentRoot "{{root_dir}}" # 修改第119行
- 修改主機(jī)清單文件
/etc/ansible/hosts
,使用主機(jī)變量定義一個(gè)變量名相同但值不同的變量。在文件中添加以下內(nèi)容:
vim /etc/ansible/hosts [webservers]
192.168.41.31 http_port=192.168.41.31:80 server_name=www.test1.com:80 root_dir=/etc/httpd/htdocs[dbservers]
192.168.41.32 http_port=192.168.41.32:80 server_name=www.test2.com:80 root_dir=/etc/httpd/htdocs
- 編寫(xiě)Ansible playbook文件
apache.yaml
,包含安裝和配置Apache HTTP服務(wù)器的任務(wù)。以下是文件的內(nèi)容:
---
- hosts: allremote_user: rootvars:- package: httpd- service: httpdtasks:- name: install httpd packageyum: name={{package}} state=latest- name: install configure filetemplate: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.confnotify:- restart httpd- name: create root dirfile: path=/etc/httpd/htdocs state=directory- name: start httpd serverservice: name={{service}} enabled=true state=startedhandlers:- name: restart httpdservice: name={{service}} state=restarted
這個(gè)playbook會(huì)安裝httpd
軟件包,使用模板文件httpd.conf.j2
生成配置文件/etc/httpd/conf/httpd.conf
,然后創(chuàng)建目錄/etc/httpd/htdocs
,最后啟動(dòng)httpd
服務(wù)。如果配置文件發(fā)生變化,會(huì)觸發(fā)重啟httpd
服務(wù)。
使用以下命令運(yùn)行playbook:
ansible-playbook apache.yaml
Tags 模塊
在Ansible中,tags(標(biāo)簽)是一種用于標(biāo)記和組織任務(wù)的機(jī)制。通過(guò)為任務(wù)添加標(biāo)簽,可以對(duì)任務(wù)進(jìn)行分類和分組,以便在運(yùn)行Ansible劇本時(shí)選擇性地執(zhí)行或跳過(guò)特定的任務(wù)。
使用標(biāo)簽可以實(shí)現(xiàn)以下幾個(gè)目的:
-
選擇性執(zhí)行:通過(guò)在運(yùn)行劇本時(shí)指定標(biāo)簽,只執(zhí)行帶有指定標(biāo)簽的任務(wù),而跳過(guò)其他任務(wù)。這對(duì)于在大型劇本中只執(zhí)行特定部分非常有用。
-
排除任務(wù):通過(guò)在運(yùn)行劇本時(shí)指定排除標(biāo)簽,可以跳過(guò)帶有指定標(biāo)簽的任務(wù),而執(zhí)行其他任務(wù)。這對(duì)于在劇本中排除特定任務(wù)非常有用。
-
分組任務(wù):通過(guò)為任務(wù)添加相同的標(biāo)簽,可以將它們分組在一起,以便更好地組織和管理任務(wù)。這對(duì)于在劇本中對(duì)任務(wù)進(jìn)行邏輯分組非常有用。
-
tags
模塊允許為任務(wù)定義標(biāo)簽,在執(zhí)行playbook時(shí)可以使用--tags
選項(xiàng)只運(yùn)行指定標(biāo)簽的任務(wù)。在這個(gè)示例中,有兩個(gè)playbook文件:webhosts.yaml
和dbhosts.yaml
。webhosts.yaml
文件內(nèi)容如下:
vim webhosts.yaml---
- hosts: webserversremote_user: roottasks:- name: Copy hosts filecopy: src=/etc/hosts dest=/opt/hoststags:- only- name: touch filefile: path=/opt/testhost state=touchtags:- always
dbhosts.yaml
文件內(nèi)容如下:
---
- hosts: dbserversremote_user: roottasks:- name: Copy hosts filecopy: src=/etc/hosts dest=/opt/hoststags:- only- name: touch filefile: path=/opt/testhost state=touch
運(yùn)行webhosts.yaml
playbook,并只運(yùn)行帶有only
標(biāo)簽的任務(wù):
ansible-playbook webhosts.yaml --tags="only"
運(yùn)行dbhosts.yaml
playbook,并只運(yùn)行帶有only
標(biāo)簽的任務(wù):
ansible-playbook dbhosts.yaml --tags="only"
這些playbook會(huì)在被管理的主機(jī)上復(fù)制/etc/hosts
文件到/opt/hosts
,并在/opt
目錄下創(chuàng)建一個(gè)名為testhost
的文件。
Roles角色
在Ansible中,roles(角色)是一種組織和管理任務(wù)和變量的方法。角色是可重用的、自包含的Ansible單元,它封裝了一組任務(wù)和變量,可以在不同的劇本中輕松地重用。
使用roles可以將Ansible代碼更好地組織起來(lái),使其更易于維護(hù)和重用。通過(guò)將相關(guān)的任務(wù)和變量分組到角色中,可以將其作為一個(gè)整體來(lái)使用,并在多個(gè)劇本中重復(fù)使用。
角色通常包含以下內(nèi)容:
-
任務(wù)(Tasks):定義要在目標(biāo)主機(jī)上執(zhí)行的操作。
-
變量(Variables):定義角色中使用的變量。
-
文件(Files):包含角色所需的文件,如配置文件、腳本等。
-
模板(Templates):用于生成配置文件等的模板文件。
-
處理程序(Handlers):定義在任務(wù)執(zhí)行后觸發(fā)的操作。
通過(guò)使用roles,可以將復(fù)雜的Ansible代碼分解為更小的、可重用的部分,使代碼更加模塊化和可維護(hù)。這樣可以提高代碼的可讀性和可重用性,并簡(jiǎn)化管理和擴(kuò)展Ansible部署。
要使用roles,可以在Ansible劇本中通過(guò)include_role或roles關(guān)鍵字來(lái)引用和調(diào)用角色。這樣可以將角色應(yīng)用到目標(biāo)主機(jī)上,并執(zhí)行其中定義的任務(wù)和操作。
roles 的目錄結(jié)構(gòu):
cd /etc/ansible/
tree roles/
roles/common/tasks/handlers/files/templates/vars/defaults/meta/webserver/tasks/handlers/files/templates/vars/defaults/meta/
在上述目錄結(jié)構(gòu)中,roles/
是roles目錄的根目錄,common/
和webserver/
是兩個(gè)示例角色的目錄??梢愿鶕?jù)需要?jiǎng)?chuàng)建更多的角色目錄。
每個(gè)角色目錄通常包含以下子目錄和文件:
-
tasks/
:包含角色的任務(wù)文件,定義要在目標(biāo)主機(jī)上執(zhí)行的操作。 -
handlers/
:包含角色的處理程序文件,定義在任務(wù)執(zhí)行后觸發(fā)的操作。 -
files/
:包含角色所需的文件,如配置文件、腳本等。 -
templates/
:包含用于生成配置文件等的模板文件。 -
vars/
:包含角色的變量文件,定義角色中使用的變量。 -
defaults/
:包含角色的默認(rèn)變量文件,定義角色中使用的默認(rèn)變量。 -
meta/
:包含角色的元數(shù)據(jù)文件,定義角色的依賴關(guān)系和其他元數(shù)據(jù)信息。
這種目錄結(jié)構(gòu)使得角色的組織和管理更加清晰和一致,使其易于重用和維護(hù)。在默認(rèn)情況下,Ansible會(huì)自動(dòng)查找每個(gè)目錄下的main.yml
文件(也可以是main.yaml
或main
),并執(zhí)行其中定義的任務(wù)和操作。
示例
- 首先,創(chuàng)建一個(gè)名為"roles"的目錄
mkdir /etc/ansible/roles/ -p #yum裝完默認(rèn)就有
- 可選步驟:創(chuàng)建一個(gè)全局變量目錄
mkdir /etc/ansible/group_vars/ -p
touch /etc/ansible/group_vars/all #文件名自己定義,引用的時(shí)候注意
在"all"文件中,您可以定義全局變量,以供所有角色使用。
- 在"roles"目錄中,為每個(gè)角色創(chuàng)建一個(gè)以角色名稱命名的目錄,例如"httpd"和"mysql"
mkdir /etc/ansible/roles/httpd
mkdir /etc/ansible/roles/mysql
- 在每個(gè)角色的目錄中,創(chuàng)建以下子目錄:files、handlers、tasks、templates、meta、defaults和vars。
mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}
這些目錄用于存放角色的文件、處理程序、任務(wù)、模板、元數(shù)據(jù)、默認(rèn)變量和變量。
- 在每個(gè)角色的handlers、tasks、meta、defaults和vars目錄下,創(chuàng)建一個(gè)名為"main.yml"的文件。請(qǐng)注意,文件名必須為"main.yml"。
touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
這些"main.yml"文件將包含角色的任務(wù)、處理程序、元數(shù)據(jù)、默認(rèn)變量和變量的定義。
- 修改"site.yml"文件,根據(jù)不同的主機(jī)調(diào)用不同的角色。可以使用文本編輯器打開(kāi)"site.yml"文件
vim /etc/ansible/site.yml
---
- hosts: webserversremote_user: rootroles:- httpd
- hosts: dbserversremote_user: rootroles:- mysql
在這個(gè)示例中,對(duì)于"webservers"主機(jī)組,將調(diào)用名為"httpd"的角色;對(duì)于"dbservers"主機(jī)組,將調(diào)用名為"mysql"的角色。
- 最后,切換到ansible的工作目錄,并運(yùn)行ansible-playbook命令來(lái)執(zhí)行playbook:
cd /etc/ansible
ansible-playbook site.yml
這將運(yùn)行名為"site.yml"的playbook,并根據(jù)定義的角色調(diào)用相應(yīng)的任務(wù)和操作。
通過(guò)按照上述步驟,可以使用roles來(lái)組織和管理Ansible playbook,并在不同的主機(jī)上調(diào)用不同的角色。這樣可以使您的部署更加模塊化、可重用和易于維護(hù)。
創(chuàng)建roles目錄結(jié)構(gòu)中各個(gè)角色的子目錄和文件示例
- 創(chuàng)建httpd角色的子目錄:
mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p
這個(gè)命令會(huì)創(chuàng)建httpd角色的子目錄files、templates、tasks、handlers、vars、defaults和meta。"-p"選項(xiàng)表示如果目錄已存在,則不會(huì)報(bào)錯(cuò)。
- 創(chuàng)建mysql角色的子目錄:
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
這個(gè)命令會(huì)創(chuàng)建mysql角色的子目錄files、templates、tasks、handlers、vars、defaults和meta。
- 創(chuàng)建php角色的子目錄:
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -p
這個(gè)命令會(huì)創(chuàng)建php角色的子目錄files、templates、tasks、handlers、vars、defaults和meta。
- 在httpd角色的子目錄中創(chuàng)建main.yml文件:
touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
這個(gè)命令會(huì)在httpd角色的defaults、vars、tasks、meta和handlers子目錄中創(chuàng)建一個(gè)名為main.yml的空文件。
- 在mysql角色的子目錄中創(chuàng)建main.yml文件:
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
這個(gè)命令會(huì)在mysql角色的defaults、vars、tasks、meta和handlers子目錄中創(chuàng)建一個(gè)名為main.yml的空文件。
- 在php角色的子目錄中創(chuàng)建main.yml文件:
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml
這個(gè)命令會(huì)在php角色的defaults、vars、tasks、meta和handlers子目錄中創(chuàng)建一個(gè)名為main.yml的空文件。
通過(guò)執(zhí)行上述命令,將創(chuàng)建roles目錄結(jié)構(gòu)中各個(gè)角色的子目錄和文件,以便組織和管理Ansible playbook中的任務(wù)和變量。
編寫(xiě)httpd模塊
在Ansible中,httpd模塊是用于管理Apache HTTP服務(wù)器的模塊。它提供了一組任務(wù)和參數(shù),可以用于配置、安裝、啟動(dòng)、停止和管理Apache HTTP服務(wù)器。
使用httpd模塊,可以執(zhí)行以下操作:
-
安裝和卸載Apache HTTP服務(wù)器。
-
配置Apache HTTP服務(wù)器的全局設(shè)置,如監(jiān)聽(tīng)端口、服務(wù)器名稱等。
-
配置虛擬主機(jī)(Virtual Hosts),包括創(chuàng)建、刪除、啟用和禁用虛擬主機(jī)。
-
配置Apache模塊,如啟用或禁用特定的模塊。
-
配置Apache的網(wǎng)站目錄和文件權(quán)限。
-
啟動(dòng)、停止和重啟Apache HTTP服務(wù)器。
httpd模塊提供了一組任務(wù),可以在Ansible playbook中使用這些任務(wù)來(lái)管理Apache HTTP服務(wù)器。例如,可以使用"yum"模塊安裝Apache軟件包,然后使用httpd模塊配置和管理服務(wù)器。
以下是一些httpd模塊常用任務(wù)的示例:
- 安裝Apache HTTP服務(wù)器:
- name: Install Apacheyum:name: httpdstate: present
- 配置全局設(shè)置:
- name: Configure Apache global settingshttpd_global_conf:options:- Listen 80- ServerName example.com
- 配置虛擬主機(jī):
- name: Create virtual hosthttpd_vhost:state: presentname: example.comdocument_root: /var/www/exampleoptions:- Options Indexes FollowSymLinks- AllowOverride All
- 啟動(dòng)和停止Apache服務(wù)器:
- name: Start Apacheservice:name: httpdstate: started- name: Stop Apacheservice:name: httpdstate: stopped
這些示例只是httpd模塊的一小部分功能,還可以使用Ansible編寫(xiě)的簡(jiǎn)單的任務(wù)文件(main.yml)。
- 在路徑/etc/ansible/roles/httpd/tasks/main.yml中,添加以下內(nèi)容:
- name: install apacheyum: name={{pkg}} state=latest- name: start apacheservice: enabled=true name={{svc}} state=started
- 在路徑/etc/ansible/roles/httpd/vars/main.yml中,定義變量pkg和svc:
pkg: httpd
svc: httpd
- 接下來(lái),編寫(xiě)MySQL模塊。在路徑/etc/ansible/roles/mysql/tasks/main.yml中,添加以下內(nèi)容:
- name: install mysqlyum: name={{pkg}} state=latest- name: start mysqlservice: enabled=true name={{svc}} state=started
- 在路徑/etc/ansible/roles/mysql/vars/main.yml中,定義變量pkg和svc:
pkg:- mariadb- mariadb-server
svc: mariadb
- 然后,編寫(xiě)PHP模塊。在路徑/etc/ansible/roles/php/tasks/main.yml中,添加以下內(nèi)容:
- name: install phpyum: name={{pkg}} state=latest- name: start php-fpmservice: enabled=true name={{svc}} state=started
- 在路徑/etc/ansible/roles/php/vars/main.yml中,定義變量pkg和svc:
pkg:- php- php-fpm
svc: php-fpm
- 最后,編寫(xiě)roles示例。在路徑/etc/ansible/site.yml中,添加以下內(nèi)容:
---
- hosts: webserversremote_user: rootroles:- httpd- mysql- php
完成后,進(jìn)入/etc/ansible目錄,并運(yùn)行ansible-playbook site.yml命令來(lái)執(zhí)行任務(wù)。
cd /etc/ansible
ansible-playbook site.yml