playbook條件語句
一:判斷語句when
根據(jù)不同的操作系統(tǒng)進(jìn)行判斷 Apache
centOS httpd
Ubuntu httpd2
根據(jù)不同的主機(jī)名稱進(jìn)行判斷
[root@manager ansible_tasks]# cat t1.yml
- hosts: webservers
tasks:- name: Installed HTTP Server
yum:
name: httpd
state: present
when: (ansible_distribution == "CentOS")
判斷:如果是centos就執(zhí)行httpd恩溅。 - name: Installed HTTP Server
yum:
name: httpd2
state: present
when: (ansible_distribution == "Ubuntu")
判斷:如果是ubuntu就執(zhí)行httpd2.
- name: Installed HTTP Server
實(shí)例:如果有100臺(tái)服務(wù)器,只需要其中的10臺(tái)安裝nginx套么,那么我們就可以將這10臺(tái)主機(jī)放在一個(gè)web組富玷,然后只安裝web組里的攀涵。
就需要做判斷:
[root@manager ansible_tasks]# cat t2.yml
- hosts: all
tasks:- name: Installed Nginx Web Server
yum:
name: nginx
state: present
when: ( ansible_hostname is match("web*"))
意思:是web的都安裝抖格,不是web的都跳過钝腺。
- name: Installed Nginx Web Server
when: ( ansible_hostname is match("web")) or ( ansible_hostname is match("web"))
意思是:web和lb都安裝龄捡。or是或的意思
二:循環(huán)語句loop|with_item
一個(gè)tasks安裝多個(gè)軟件 (列表)
[root@manager ansible_tasks]# cat t3.yml
- hosts: webservers
tasks:-
name: Install Rpm All
yum:
name: "{{ item }}"
state: present
loop:- httpd
- httpd-tools
一個(gè)tasks啟動(dòng)多個(gè)服務(wù) (列表)
[root@manager ansible_tasks]# cat t4.yml
-
- hosts: webservers
tasks:-
name: Started Nginx And PHP_FPM Server
systemd:
name: "{{ item }}"
state: started
enabled: yes
loop:- nginx
- php-fpm
一個(gè)tasks拷貝多個(gè)文件 (字典)
[root@manager ansible_tasks]# cat t5.yml
-
- hosts: webservers
tasks:- name: Configure Rsync Deamon
copy:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
mode: "{{ item.mode }}"
loop:- { src: rsyncd.conf.j2, dest: /opt/rsyncd.conf, mode: "0644" }
- { src: rsync.pass.j2, dest: /opt/rsync.pass, mode: "0600" }
- name: Configure Rsync Deamon
批量創(chuàng)建用戶啦辐,使用key values字典的方式
testuser1 基本組 bin 8989 /bin/bash
testuser2 基本組 root 7878 /bin/sh
[root@manager ansible_tasks]# cat t6.yml
- hosts: webservers
tasks:- name: Create Users
user:
name: "{{ item.name }}"
uid: "{{ item.uid }}"
group: "{{ item.group }}"
shell: "{{ item.shell }}"
loop:- { name: testuser1 , uid: 8989 , group: bin , shell: /bin/bash }
- { name: testuser2 , uid: 7878 , group: root , shell: /bin/sh }
- name: Create Users
三:觸發(fā)器 Handlers
四:標(biāo)簽 Tag
[root@manager ansible_tasks]# cat t7.yml
-
hosts: webservers
tasks:- name: Install Nfs Server
yum:
name: nfs-utils
state: present
tags: install_nfs - name: Service Nfs Server
service:
name: nfs-server
state: started
enabled: yes
tags: start_nfs
指定執(zhí)行 playbook中的某一個(gè)標(biāo)簽 ( 通常是用來快速解決問題 )
[root@manager ansible_tasks]# ansible-playbook t7.yml -t install_nfs
指定排除某個(gè)tags谓传,其余都正常執(zhí)行
[root@manager ansible_tasks]# ansible-playbook t7.yml --skip-tags install_nfs - name: Install Nfs Server
五:包含 Include | include_tasks
[root@manager ansible_tasks]# cat restart_nginx.yml
- name: Restart Nginx Server
systemd:
name: nginx
state: restarted
[root@manager ansible_tasks]# cat a_project.yml - hosts: webservers
tasks:name: A Project command
command: echo "A"name: Restart Nginx
include: restart_nginx.yml
[root@manager ansible_tasks]# cat b_project.yml
- hosts: webservers
tasks:name: B Project command
command: echo "B"name: Restart Nginx
include: restart_nginx.yml
六:忽略錯(cuò)誤 Ignore_errors
[root@manager ansible_tasks]# cat errors.yml
- hosts: webservers
tasks:- name: Shell Command
command: /bin/false
ignore_errors: yes #忽略錯(cuò)誤 - name: Create File
file:
path: /tmp/oldux_tt
state: touch
- name: Shell Command
gnore_errors使用:當(dāng)我們發(fā)現(xiàn) 某個(gè)task 偶爾會(huì)執(zhí)行失敗,但該task并不影響后續(xù)的tasks正常運(yùn)行芹关,那么此時(shí)可以 添加一個(gè)ignore_errors忽略經(jīng)常出錯(cuò)的這個(gè)task
七: 異常處理
1.控制task報(bào)告的狀態(tài)续挟,不一定必須是"changed"
[root@manager ansible_tasks]# cat t8.yml
- hosts: webservers
tasks:- name: Get Nginx Port Status
shell: netstat -lntp | grep nginx
register: ngx_status
changed_when: false #(該tasks任務(wù)不會(huì)發(fā)生changed提示了) - name: Debug Nginx Status
debug:
msg: "{{ ngx_status.stdout_lines }}"
- name: Get Nginx Port Status
2.使用changed_when檢查tasks任務(wù)返回的結(jié)果
[root@manager ansible_tasks]# cat t9.yml
-
hosts: webservers
tasks:name: Install Nginx Server
yum:
name: nginx
state: present
tags: Install_Nginx_Servername: Configure Nginx Server
copy:
src: ./nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Restart Nginx Server-
name: Check Nginx Configure File
shell: nginx -t
register: check_ngx #將nginx -t的結(jié)果存儲(chǔ)至check_ngx變量中
changed_when:- false #由于沒有在被控端執(zhí)行任何操作,所以可以將其修改為false侥衬,這個(gè)任務(wù)每次執(zhí)行就ok狀態(tài)
- check_ngx.stdout.find('successful') #檢查變量中是否存在successful的字符串诗祸,如果存在則繼續(xù),不存在則停止轴总,并報(bào)錯(cuò)直颅。
name: Started Nginx Server
systemd:
name: nginx
state: started
enabled: yes
handlers:
- name: Restart Nginx Server
systemd:
name: nginx
state: restarted
配置文件一旦拷貝錯(cuò)誤,在重啟的時(shí)候就會(huì)報(bào)錯(cuò)怀樟,服務(wù)掛掉功偿,
所以這個(gè)判斷做語法判斷是非常有限,又可以檢測(cè)往堡,又可以不影響服務(wù)的使用械荷。
它會(huì)在出現(xiàn)語法錯(cuò)誤之后就停止執(zhí)行。也就不會(huì)在去加載啟動(dòng)模塊投蝉。