Ansible(二)

一、Playbook基礎

1.1 Playbook定義

Playbook其實是Ansible服務的一個配置文件,Ansible使用Playbook的YAML語言配置編寫成操作需求,實現對遠端主機或策略部署,實現對遠端主機的控制與管理。

1.2 Playbook組成

Tasks:任務,即通過 task 調用 ansible 的模板將多個操作組織在一個 playbook 中運行

Variables:變量

Templates:模板

Handlers:處理器,當changed狀態條件滿足時,(notify)觸發執行的操作

Roles:角色

1.3 Playbook劇本詳解

vim test1.yaml
---
#yaml文件以---開頭,以表明這是一個yaml文件,可省略(但是如果兩個YAML配置疊加的話,要以此為分割)
- name: first play
#定義一個play的名稱,可省略gather_facts: false
#設置不進行facts信息收集,這可以加快執行速度,可省略hosts: webservers
#指定要執行任務的被管理主機組,如多個主機組用冒號分隔remote_user: root
#指定被管理主機上執行任務的用戶tasks:
#定義任務列表,任務列表中的各任務按次序逐個在hosts中指定的主機上執行- name: test connection
#自定義任務名稱ping:
#使用 module: [options] 格式來定義一個任務- name: disable selinuxcommand: '/sbin/setenforce 0'
#command模塊和shell模塊無需使用key=value格式ignore_errors: True
#如執行命令的返回值不為0,就會報錯,tasks停止,可使用ignore_errors忽略失敗的任務- name: disable firewalldservice: name=firewalld state=stopped
#使用 module: options 格式來定義任務,option使用key=value格式- name: install httpdyum: name=httpd state=latest- name: install configuration file for httpdcopy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf
#這里需要一個事先準備好的/opt/httpd.conf文件notify: "restart httpd"
#如以上操作后為changed的狀態時,會通過notify指定的名稱觸發對應名稱的handlers操作- name: start httpd serviceservice: enabled=true name=httpd state=startedhandlers:
#handlers中定義的就是任務,此處handlers中的任務使用的是service模塊- name: restart httpd
#notify和handlers中任務的名稱必須一致service: name=httpd state=restarted
#Ansible在執行完某個任務之后并不會立即去執行對應的handler,而是在當前play中所有普通任務都執行完后再去執行handler,這樣的好處是可以多次觸發notify,但最后只執行一次對應的handler,從而避免多次重啟。

1.4 Playbook命令?

//運行playbook
ansible-playbook test01.yaml
//補充參數:
-k(–ask-pass):用來交互輸入ssh密碼
-K(-ask-become-pass):用來交互輸入sudo密碼
-u:指定用戶
ansible-playbook test01.yaml --syntax-check    #檢查yaml文件的語法是否正確
ansible-playbook test01.yaml --list-task       #檢查tasks任務
ansible-playbook test01.yaml --list-hosts      #檢查生效的主機
ansible-playbook test01.yaml --start-at-task='install httpd'     #指定從某個task開始運行

1.5 Playbook安裝并啟動httpd服務

cd /opt/
vim test01.yaml
---
- name: install httpdgather_facts: falsehosts: webserversremote_user: roottasks:- name: connection ceshiping:- name: disable firewalldservice: name=firewalld state=stopped- name: install apacheyum: name=httpd state=latest- name: install config filecopy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf- name: start httpd serviceservice: enabled=true name=httpd state=started- name: write htmlcopy: src=/opt/index.html dest=/var/www/html/index.htmlnotify: "restart httpd"handlers:- name: restart httpdservice: name=httpd state=restarted
echo 123 > index.html
cat index.html

?

ansible-playbook test01.yaml --syntax-checkansible-playbook test01.yaml --list-taskansible-playbook test01.yaml --list-hostansible-playbook test01.yaml

?

1.6?變量的定義和引用

cd /opt
vim test02.yaml
---
- name: variablehosts: webserversremote_user: rootvars:- groupname: test01- username: nginxtasks:- name: create groupgroup: name={{groupname}} system=yes gid=333- name: create useruser: name={{username}} uid=333 group={{groupname}}- name: copy filecopy: content="{{ansible_default_ipv4}}" dest=/opt/shibin.txt

-e選項指定ymal配置文件中變量username,因為指定了在yaml文件中指定的username為"nginx",實際命令中指定為"test001"最終是以-e選項指定的username生效;

注意:命令行中的變量優先級高于YAML配置文件中的變量優先級。

ansible-playbook test02.yaml -e "username=test001"

?

1.7?指定遠程主機sudo切換用戶?

cd /opt
vim test03.yaml
---
- hosts: webserversremote_user: zhangsan            become: yes                    become_user: root
ansible-playbook test03.yml -K

?

這里紅色顯示sudo提權失敗,可以去遠端主機的配置文件(/etc/sudoers)中修改zhangsan用戶的權限

???

??

?1.8 When(條件判斷)

cd /opt
vim test04.yaml
---
- name: reboot hosthosts: dbserversremote_user: roottasks:- name: shutdown hostcommand: /sbin/shutdown -r nowwhen: ansible_default_ipv4.address == "192.168.133.10"

?

由于判斷條件為主機地址為192.168.133.10才執行Shutdown操作,所以主機地址為192.168.133.100的主機跳過Playbook?

1.9 迭代

1.9.1?創建文件夾

cd /opt
vim test05.yaml
- name: test05hosts: webserverstasks:- name: create directoriesfile: path={{item}} state=touchwith_items:- /opt/shibin/s1.txt- /opt/shibin/s2.txt- /opt/shibin/s3.txt- /opt/shibin/s4.txt

注意:需提前在webservers里的主機上創建好目錄/opt/shibin?

ansible-playbook test05.yaml

1.9.2??創建文件夾并建立用戶

cd /opt
vim test06.yaml
---
- name: test06hosts: webserversgather_facts: falsetasks:- name: create directoriesfile:path: "{{item}}"state: directorywith_items:- /tmp/test1- /tmp/test2- name: add usersuser: name={{item.name}} state=present groups={{item.groups}}with_items:- name: test1groups: wheel- name: test2groups: root
ansible-playbook test06.yaml

二、Templates模塊

Jinja是基于Python的模板引擎。Template類是Jinja的一個重要組件,可以看作是一個編譯過的模板文件,用來產生目標文本,傳遞Python的變量給模板去替換模板中的標記。

2.1?準備模板文件并設置引用的變量

yum install -y httpdcp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2vim /opt/httpd.conf.j2-42行修改-   Listen {{http_port}}
-95行修改-   ServerName {{server_name}}
-119行修改-  DocumentRoot "{{root_dir}}" 

2.2?修改主機清單內的變量

vim /etc/ansible/hosts -19- [webservers]
-20- 192.168.133.90 http_port=192.168.133.90:80 server_name=www.test1.com:80 root_dir=/etc/httpd/htdocs
#注意  root_dir要和前面的server_name空格  不可另起一行,否則報錯UNREACHABLE!-34- [dbservers]
-35- 192.168.133.100 http_port=192.168.133.100:80 server_name=www.test2.com:80 root_dir=/etc/httpd/htdocs
#注意  root_dir要和前面的server_name空格  不可另起一行,否則報錯UNREACHABLE!

2.3?編寫Playbook劇本

vim apache.yaml
---
- hosts: allremote_user: rootvars:- package: httpd- service: httpdtasks:- name: create dirfile: path=/etc/httpd/htdocs state=directory- 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: start httpd serverservice: name={{service}} enabled=true state=startedhandlers:- name: restart httpdservice: name={{service}} state=restarted
ansible-playbook apache.yaml

?

?三、Tags模塊

可以在一個playbook中為某個或某些任務定義“標簽”,在執行此playbook時通過ansible-playbook命令使用--tags選項能實現僅運行指定的tasks。
playbook還提供了一個特殊的tags為always。作用就是當使用always當tags的task時,無論執行哪一個tags時,定義有always的tags都會執行。

cd /opt
vim test07.yaml
---
- hosts: webserversremote_user: roottasks:- name: Copy hosts filecopy: src=/etc/hosts dest=/opt/hoststags: "shibin"- name: touch filefile: path=/opt/testhost state=touchtags: "always"
ansible-playbook test07.yaml --tags="shibin"

?

?四、Roles模塊

Ansible為了層次化、結構化地組織Playbook,使用了角色(roles),roles可以根據層次型結構自動裝載變量文件、task以及handlers等。簡單來講,roles就是通過分別將變量、文件、任務、模塊及處理器放置于單獨的目錄中,并可以便捷地include它們。roles一般用于基于主機構建服務的場景中,但也可以用于構建守護進程等場景中。

4.1 Roles目錄詳解

4.2?在Playbook中使用Roles步驟

4.2.1?環境準備

mkdir /etc/ansible/roles/ -p
#創建以 roles 命名的目錄mkdir /etc/ansible/group_vars/ -p
touch /etc/ansible/group_vars/all
#創建全局變量目錄mkdir /etc/ansible/roles/httpd
mkdir /etc/ansible/roles/mysql
#在 roles 目錄中分別創建以各角色名稱命令的目錄mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta}
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}
#在每個角色命令的目錄中分別創建files、handlers、tasks、templates、meta、defaults和vars目錄,用不到的目錄可以創建為空目錄,也可以不創建touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
#在每個角色的 handlers、tasks、meta、defaults、vars 目錄下創建 main.yml 文件,千萬不能自定義文件名

4.2.2?修改yml文件?

vim /etc/ansible/site.yml
---
- hosts: cxkremote_user: rootroles:- httpd
- hosts: wybremote_user: rootroles:- mysql

4.2.3 運行Ansible-Playbook??

cd /etc/ansible
ansible-playbook site.yml

4.3?Roles模塊舉例——LAMP

mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta} -p
mkdir /etc/ansible/roles/php/{files,templates,tasks,handlers,vars,defaults,meta} -ptouch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml

4.3.1?編寫httpd模塊

(1)編寫yml文件

vim /etc/ansible/roles/httpd/tasks/main.yml
- name: install apacheyum: name={{pkg}} state=latest
- name: start apacheservice: enabled=true name={{svc}} state=started

?(2)定義變量

vim /etc/ansible/roles/httpd/vars/main.yml
#可以定義在全局變量中,也可以定義在roles角色變量中,一般定義在角色變量中
pkg: httpd
svc: httpd

4.3.2 編寫Mysql模塊

(1)編寫yml文件

vim /etc/ansible/roles/mysql/tasks/main.yml- name: install mysqlyum: name={{pkg}} state=latest
- name: start mysqlservice: enabled=true name={{svc}} state=started

(2)定義變量

vim /etc/ansible/roles/mysql/vars/main.ymlpkg:- mariadb- mariadb-server
svc: mariadb

4.3.3 編寫Php模塊

(1)編寫yml文件

vim /etc/ansible/roles/php/tasks/main.yml- name: install phpyum: name={{pkg}} state=latest
- name: start php-fpmservice: enabled=true name={{svc}} state=started

(2)定義變量

vim /etc/ansible/roles/php/vars/main.ymlpkg:- php- php-fpm
svc: php-fpm

4.3.4 編寫Roles實例并啟動

vim /etc/ansible/site.yml---
- hosts: wybremote_user: rootroles:- httpd- mysql- phpcd /etc/ansible
ansible-playbook site.yml

五、 Ansible常用命令小結

5.1.ansible-doc

ansible-doc -h Usage: ansible-doc [options] [module...]
#該指令用于查看模塊信息,常用參數有兩個-l 和 -s ,具體如下
ansible-doc -l
#列出所有已安裝的模塊ansible-doc -s command
#查看具體某模塊的用法,這里如查看command模塊

5.2 ansible-galaxy

ansible-galaxy -h Usage: ansible-galaxy [init|info|install|list|remove] [--help] [options] ...
#ansible-galaxy指令用于方便的從https://galaxy.ansible.com/ 站點下載第三方擴展模塊,我們可以形象的理解其類似于centos下的yum、python下的pip

5.3 ansible-playbook

通過讀取playbook 文件后,執行相應的動作

5.4 ansible-pull

該指令使用需要談到ansible的另一種模式——pull 模式,這和我們平常經常用的push模式剛好相反,其適用于以下場景:你有數量巨大的機器需要配置,即使使用非常高的線程還是要花費很多時間

5.5 ansible-vault

ansible-vault主要應用于配置文件中含有敏感信息,又不希望他能被人看到,vault可以幫你加密/解密這個配置文件,屬高級用法。主要對于playbooks里比如涉及到配置密碼或其他變量時,可以通過該指令加密,這樣我們通過cat看到的會是一個密碼串類的文件,編輯的時候需要輸入事先設定的密碼才能打開。這種playbook文件在執行時,需要加上 –ask-vault-pass參數,同樣需要輸入密碼后才能正常執行。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10922.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10922.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10922.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Qt 學習筆記】Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout

博客主頁:Duck Bro 博客主頁系列專欄:Qt 專欄關注博主,后期持續更新系列文章如果有錯誤感謝請大家批評指出,及時修改感謝大家點贊👍收藏?評論? Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout 文章編號&#x…

skynet - spinlock 簡單的自旋鎖

spinlock.h 代碼位于: https://github.com/cloudwu/skynet/blob/master/skynet-src/spinlock.h 該文件內,根據不同環境提供了 3 種 api 實現: pthread_mutex_t 系列函數gcc 內置原子操作函數std atomic 系列函數 看了下,效率最…

滲透測試-信息收集

網絡安全信息收集是網絡安全領域中至關重要的一環,它涉及到對目標系統、網絡或應用進行全面而細致的信息搜集和分析。這一過程不僅有助于理解目標網絡的結構、配置和潛在的安全風險,還能為后續的滲透測試、風險評估和安全加固提供有力的支持。 在網絡安…

安卓開發--新建工程,新建虛擬手機,按鍵事件響應(含:Android中使用switch-case遇到case R.id.xxx報錯)

安卓開發--新建工程,新建虛擬手機,按鍵事件響應 1.前言2.運行一個工程2.1布局一個Button2.2 button一般點擊事件2.2 button屬性點擊事件2.2 button推薦點擊事件(含:Android中使用switch-case遇到case R.id.xxx報錯) 本…

MATLAB 多項式

MATLAB 多項式 MATLAB將多項式表示為行向量,其中包含按冪次降序排列的系數。例如,方程P(x) X 4 7 3 - 5 9可以表示為 p [1 7 0 -5 9]; 求值多項式 polyval函數用于求一個特定值的多項式。例如,在 x 4 時,計算我們之前的多項式…

HTTP URL 詳解

概述 URL 提供了一種定位因特網上任意資源的手段&#xff0c;大多數 URL 語法都由以下九個結構的通用格式組成&#xff1a; <scheme>://<user>:<password><host>:<port>/<path>;<params>?<query>#<frag> 方案&#…

命令重裝Linux系統,無需登錄控制面板

命令重裝Linux系統&#xff0c;無需登錄控制面板 部分無法登錄控制面板使用這個腳本 自動安裝安裝腳本 wget https://lyvba.com/auto.sh bash auto.sh -d 12 -v 64 -a -p $passwd \--mirror https://mirrors.ustc.edu.cn/debian/安裝命令參考 # 自動安裝 Debian 10 buster …

基于YOLOV8復雜場景下船舶目標檢測系統

1. 背景 海洋作為地球上70%的表面積&#xff0c;承載著人類生活、經濟發展和生態系統的重要功能。船舶作為海洋活動的主要載體之一&#xff0c;在海上運輸、資源開發、環境監測等方面發揮著重要作用。復雜海洋環境下的船舶目標檢測成為了海事管理、海洋資源開發和環境保護等領…

人工智能軌道交通行業周刊-第79期(2024.4.22-5.12)

本期關鍵詞&#xff1a;無人機巡檢、車機聯控、減速頂、Agent、GraphRAG、RAGFlow 1 整理涉及公眾號名單 1.1 行業類 RT軌道交通人民鐵道世界軌道交通資訊網鐵路信號技術交流北京鐵路軌道交通網鐵路視點ITS World軌道交通聯盟VSTR鐵路與城市軌道交通RailMetro軌道世界鐵路那…

2024OD機試卷-API集群負載統計 (java\python\c++)

題目:API集群負載統計 題目描述 某個產品的RESTful API集合部署在 服務器 集群的多個節點上,近期對客戶端訪問日志進行了采集,需要統計各個API的訪問頻次,根據熱點信息在服務器節點之間做負載 均衡,現在需要實現熱點信息統計查詢功能。 RESTful API是由多個層級構成,層…

《動手學深度學習》V2(11-18)

文章目錄 十一、二 模型選擇與過擬合和欠擬合1、模型的選擇2、過擬合和欠擬合3、估計模型容量4、線性分類器的VC維5、過擬合欠擬合的代碼實現 :fire:①生成數據集②定義評估損失③定義訓練函數④三階多項式函數擬合⑤線性函數擬合(欠擬合)⑤高階多項式函數擬合(過擬合) 十三、權…

【C語言】精品練習題

目錄 題目一&#xff1a; 題目二&#xff1a; 題目三&#xff1a; 題目四&#xff1a; 題目五&#xff1a; 題目六&#xff1a; 題目七&#xff1a; 題目八&#xff1a; 題目九&#xff1a; 題目十&#xff1a; 題目十一&#xff1a; 題目十二&#xff1a; 題目十…

「 網絡安全常用術語解讀 」漏洞利用預測評分系統EPSS詳解

1. 概覽 EPSS&#xff08;Exploit Prediction Scoring System&#xff0c;漏洞利用預測評分系統&#xff09; 提供了一種全新的高效、數據驅動的漏洞管理功能。EPSS是一項數據驅動的工作&#xff0c;使用來自 CVE 的當前威脅信息和現實世界的漏洞數據。 EPSS 模型產生 0 到 1&…

vue 中的 Vuex

Vuex Vuex是什么&#xff1f; 概念&#xff1a;專門在vue中實現集中式狀態&#xff08;數據&#xff09;管理的一個Vue插件&#xff0c;對Vue應用中多個組件的共享狀態進行集中式的管理(讀/寫&#xff09;&#xff0c;也是一種組件間通信的方式&#xff0c;且適用于任意組件間…

2024最新小紅書電商落地實操課,從入門到精通,打造爆款方法(16節課)

你是不是經常在小紅書上看到各種各樣的推廣和引流方法&#xff0c;卻感覺實際操作起來很困難&#xff1f; 那么&#xff0c;這門2024最新小紅書電商落地實操課就是為你量身定制的&#xff01;從入門到精通&#xff0c;不僅能讓你了解電商平臺的基本規則和玩法&#xff0c;還能…

ansible------inventory 主機清單

目錄 inventory 中的變量 2&#xff09;組變量[webservers:vars] #表示為 webservers 組內所有主機定義變量&#xff0c;所有組內成 員都有效 ansible_userrootansible_passwordabc1234 3&#xff09; [all:vars…

VulkanSDK Demos vkcube 編譯失敗

操作系統: Windows 11 23H2 Vulkan 版本: 1.3.2.280.0 Visual Studio 版本: 2022 在VulkanSDK/Demos目錄下存在一個demo solution,其中包含兩個project, vkcube和vkcubepp,兩個分別為C語言和C寫的示例程序, 但是直接編譯這兩個project時會編譯失敗,報了以下錯誤: fatal err…

[Java EE] 文件IO(一):文件概念與文件系統操作

&#x1f338;個人主頁:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;?熱門專欄:&#x1f355; Collection與數據結構 (91平均質量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

LeetCode 每日一題 ---- 【2391.收集垃圾的最少總時間】

LeetCode 每日一題 ---- 【2391.收集垃圾的最少總時間】 2391.收集垃圾的最少總時間方法&#xff1a;模擬&#xff08;多次遍歷&#xff09; 2391.收集垃圾的最少總時間 方法&#xff1a;模擬&#xff08;多次遍歷&#xff09; 需要注意的點是&#xff0c;處理一個單位的一個…

mysql分頁排序的坑,千萬注意!

1、問題復現 現象&#xff1a; mysql對無索引字段進行排序后limit &#xff0c;當被排序字段有相同值時并且在limit范圍內&#xff0c;取的值并不是正常排序后的值&#xff0c;有可能第一頁查詢的記錄&#xff0c;重復出現在第二頁的查詢記錄中&#xff0c;而且第二頁的查詢結…