palybook使用
####yaml語法
ansible中使用的yaml基礎元素:
變量
Inventory
條件測試
迭代
playbook的組成結構
Inventory
Modules
Ad Hoc Commands
Playbooks
Task:任務,即調用模塊完成的某操作
Variables:變量
Templates:模板
Handlers:處理器,由某事件觸發執行的操作
Roles:角色
#####定義/etc/ansible/hosts
兩種方式:
基於ssh密碼登錄
不配置免密碼登錄,需要在hosts文件中配置
第一種:基於ssh密碼登錄
參數一:inventory
ansible的主要功能用於批量管理主機操作,便捷的使用部分主機,可以在inventory file中分組
默認的inventory file為/etc/ansible/hosts
1.inventory文件格式
同一主機歸並到一個或者多個組中,主機使用非默認的22端口,也可以在主機名稱后加冒號端口標明
www.ab.com
[webservers] www.abc.com:222 www.abcd.com [dbservers] db1.abc.com db2.abc.com db3.abc.com
如果主機遵循相似的命名模式,可以使用列表標記各個主機
[webserver] www[01:30].example.com [dbserver] db-[a:f].example.com
2.主機變量
可以在定義主機時添加遠程主機變量便於在playbook中使用{http中的變量,在j2中配置}
[webserver] www.ab.com http_port=80 maxRequestsPerChild=808 www.abc.com http_port=8080 maxRequestsPerChild=909
3.組變量
賦予指定組內的所有主機在playbook中用的變量(vars)
可以調用組里面的變量。
[webserver] www.ab.com www.bc.com [webserver:vars] host_port=80 maxRequestsPerChild=890
4.組嵌套
組還包括其他組,可以在其他組中指定變量,只能在ansible-playbook中使用,ansible不支持
children中包括apache,nginx的主機。,共四台主機
[apache] http1.abc.com http2.abc.com [nginx] nginx1.abc.com nginx2.abc.com [webservers:children] apache nginx [webservers:vars] host_port=80
ansible基於ssh連接inventory可以指定遠程主機,通過參數指定交互式,參數如下:
ansible_ssh_host ansible_ssh_port ansible_ssh_user ansible_ssh_pass ansible_sudo_pass ansible_connection ansible_ssh_private_key_file ansible_shell_type ansible_python_interpreter
第二種:不基於ssh免密碼登錄
即便是我們沒有做關於秘鑰的認證,我們也會自動使用賬戶和密碼來登錄該主機。
[webservers] 192.168.133.2 ansible_ssh_user=root ansible_ssh_pass=123456 192.168.133.3 testvar="2.100
####基本結構
實例一:module_name: module_args 模塊名和模塊參數
- host: webserver
remote_user:
task:
- task1
module_name: module_args
- name: test connection
ping:
remote_user; www
sudo: yes
command: /sbin/setenforce 0
shell: /usr/bin/somecommand || /bin/true
ignore_errors: True
- task2
module_name: module_args
- host:dbservers
在運行playbook是中途發生錯誤,可能會回滾,更正后,重新執行一次。
可以指定使用sudo的方式遠程執行任務,用sudo到root用戶執行命令。
眾多模塊中,只有command和shell模塊僅使用給定一個列表而無需使用"key=value"
命令或腳本的退出碼不為0,可以使用如上替代,命令不成功強行成功。
使用ignore_errors忽略錯誤信息
實例二:handlers:
在notify中列出的操作為handler,比如之前配置了apache的配置文件,http.conf端口發生變化后,重新執行ansible-playbook后,查看遠程的端口,並未發生變化。需要用到notify
引入變量:
vars:在后面添加變量名,然后再引入變量,必須加{{}},用變量名替換。
- host: webservers remote_user: root
vars:
- packages: httpd tasks: - name: install httpd packages yum: name={{ packages }} state=lastest - name: install configuration file for httpd copy: src=/root/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf notify: - restart httpd - name: start httpd service service: enabled=true name={{ packages }} state=started handlers: - name: restart httpd service: name={{ packages }} state=restarted
實例三:將每台主機的ip地址(ansible_all_ipv4_addresses)發送到遠程主機的/tmp/var.ansible文檔中,查找變量名(ansible_all_ipv4_addresses用命令:ansible 192.168.133.4 -m setup ),也可以用主機傳導一些變量。用組變量或者inventory變量。在主機webservers中定義變量testvar和調用ansible_ssh_host,在目標主機中調用這個變量。
vi /etc/ansible/hosts
[webservers]
192.168.133.2 testvar="1.100" ansible_ssh_host=root
192.168.133.3 testvar="2.100"
vi test.yml
- hosts: webservers
remote_user: root
tasks:
- name: copy file
copy: content="{{ ansible_all_ipv4_addresses }}, {{ testvar }}" dest=/tm/vars.ansible
在遠程主機上查看cat /tmp/vars.ansible
或者ssh 192.168.133.2 cat /tmp/vars.ansible
案例四:when條件變量
當檢查系統為Debin系統時,關機。
- name: "shutdown Debian system" command: /sbin/shutdown -h now when: ansible_os_family == "Debin"
當ansible_fqdn == "www.test.com"時,創建user10用戶
- hosts: all
remote_user: root
vars:
- username: user10
tasks:
- name: create {{ username }} user
user: name={{ username }}
when: ansible_fqdn == "www.test.com"
案例五:迭代:
當有需要重復性執行的任務時,可以用迭代機制,使用格式為將需要迭代的內容定義為item變量引用
並通過with_items語句來指明迭代的元素列表即可
- name: add several users
user: name={{ item }} state=present groups=wheel
with_items:
- testuser1
- testuser2
上面的語句功能等同於下面的語句:
- name: add several users1
user: name=testuser1 state=present groups=wheel
- name: add several users2
user: name=testuser2 state=present groups=wheel
事實上with_items可以使用元素還可為hashes,
注意:name: 'testuser1'調用的是item.name;group: 'wheel'調用的是item.groups,
其中item.后面的name是自己定義的,with_items中的子名字name是自己定義的,和item.后面定義的一致。
- name: add several users
user: name={{ item.name }} state=present groups={{ item.groups }}
with_items:
- { name: 'testuser1', group: 'wheel' }
- { name: 'testuser2', group: 'root' }
案例六:template:模板
比如兩台遠程服務器要監聽的端口不同,maxclients不同,而且主機名不同。可以調用模板。j2代表模板。在本地創建模板文件httpd.conf.j2,在yml中定義template
cd /root/ && mkdir templates && cp conf/httpd.conf templates/
mv templates/httpd.conf template/httpd.conf.j2
vim httpd.conf.j2
Listen {{ http_port}}
MaxClients {{ maxClients}}
ServerName {{ ansbible_fqdn }}
vi /etc/ansible/hosts
[webservers]
192.168.133.2 http_port=80 maxClients=100
192.168.133.3 http_port=8080 maxClients=200
vi apache.yml
- host: webservers
remote_user: root
vars:
- package: httpd
tasks:
- name: install httpd packages
yum: name={{ package }} state=lastest
- name: install configuration file for httpd
template: src=/root/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
- name: start httpd service
service: enabled=true name={{ package }} state=started
handlers:
- name: restart httpd
service: name=httpd state=restarted
ansible-playbook apache.yml
案例七:tags
多次運行playbook時,其中某些task不需要運行,只需運行某個task,可以單獨標記該task,在yml中指定tags。
在playbook可以為某個或某些任務定義為一個標簽,在執行playbook時,通過ansible-playbook命令使用--tags選項能實現僅運行指定的tasks而非所有的。
其中tags中的conf和service為自己命名的。特殊:不能定義為always
vi apache.yml
- host: webservers
remote_user: root
vars:
- package: httpd
tasks:
- name: install httpd packages
yum: name={{ package }} state=lastest
- name: install configuration file for httpd
template: src=/root/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
tags:
- conf
notify:
- restart httpd
- name: start httpd service
service: enabled=true name={{ package }} state=started
tags:
- service
handlers:
- name: restart httpd
service: name=httpd state=restarted
ansible-playbook apache.yml --tags="conf"
ansible-playbook apache.yml --tags="service"
案例八:roles,推薦使用
推薦使用此種模式
roles:
1.目錄名同文件名
2.目錄結構有固定格式
files:靜態文件
templates:Jinjia2模板文件
tasks:至少有main.yml文件,定義各tasks
handlers:至少一個main.yml文件,定義各handlers
vars:至少有一個main.yml文件,定義變量
meta:定義依賴關系等信息
3.site.yml中定義playbook,額外有其他的yml文件。
roles能根據層次型結構目錄裝載變量文件,task已經handlers,使用roles需要在playbook中
使用include指令即可。roles通過將變量,文件,任務,模塊,處理器放置到單獨的目錄找那中
roles案例:
tree ansible_playbook
site.yml
webservers.yml
dbservers.yml
roles/
common/
files/
templates/
tasks/
handlers/
vars/
meta/
webservers/
files/
templates/
tasks/
handlers/
vars/
meta/
在playbook中,可以這樣使用roles:
- hosts: webservers
roles:
- common
- webservers
也可以向 roles傳遞參數,例如:
- hosts: webservers
roles:
- common
- { role: foo app instance, dir:'/opt/a, port: 5000 }
- { role: foo app instance, dir: '/opt/b', port: 5001 }
甚至也可以條件式地使用 roles,例如
- hosts: webservers
roles
I - { role: some_role, when:"ansible_os_ family =='RedHat'" }
1.創建role的步驟
(1)創建以 roles命名的目錄
(2)在 roles目錄中分別創建以各角色名稱命名的目錄,如 webservers等
(3)在每個角色命名的目錄中分別創建f11es、 handlers、meta、 tasks、 templates和vars目錄:用不到的目錄可以創建為空目錄,也可以不創建
(4)在p1 abook文件中,調用各角色
2.role內各目錄中可用的文件
tasks目錄:至少應該包含一個名為man.ym1的文件,其定義了此角色的任務列表:此文件可以使用 include包含其它的位於此目錄中的task文件;
fi1es目錄,存放由copy或script等模塊調用的文件
templates目錄: template模塊會自動在此目錄中尋找]inja2模板文件
handlers目錄:此目錄中應當包含一個main
ym1文件,用於定義此角色用到的各 handler;在 handler中使用 include包含的其它的 handler文件也應該位於此目錄中
vars目錄:應當包含一個main,ym1文件,用於定義此角色用到的變量
meta目錄:應當包含一個main,ym1文件,用於定義此角色的特殊設定及其依賴關系; ansi1e1.3及其以后的版本才支持
default目錄:為當前角色設定默認變量時使用此目錄:應當包含一個main.ym1文件
Tags
tags用於讓用戶選擇運行或路過 playbook中的部分代碼。 ansi1e具有冪等性,因此會自動跳過沒有變化的部分,即便如此,有些代碼為測試其確實沒有發生
變化的時間依然會非常地長。此時,如果確信其沒有變化,就可以通過tags跳過此些代碼片斷
案例:172.168.100.1配置成webserver,172.168.100.2配置成dbservers,172.168.100.3配置成web和db
mkdir -pv ansible_playbook/roles/{webservers,dbservers}/{tasks,files,templates,meta,handlers,vars}
cd roles/webservers/
cp /etc/httpd/conf/httpd.conf files/
vim tasks/main.yml
- name: install httpd packages
- yum: name=httpd
- nane: install configuration file
- copy: src=httpd.conf dest=/etc/httpd/conf/httpd.conf
tags:
- conf
notify:
- restart httpd
- name: start httpd
service: name=httpd state=started
vim handler/main.yml
- name: restart httpd
- service: name=httpd state=restarted
如果有vars可以配置,此示例中不使用
vim vars/main.yml
- http_port: 80
- maxClients: 200
如果想掉用webservers,在roles目錄之外創建site.yml文件
vim ansible_playbook/site.yml
- hosts: webservers
remote_user: root
roles:
- webservers
- hosts: 172.168.100.1
remote_user: root
roles:
- dbservers
- hosts: 172.168.100.2
remote_user: root
roles:
- dbservers
- webservers
同理在dbservers進行配置。
ansible-playbook site.yml
