ansble安裝+常用的12種模塊+主機清單概述+劇本playbook+配置文件模板j2+tags標籤+role角色+流程控制when

文章目錄

ansible概述

Ansible可以同時管理Redhat系的Linux,Debian系的Linux,以及Windows主機。管理節點只在執行腳本時與遠程主機連接,沒有特別的同步機制,所以斷電等異常一般不會影響ansbile。

ansible是新出現的自動化運維工具,基於Python開發,集合了衆多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。ansible是基於模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。主要包括:
(1)、連接插件connection plugins:負責和被監控端實現通信;
(2)、host inventory:指定操作的主機,是一個配置文件裏面定義監控的主機;
(3)、各種模塊核心模塊、command模塊、自定義模塊;
(4)、藉助於插件完成記錄日誌郵件等功能;
(5)、playbook:劇本執行多個任務時,非必需可以讓節點一次性運行多個任務。

ansible的架構:連接其他主機默認使用ssh協議

一:安裝ansible

ansible
管理端:

1.1 配置環境,安裝epel源環境

在這裏插入圖片描述
在這裏插入圖片描述

yum install -y epel-release  //安裝epel源
yum install ansible -y

1.2 關掉被管理端防火牆

在這裏插入圖片描述

1.3 管理端安裝tree,查看ansible目錄的狀態

在這裏插入圖片描述
在這裏插入圖片描述

tree /etc/ansible/      //樹狀結構展示文件夾
/etc/ansible/
├── ansible.cfg    #ansible的配置文件
├── hosts         #ansible的主倉庫,用於存儲需要管理的遠程主機的相關信息,比如被管理節點的IP
└── roles     #角色

1.4 添加標籤,添加被控主機到主機清單hosts

併爲節點打上類似標籤
在這裏插入圖片描述
在這裏插入圖片描述

cd /etc/ansible
vi hosts       //配置主機清單
[webserver]
192.168.175.130
[mysql]
192.168.175.129

1.5 生成密鑰對

ansible的管理連接方式是使用ssh
在這裏插入圖片描述

ssh-keygen -t rsa
ssh-copy-id [email protected]
ssh-copy-id [email protected]    //配置密鑰對驗證,推送公鑰
---------免交互代理--------------
這樣就不要每次就輸入密碼了
ssh-agent bash
ssh-add

在這裏插入圖片描述
此時環境便配置完畢

二:ansible命令行模塊command

command是默認模塊,若是不用-m指定,便默認執行command

2.1 命令格式:ansible [主機] [-m 模塊] [-a args]

-m 指定模塊 command

-a 指定參數 ,用單引號 ‘date’

ansible 後面可以跟標籤,也可以跟IP地址

linux中的所有命令都可以執行

2.2 列出所有已安裝的模塊 注:按q退出

ansible-doc -l

2.3 -s列出模塊yum描述信息和操作動作

ansible-doc -s yum

2.4 指定ip執行date

ansible 192.168.175.130 -m command -a ‘date’
在這裏插入圖片描述

ansible mysql -m command -a ‘date’
在這裏插入圖片描述

2.5 指定分類標籤執行date

ansible webserver -m command -a ‘date’
在這裏插入圖片描述

2.6 所有hosts主機執行date命令

ansible all -m command -a ‘date’
在這裏插入圖片描述

  • 如果不加-m模塊,則默認運行command模塊

ansible all -a ‘ls /’

三:cron模塊——計劃性任務

資源的兩種狀態(state):present表示添加(可以省略),absent表示移除。
通過state指定期望的狀態以管理目標主機

3.1 查看cron模塊信息

ansible-doc -s cron
在這裏插入圖片描述

3.2 在webserver主機執行-m cron模塊,-a ‘’參數爲:“每分鐘,工作echo heihei到文件內,這個任務的名字叫test cron job

ansible webserver -m cron -a 'minute="*/1" job="/usr/bin/echo heihei >> /opt/info.txt" name="test cron job"'

在這裏插入圖片描述

3.3 查看計劃性任務

ansible webserver -a ‘crontab -l’
在這裏插入圖片描述
在這裏插入圖片描述

3.4 移除absent計劃任務,假如該計劃任務沒有取名字,name=None即可

設置期望狀態爲absent刪除
ansible webserver -m cron -a ‘name=“test cron job” state=absent’
在這裏插入圖片描述

四:user模塊——用戶管理

user模塊是請求的是useradd, userdel, usermod三個指令

4.1 查看user模塊的基本信息

ansible-doc -s user

4.2 創建用戶test01

ansible mysql -m user -a ‘name=“test01”’
在這裏插入圖片描述
在這裏插入圖片描述
不寫雙引號也可以
在這裏插入圖片描述
ansible mysql -m command -a ‘tail /etc/passwd’

4.3 刪除用戶test01

ansible mysql -m user -a ‘name=“test01” state=absent’ //
在這裏插入圖片描述

五:group模塊——組管理

group模塊請求的是groupadd, groupdel, groupmod 三個指令。

5.1 查看group組模塊的基本信息

ansible-doc -s group

5.2 創建系統組,gid爲306,名字叫mysql,在mysql主機標籤上

ansible mysql -m group -a ‘name=mysql gid=306 system=yes’
在這裏插入圖片描述

5.3 查看目標主機組配置文件

ansible mysql -a ‘tail /etc/group’
在這裏插入圖片描述

5.4 添加用戶時可以指定已有的組

ansible mysql -m user -a ‘name=test01 uid=306 system=yes group=mysql’
在這裏插入圖片描述

5.5 查看驗證,可以用id,或者看文件

ansible mysql -a ‘tail /etc/passwd’

ansible mysql -a ‘id test01’
在這裏插入圖片描述

六:copy模塊——複製文件,向文件寫入信息

6.1 查看copy模塊基本信息

ansible-doc -s copy

6.2 把一個文件從src本地複製到dest目標主機,指定擁有者owner,和權限mode

ansible mysql -m copy -a ‘src=/etc/fstab dest=/opt/fstab.back owner=root mode=640’
在這裏插入圖片描述

6.3 查看驗證

ansible mysql -a ‘ls -l /opt’
在這裏插入圖片描述
ansible mysql -a ‘cat /opt/fstab.back’

6.4 往文件內寫入內容content,類似echo

/將hello heihei!寫入目標主機的/opt/fstab.back
ansible mysql -m copy -a ‘content=“hello heihei!” dest=/opt/fstab.back’
在這裏插入圖片描述

6.5 查看驗證

ansible mysql -a ‘cat /opt/fstab.back’
在這裏插入圖片描述

七:file模塊——指定文件屬性,文件路徑path

7.1 查看file模塊基本信息

ansible-doc -s file

7.2 先創建用戶和組

ansible mysql -m user -a ‘name=mysql system=yes’

ansible mysql -m group -a ‘name=mysql system=yes’

7.3 修改文件的屬主屬組權限等

查看當前被管理節點的文件狀態,爲644
在這裏插入圖片描述

  • 指定文件路徑path,設置擁有者,組,權限666
    ansible mysql -m file -a ‘owner=mysql group=mysql mode=644 path=/opt/fstab.back’
    在這裏插入圖片描述
    在這裏插入圖片描述

7.4 設置/opt/fstab.link爲/opt/fstab.back的鏈接文件link

期望狀態爲link
ansible mysql -m file -a ‘path=/opt/fstab.link src=/opt/fstab.back state=link’
在這裏插入圖片描述
在這裏插入圖片描述

7.5 刪除一個文件

指定目標文件路徑,期望狀態爲absent刪除
ansible mysql -m file -a “path=/opt/fstab.back state=absent”
在這裏插入圖片描述

7.6 創建一個空文件

期望狀態爲touch
ansible mysql -m file -a “path=/opt/test state=touch”
在這裏插入圖片描述
在這裏插入圖片描述

7.7 創建目錄

ansible webserver -m file -a ‘path=/opt/temp state=directory mode=755’

八:ping模塊

8.1 ping所有目標主機

ansible all -m ping
在這裏插入圖片描述

九:yum模塊安裝軟件

9.1 查看yum模塊詳細信息

ansible-doc -s yum

9.2 yum安裝zsh

ansible mysql -m yum -a ‘name=zsh’
在這裏插入圖片描述
查看被管理端的狀態
[root@ac ~]# rpm -q zsh
在這裏插入圖片描述

9.3 卸載zsh

ansible mysql -m yum -a ‘name=zsh state=absent’
[root@ac ~]# rpm -q zsh

十:service模塊

10.1 查看service模塊的詳細信息

ansible-doc -s service

[root@ab ~]# yum install -y httpd

10.2 查看web服務器httpd服務運行狀態

使用命令查看
[root@aa ~]# ansible webserver -a ‘systemctl status httpd’

10.2 啓動httpd服務,指定自啓,開啓

ansible webserver -m service -a ‘enabled=true name=httpd state=started’
在這裏插入圖片描述

10.3 關閉目標主機的防火牆服務

ansible all -m service -a ‘name=firewalld state=stopped’
在這裏插入圖片描述

[root@ab ~]# systemctl status httpd //查看是否開啓
在這裏插入圖片描述

十一:shell模塊

11.1 查看shell模塊的詳細信息

ansible-doc -s shell

11.2 創建用戶使用無交互模式給用戶設置密碼

在這裏插入圖片描述
在這裏插入圖片描述
ansible mysql -m shell -a ‘echo abc123|passwd --stdin jerry’
在這裏插入圖片描述

十二:script腳本模塊

12.1 查看script模塊的詳細信息

ansible-doc -s script

12.2 讓被管理服務器全部執行本地管理節點的腳本中的操作

  • 在ansible 管理端創建腳本

執行script腳本中的操作:向一個文件內寫入內容的操作

vi test.sh
#!/bin/bash
echo "hello ansible from script"> /opt/script.txt

chmod +x test.sh
ansible mysql -m script -a 'test.sh'
[root@ac ~]# cat /opt/script.txt

管理端
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

十三:setup模塊,主機的詳細信息模塊

ansible-doc -s setup

  • 可以獲取mysql標籤主機的facts信息
  • 比如IP地址信息,服務名稱,版本信息

ansible mysql -m setup

在這裏插入圖片描述

信息太多了,特別是要管理的有好幾萬臺,這麼多的信息,就需要用python去爬蟲爬到所需要的信息

十四:inventory 主機清單

ansible默認的主機清單是/etc/ansible/hosts文件

主機清單可以手動設置,也可以通過Dynamic Inventory動態生成
一般主機名使用FQDN

hosts文件內可以定義ip地址,或者也可以添加完整的主機域名,後面還可以接對應的端口號,也可以定義變量

地址是按序列號排的

14.1 編輯/etc/ansible/hosts

vi /etc/ansible/hosts
[webserver]      #方括號設置組名
www1.example.org    #定義被監控主機名稱,這邊可以是主機名也可以是IP地址,主機名需要修改/etc/hosts文件
www2.example.org:2222     #冒號後定義遠程連接端口,默認是ssh的22端口

如果是名稱類似的主機,可以使用列表這種變量的方式標識各個主機
[webserver]
www[01:50].example.org ansible_ssh_user=root ansible_ssh_pass=123456
#www01.example.org、www02.example.org、、、到www50.example.org都在這個標籤內,
#ansible_ssh_user=root ansible_ssh_pass=123456是內置的變量


[dbbservers]
db-[a:f].example.org //也支持匹配a b c ... f

14.2 下面是Inventory中變量

(1)主機變量

http_port的變量是可變的,也可以是qq

[webserver]
www1.magedu.com http_port=80 maxRequestsChild=808
www2.magedu.com http_port=8080 maxRequestsChild=909

(2)組變量

[servers:vars]
ntp_server=ntp.example.org
nfs_server=nfs.example.org

(3)組嵌套

[apache]		#apache有兩臺主機
http1.example.org
http2.example.org

[nginx]		#nginx有兩臺主機
ngx1.example.org
ngx2.example.org

[webservers:children]		#組下面也可以包含組
apache
nginx

(4)inventory變量參數 #自帶的內置變量

參數	                        說明
ansible_ssh_host	將要連接的遠程主機名.與你想要設定的主機的別名不同的話,可通過此變量設置.
ansible_ssh_port	ssh端口號.如果不是默認的端口號,通過此變量設置.
ansible_ssh_user	默認的 ssh 用戶名
ansible_ssh_pass	ssh 密碼(這種方式並不安全,我們強烈建議使用 --ask-pass 或 SSH 密鑰)
ansible_ssh_private_key_file	ssh 使用的私鑰文件.適用於有多個密鑰,而你不想使用 SSH 代理的情況.
ansible_ssh_common_args	此設置附加到sftp,scp和ssh的缺省即默認命令行
ansible_sftp_extra_args	此設置附加到默認sftp命令行。,安全級別
ansible_scp_extra_args	此設置附加到默認scp命令行。,安全級別
ansible_ssh_extra_args	此設置附加到默認ssh命令行。,安全級別
ansible_ssh_pipelining	確定是否使用SSH管道。 這可以覆蓋ansible.cfg中的設置。
ansible_shell_type	目標系統的shell類型.默認情況下,命令的執行使用 'sh' 語法,可設置爲 'csh' 或 'fish'.
ansible_python_interpreter	目標主機的 python 路徑.適用於的情況: 系統中有多個 Python, 或者命令路徑不是"/usr/bin/python",比如 *BSD, 或者 /usr/bin/python
ansible_*_interpreter	這裏的"*"可以是ruby 或perl 或其他語言的解釋器,作用和ansible_python_interpreter 類似
ansible_shell_executable	這將設置ansible控制器將在目標機器上使用的shell,覆蓋ansible.cfg中的配置,默認爲/bin/sh。

十五:劇本的文件playbook

15.1 YAML格式

YAML:是一種非標記語言。是用來寫配置文件的語言,非常簡潔和強大。
YAML語法和其他語言類似,也可以表達散列表、標量等數據結構。
結構通過空格來展示;序列裏配置項通過-來代表;Map裏鍵值用:來分隔;YAML的擴展名爲yaml

15.1.1 基本語法規則:

1.大小寫敏感
2.使用縮進表示層級關係
3.縮進時不允許使用Tab鍵,只允許使用空格。
4.縮進的空格數目不重要,只要相同層級的元素左側對齊即可

15.1.2 YAML支持的數據結構:

1.對象:鍵值對的集合,又稱爲映射(mapping)/ 哈希(hashes) / 字典(dictionary)
例如:name:Example Developer
鍵 值
2.數組:一組按次序排列的值,又稱爲序列(sequence) / 列表(list)
例如:-Apple
-Orange
3.純量:單個的、不可再分的值
例如:number:12.30
sure:true

15.1.3 yaml示例:


name:zhangsan
age:20
name:lisi
age:22
people:
-name:zhangsan
age:20
-name:lisi
age:22

對象裏面包含多個屬性

對象
  屬性1   長:5M
  屬性2   寬:2M
  屬性3   高:1.5M
  
集合
  對象1
  對象2
  對象3

15.2 劇本 playbook概述

是ansible核心組件

Ansible的腳本—playbook劇本
通過task任務調用ansible的模板將多個play組織在一個playbook中運行。

15.2.1 playbooks本身由以下各部分組成

(1)Tasks:任務,即調用模塊完成的某操作;執行了一個tasks,就相當於執行了一個事務,如果當中有失敗,就會回滾
(2)Variables:變量,在劇本中自定義變量,變量能聲明的有三個場景:主機清單hosts文件,劇本當中、命令當中
(3)Templates:模板,使用統一的模板,就可以配置多個主機的配置文件,模板格式爲*.j2
(4)Handlers:處理器觸發器,當某條件滿足時,觸發執行的操作;
(5)Roles:角色。

15.2.2 下面是一個playbook的示例

- hosts: webserver              //定義的主機組,即應用的主機
  vars:                        //定義變量
    http_port: 80
    max_clients: 200
  user: root
  tasks:                               //執行的任務
  - name: ensure apache is at the latest version	#任務名可以自定義
    yum: pkg=httpd state=latest	#模塊:具體參數,檢查httpd是否是最新版本
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf	#模板,這個src文件放在管理端,dest到被管理端去
    notify:	#調用下面處理器,指定處理器名
    - restart apache
  - name: ensure apache is running
    service: name=httpd state=started
  handlers:                       //處理器
    - name: restart apache
      service: name=httpd state=restarted	#服務:參數,狀態要爲過去式

15.2.3 執行一個playbook

ansible-playbook [yaml文件名]

例如:ansible-playbook ping.yml
參數:-k(–ask-pass) 用來交互輸入ssh密碼
-K(-ask-become-pass) 用來交互輸入sudo密碼,提權
-u 指定用戶
補充命令:

  • 檢查yaml文件的語法是否正確

ansible-playbook nginx.yaml --syntax-check

  • 檢查tasks任務

ansible-playbook nginx.yaml --list-task

  • 檢查生效的主機

ansible-playbook nginx.yaml --list-hosts

  • 指定從某個task開始運行

ansible-playbook nginx.yaml --start-at-task=‘Copy Nginx.conf’

15.2.4 hosts和users介紹


---這個是開頭
- hosts: webserver               #指定主機組,可以是一個或多個組。,劇本的場景
  remote_user: root                #指定遠程被管理端主機執行的用戶名,用戶要有權限,劇本的演員

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

  • 檢查語法是否正確
    在這裏插入圖片描述
    若是錯誤的話,會出現下面這種類型的報錯
    在這裏插入圖片描述

15.2.5 還可以爲每個task任務定義遠程執行用戶:


- hosts: mysql			#劇本的場景
  remote_user: root     #劇本的演員 
  tasks:				#劇本做要什麼事
    - name: test connection
      ping:				#模塊名
      remote_user: mysql          #指定遠程主機執行tasks的運行用戶爲mysql

在這裏插入圖片描述
ansible-playbook ping.yml執行腳本

權限拒絕,可以將用戶改成root

執行playbook時:ansible-playbook ping.yml -k
-k(–ask-pass) 用來交互輸入ssh密碼

15.2.6 指定遠程主機sudo切換用戶:

- hosts: mysql
  remote_user: root            
  become: yes	               #2.6版本以後的參數,之前是sudo,意思爲切換用戶運行
  become_user: mysql          #指定sudo用戶爲mysql

在這裏插入圖片描述
在這裏插入圖片描述

執行playbook時:ansible-playbook ping.yml -K
-K(-ask-become-pass) 用來交互輸入sudo密碼,提權

15.2.7 tasks列表和action

1.Playbook的主體部分是task列表,task列表中的各任務按次序逐個在hosts中指定的主機上執行,即在所有主機上完成第一個任務後再開始第二個任務。
在運行playbook時(從上到下執行),如果一個host執行task失敗,整個tasks都會回滾,請修正playbook 中的錯誤,然後重新執行即可。
Task的目的是使用指定的參數執行模塊,而在模塊參數中可以使用變量,模塊執行時冪等的,這意味着多次執行是安全的,因爲其結果一致。
2.每一個task必須有一個名稱name,這樣在運行playbook時,從其輸出的任務執行信息中可以很好的辨別出是屬於哪一個task的。如果沒有定義name,‘action’的值將會用作輸出信息中標記特定的task。
3.定義一個task,常見的格式:”module: options” 例如:yum: name=httpd
4.ansible的自帶模塊中,command模塊和shell模塊無需使用key=value格式

小示例:


- hosts: 192.168.80.182
  remote_user: root
  tasks:
   - name: disable selinux
     command: '/sbin/setenforce 0'
   - name: make sure apache is running
     service: name=httpd state=started

在這裏插入圖片描述
在這裏插入圖片描述

play中只要執行命令的返回值不爲0,就會報錯,tasks停止並回滾

15.2.8 修改ignore_errors如下:確認忽略報錯,強制返回成功

確認忽略報錯,強制返回成功

- hosts: webserver
  remote_user: root
  tasks:
   - name: disable selinux
     command: '/sbin/setenforce 0'
     ignore_errors: True             #確認忽略報錯,強制返回成功
   - name: make sure apache is running
     service: name=httpd state=started

在這裏插入圖片描述

  • 以下是另外一個示例
- hosts: webserver
  remote_user: root
  tasks:
   - name: create nginx group
     group: name=nginx system=yes gid=208
   - name: create nginx user
     user: name=nginx uid=208 group=nginx system=yes
- hosts: mysql
  remote_user: root
  tasks:
   - name: copy file to mysql
     copy: src=/etc/inittab dest=/opt/inittab.back

15.2.9 Handlers觸發器執行操作介紹

Handlers也是一些task的列表,和一般的task並沒有什麼區別。
是由通知者進行的notify,如果沒有被notify,則Handlers不會執行,假如被notify了,則Handlers被執行
不管有多少個通知者進行了notify,等到play中的所有task執行完成之後,handlers也只會被執行一次

notify去添加觸發器的條件

示例


- hosts: webserver
  remote_user: root
  tasks:
   - name: install httpd package
     yum: name=httpd state=latest
   - name: install configuration file for httpd
     copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf
     notify:
      -restart httpd
   - name: start httpd service
     service: enabled=true name=httpd state=started
  handlers:
   - name: restart httpd
     service: name=httpd state=restarted

15.2.10 觸發器也可以引入變量

- hosts: webserver
  remote_user: root
  vars:
  - package: httpd
  - service: httpd
  tasks:
   - name: install httpd package
     yum: name={{package}} state=latest
   - name: install configuration file for httpd
     copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf
     notify:
      -restart httpd
   - name: start httpd service
     service: enabled=true name={{service}} state=started
  handlers:
   - name: restart httpd
     service: name={{service}} state=restarted

十六:playbook使用變量的方法:

16.1 通過ansible命令傳遞

例如:編輯如下yaml

vi a.yml
- hosts: mysql
  remote_user: root
  vars:
  - user:
  tasks:
  - name: add new user
    user: name={{user}}

然後執行命令: ansible-playbook a.yml -e “user=testvar”

可以執行命令查看:ansible mysql -m command -a ‘tail /etc/passwd’

16.2 直接在yaml中定義變量—如上handlers示例

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

驗證
在這裏插入圖片描述

16.3 直接在/etc/ansible/hosts文件中指定主機變量

在這裏插入圖片描述

或者在執行腳本時後面接-e,使用命令傳遞

ansible-playbook a.yml -e “user=testvar”

16.4 直接引用一些固定變量

如:引用ansible的固定變量

ansible_all_ipv4_addresses 是內置變量,所有地址

vi test.yml
- hosts: mysql
  remote_user: root
  tasks:
   - name: copy file
     copy: content="{{ansible_all_ipv4_addresses}}" dest=/opt/vars.txt	#content爲具體內容

執行命令:ansible-playbook test.yml
去mysql節點上查看vars.txt文件內容
在這裏插入圖片描述
在這裏插入圖片描述

再如:引用主機變量

vi /etc/ansible/hosts
在mysql組的主機後面添加如下
[mysql]
192.168.80.183 testvar="80.183"          #定義testvar變量的值爲80.183

十七:playbook中的流程控制,符合指定條件執行task

17.1 條件測試——when

如果需要根據變量、facts(setup)或此前任務的執行結果來作爲某task執行與否的前提時要用到條件測試,在Playbook中條件測試使用when子句。
在task後添加when子句即可使用條件測試:when子句支持jinjia2表達式或語法,例如:

vi when.yml
- hosts: mysql
  remote_user: root
  tasks:
    - name: "shutdown CentOS"
      command: /sbin/shutdown -h now	#關機
      when: ansible_distribution == "CentOS"	#只有符合這個條件才能執行這個任務

17.2 多條件判斷

vi when.yml

- hosts: mysql
  remote_user: root
  tasks:
    - name: "shut down CentOS 7 systems"
      command: /sbin/shutdown -r now
      when:		#這個代表兩個條件都符合纔會執行這個task
        - ansible_distribution == "CentOS"
        - ansible_distribution_major_version == "7"

17.3 組條件判斷就是多個(or/and)的多條件判斷,一般用or的多

vi when.yml

- hosts: mysql
  remote_user: root
  tasks:
    - name: "shut down CentOS 6 and Debian 7 systems"
      command: /sbin/shutdown -t now
      when: (ansible_distribution == "CentOS" and ansible_distribution_major_version == "6") or
            (ansible_distribution == "Debian" and ansible_distribution_major_version == "7")

17.4 自定義變量進行條件測試

vi when.yml
- hosts: all
  vars:
    exist: "True"
  tasks:
  - name: creaet file
    command:  touch /tmp/test.txt
    when: exist | match("True")		#match代表匹配
  - name: delete file
    command:  rm -rf /tmp/test.txt
    when: exist | match("False")	

十八:迭代

當有需要重複性執行的任務時,可以使用迭代機制。其使用格式爲將需要迭代的內容定義爲item變量引用,並通過with_items語句指明迭代的元素列表即可。例如:

- hosts: webserver
  remote_user: root
  tasks:
    - name: "Install Packages"
      yum: name={{ item }} state=latest
      with_items:	#會輪流把軟件都安裝好
        - httpd
        - mysql-server
        - php

在這裏插入圖片描述
在這裏插入圖片描述

也可以自己定義屬組,一個對象包含兩個屬性

- hosts: webserver
  remote_user: root
  tasks:
    - name: "Add users"
      user: name={{ item.name }} state=present groups={{ item.groups }}
      with_items:
        - { name:'test1', groups:'wheel'}
        - { name:'test2', groups:'root'}

十九:Templates模板模塊j2

19.1 複製一個原有的配置文件做成模板

scp [email protected]:/etc/httpd/conf/httpd.conf ./
vi templates/httpd.conf      //放在管理端
Listen {{http_port}}		#監聽端口換成變量
ServerName {{server_name}}
MaxClients {{access_num}}	#自己在servername下添加

19.2 mv httpd.conf httpd.conf.j2

變成模板,j2

然後可以將變量設置在主機文件內
在這裏插入圖片描述

vi /etc/ansible/hosts
[webserver]
192.168.175.130 http_port=192.168.175.130:80 access_num=100 server_name="www.yun.com:80"

19.3 編輯劇本

//注意格式對齊

vi apache.yml
- hosts: webserver
  remote_user: root
  vars:
    - package: httpd
    - service: httpd
  tasks:
    - name: install httpd package
      yum: name={{package}} state=latest
    - name: install configure file
      template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf	#指定模板路徑到目標主機路徑
      notify:	#觸發器
        - restart httpd
    - name: start httpd server
      service: name={{service}} enabled=true state=started
  handlers:
    - name: restart httpd
      service: name={{service}} state=restarted

在這裏插入圖片描述

19.4 ansible-playbook apache.yml #執行腳本

在這裏插入圖片描述

19.5 去看配置文件有沒有改,去兩臺遠程主機上查看驗證

grep -i listen /etc/httpd/conf/httpd.conf
grep -i maxClient /etc/httpd/conf/httpd.conf
grep -i servername /etc/httpd/conf/httpd.conf
在這裏插入圖片描述

二十:tags標籤模塊

20.1 tags 爲only

在一個playbook中,我們一般會定義很多個task,如果我們只想執行其中的某一個task或多個task時就可以使用tags標籤功能了,格式如下:

給單個任務打標籤,名爲only,

vi hosts.yml
- hosts: webserver
  remote_user: root
  tasks:
    - name: Copy hosts file
      copy: src=/etc/hosts dest=/opt/hosts
      tags:
      - only
    - name: touch file
      file: path=/opt/hosts01 state=touch

在這裏插入圖片描述

20.2 執行命令:ansible-playbook hosts.yml --tags=“only”

在這裏插入圖片描述
追加的參數tags的名字,執行這個命令就只執行該標籤的task
在這裏插入圖片描述
ansible-playbook hosts.yml

20.3 tags爲always

事實上,不光可以爲單個或多個task指定同一個tags。

playbook還提供了一個特殊的tags爲always。

作用就是當使用always當tags的task時,無論執行哪一個tags時,定義有always的tags的task都會執行。

vi hosts.yml

- hosts: webserver
  remote_user: root
  tasks:
    - name: Copy hosts file
      copy: src=/etc/hosts dest=/etc/hosts
      tags:
      - only
    - name: touch file
      file: path=/opt/hosts state=touch
      tags:
      - always

在這裏插入圖片描述
執行命令:ansible-playbook hosts.yml --tags=“only”
在這裏插入圖片描述

分別去兩臺被管理服務器上去查看文件創建情況

二十一:roles角色管理

使用角色功能創建lamp
在這裏插入圖片描述
主機文件指定服務器

roles目錄內部默認是空的,需要自己創建
在這裏插入圖片描述

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

roles/
   web/			#服務名
     files/
     templates/
     tasks/
     handlers/
     vars/
     defaults/
     meta/

21.1 roles內各目錄含義解釋

files:用來存放由copy模塊或script模塊調用的文件。
templates:用來存放jinjia2模板,template模塊會自動在此目錄中尋找jinjia2模板文件。
tasks:此目錄應當包含一個main.yml文件,用於定義此角色的任務列表,此文件可以使用include包含其它的位於此目錄的task文件。
handlers:此目錄應當包含一個main.yml文件,用於定義此角色中觸發條件時執行的動作。
vars:此目錄應當包含一個main.yml文件,用於定義此角色用到的變量。
defaults:此目錄應當包含一個main.yml文件,用於爲當前角色設定默認變量。
meta:此目錄應當包含一個main.yml文件,用於定義此角色的特殊設定及其依賴關係。

21.2 在一個playbook中使用roles的步驟:

1)創建以roles命名的目錄。
mkdir /etc/ansible/roles/ -p #yum裝完默認就有

2)創建全局變量目錄。
mkdir /etc/ansible/group_vars/ -p
touch /etc/ansible/group_vars/all #文件名自己定義,引用的時候注意

3)在roles目錄中分別創建以各角色名稱命令的目錄,如httpd。
mkdir /etc/ansible/roles/common -p

4)在每個角色命令的目錄中分別創建files、handlers、tasks、templates、meta、defaults和vars目錄,用不到的目錄可以創建爲空目錄,但不可以不創建
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

5)在每個角色的handlers、tasks、meta、defaults、vars目錄下創建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

6)在playbook文件中,調用各角色。

vi /etc/ansible/site.yml
- hosts: webserver
  remote_user: root
  roles:
     - httpd
     - mysql

二十二:實驗:使用過roles模塊安裝搭建LAMP架構

22.1 創建各個服務下面的各個空目錄

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} -p

在這裏插入圖片描述
在這裏插入圖片描述

22.2 創建各個模塊下的yml文件

除了files和template目錄模塊下不創建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
touch /etc/ansible/roles/php/{defaults,vars,tasks,meta,handlers}/main.yml

在這裏插入圖片描述

22.3 編寫httpd服務模塊

寫一個簡單的tasks/main.yml,這個文件之前已經創建

vi /etc/ansible/roles/httpd/tasks/main.yml
- name: ensure apache is at the latest version 
  yum: pkg={{ pkg }} state=latest

在這裏插入圖片描述
在這裏插入圖片描述
定義變量:可以定義在全局變量中,也可以定義在roles角色變量中,一般定義在角色變量中

vi /etc/ansible/roles/httpd/vars/main.yml
pkg: httpd

在這裏插入圖片描述
在這裏插入圖片描述

此時第一個服務的角色就已經配置好了

22.4 編寫mysql模塊

vi /etc/ansible/roles/mysql/tasks/main.yml
- name: ensure mysql is at the latest version 
  yum: pkg={{ pkg }} state=latest

在這裏插入圖片描述
在這裏插入圖片描述

vi /etc/ansible/roles/mysql/vars/main.yml
pkg: mariadb*

在這裏插入圖片描述
在這裏插入圖片描述

22.5 編寫php模塊

vi /etc/ansible/roles/php/tasks/main.yml
- name: ensure php is at the latest version
  yum: pkg={{ pkg }} state=latest

在這裏插入圖片描述
在這裏插入圖片描述

vi /etc/ansible/roles/php/vars/main.yml
pkg: php

在這裏插入圖片描述
在這裏插入圖片描述

22.6 編寫roles示例

創建一個總體的劇本去拉取這些服務
在這裏插入圖片描述

vi /etc/ansible/site.yml

- hosts: webserver	#指定主機
  remote_user: root	#指定演員
  roles:		#指定角色
   - httpd
   - mysql
   - php

要確保當前目錄下有對應的角色目錄
在這裏插入圖片描述
在這裏插入圖片描述
到被管理端查看
在這裏插入圖片描述
在這裏插入圖片描述
此時mysql沒有安裝,回到管理端查看
在這裏插入圖片描述

在這裏插入圖片描述

發現只裝了一個mysql客戶端

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章