文章目錄
- ansible概述
- 一:安裝ansible
- 二:ansible命令行模塊command
- 2.1 命令格式:ansible [主機] [-m 模塊] [-a args]
- 2.2 **列出所有已安裝的模塊 注:按q退出**
- 2.3 **-s列出模塊yum描述信息和操作動作**,
- 2.4 **指定ip執行date**
- 2.5 **指定分類標籤執行date**
- 2.6 **所有hosts主機執行date命令**
- 三:cron模塊——計劃性任務
- 3.1 **查看cron模塊信息**
- 3.2 **在webserver主機執行-m cron模塊,-a ‘’參數爲:“每分鐘,工作echo heihei到文件內,這個任務的名字叫test cron job**”
- 3.3 **查看計劃性任務**
- 3.4 **移除absent計劃任務,假如該計劃任務沒有取名字,name=None即可**
- 四:user模塊——用戶管理
- 五:group模塊——組管理
- 5.1 查看group組模塊的基本信息
- 5.2 創建系統組,gid爲306,名字叫mysql,在mysql主機標籤上
- 5.3 **查看目標主機組配置文件**
- 5.4 **添加用戶時可以指定已有的組**
- 5.5 **查看驗證**,可以用id,或者看文件
- 六:copy模塊——複製文件,向文件寫入信息
- 6.1 查看copy模塊基本信息
- 6.2 **把一個文件從src本地複製到dest目標主機,指定擁有者owner,和權限mode**
- 6.3 **查看驗證**
- 6.4 **往文件內寫入內容content,類似echo**
- 6.5 **查看驗證**
- 七:file模塊——**指定文件屬性**,文件路徑path
- 7.1 查看file模塊基本信息
- 7.2 先創建用戶和組
- 7.3 **修改文件的屬主屬組權限等**
- 7.4 **設置/opt/fstab.link爲/opt/fstab.back的鏈接文件**link
- 7.5 **刪除一個文件**
- 7.6 **創建一個空文件**
- 7.7 **創建目錄**
- 八:ping模塊
- 九:yum模塊安裝軟件
- 十:service模塊
- 十一:shell模塊
- 十二:script腳本模塊
- 十三:setup模塊,主機的詳細信息模塊
- 十四:inventory 主機清單
- 十五:劇本的文件playbook
- 十六:playbook使用變量的方法:
- 16.1 **通過ansible命令傳遞**
- 16.2 直接在yaml中定義變量---如上handlers示例
- 16.3 直接在/etc/ansible/hosts文件中指定主機變量
- 16.4 **直接引用一些固定變量**
- 十七:playbook中的流程控制,符合指定條件執行task
- 十八:迭代
- 十九:Templates模板模塊j2
- 19.1 **複製一個原有的配置文件做成模板**
- 19.2 **mv httpd.conf httpd.conf.j2**
- 19.3 編輯劇本
- 19.4 ansible-playbook apache.yml #執行腳本
- 19.5 **去看配置文件有沒有改,去兩臺遠程主機上查看驗證**
- 二十:tags標籤模塊
- 二十一:roles角色管理
- 二十二:實驗:使用過roles模塊安裝搭建LAMP架構
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客戶端