ansible task任务控制
判断语句when
基于不同的操作系统安装不同的服务。
配置方法:
- hosts: webservers
tasks:
- name: install http server centos
yum:
name: httpd
state: present
when: (ansible_distribution == "CentOS")
- name: install http server ubuntu
yum:
name: http2
state: present
when: (ansible_distribution == "Ubuntu")
基于不同的主机名安装
- hosts: all
tasks:
- name: configure nginx repo
copy:
src: ./nginx.repo.j2
dest: /etc/nginx.repo/nginx.repo
- name: install nginx server
yum:
name: nginx
state: present
when: (ansible_hostname is match("web*"))
# 上述代码完成的功能是只给web服务器添加nginx官方源并安装nginx。
循环语句loop | with_item
loop
使用loop循环安装多个软件包{不推荐,建议使用变量的方法去安装多个软件包}
- hosts: webservers
tasks:
- name: install rpm all
yum:
name: "{{ item }}"
state: present
loop:
- httpd
- httpd-tools
利用循环的方式去启动多个程序
一个tasks安装多个软件 (列表)
[root@manager ansible_tasks]# cat t3.yml
- hosts: webservers
tasks:
- name: Install Rpm All
yum:
name: "{{ item }}" #固定的变量(会在loop列表中依次提取对应的值 )
state: present
loop:
- httpd
- httpd-tools
#官方
- name: ensure a list of packages installed
yum:
name: "{{ packages }}"
vars:
packages:
- httpd
- httpd-tools
一个tasks启动多个服务 (列表)
[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
一个tasks拷贝多个文件 (字典)
[root@manager ansible_tasks]# cat 5.yml
- hosts: webservers
tasks:
- name: create two files
copy:
src: "./{{item.src}}"
dest: "{{item.dest}}"
owner: root
group: root
mode: "{{item.mode}}"
loop:
- {src: rsyncd.conf.j2,dest: /etc/rsyncd.conf,mode: "0644"}
- {src: rsync.pass.j2,dest: /etc/rsync.pass,mode: "0600"}
触发器handlers
常用于监控配置文件,一旦配置文件发生变更,便触发handlers。
无论多少个task通知了相同的handlers,handlsers仅会在所有tasks结束后运行一次。
只有task发生改变了才会通知handlers,没有改变则不会触发handlers。
不能使用handlers替代tasks,因为handlers是一个特殊的tasks。
标签tag
默认情况下,ansible在执行一个playbook时,会执行playbook中定义的所有任务,ansible的标签功能可以给单独任务生只整个playbook打上标签,然后利用这些标签来指定要运行playbook中的个别任务,或不执行指定的任务。
- 打标签的方式有几种,比如:
对一个task打标签、对一个task大多个标签、对多个task打一个标签
配置方法示例:
[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
指定执行 playbook中的某一个标签 ( 通常是用来快速解决问题 )
[root@manager ansible_tasks]# ansible-playbook t7.yml -t install_nfs
指定排除某个tags,其余都正常执行
[root@manager ansible_tasks]# ansible-playbook t7.yml --skip-tags install_nfs
- 对task标签应该如何使用
-t: 指定执行哪个tag
– skip-tags: 表示执行除了这个标签以外其他的所有任务。
包含include
用于playbook文件复用。
有时,我们发现大量的playbook内容需要重复编写,各tasks之间功能需互相调用才能完成各自功能,playbook帮打到维护困难,这是我们需要使用includes。
比如,A、B两个项目都需要用到重启httpd服务,我们就可用使用include来实现,具体方法如下:
[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
忽略错误 Ignore_errors
用于某个task偶尔会执行失败,但是该tasks并不影响后续tasks正常运行,这个时候我们就可以给他加上ignore_errors来实现问题。
- hosts: webservers
tasks:
- name: Shell Command
command: /bin/false
ignore_errors: yes #忽略错误
- name: Create File
file:
path: /tmp/text1.txt
state: touch
异常处理
1.控制task报告的状态,不一定必须是"changed"
[root@manager ansible_tasks]# cat t8.yml
- hosts: webservers
tasks:
- name: Get Nginx Port Status
shell: netstat -lntp | grep nginx
register: ngx_status
- name: Debug Nginx Status
debug:
msg: "{{ ngx_status.stdout_lines }}"
-------
[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任务不会发生changed提示了
- name: Debug Nginx Status
debug:
msg: "{{ ngx_status.stdout_lines }}"
2.使用changed_when检查tasks任务返回的结果
[root@manager ansible_tasks]# cat t9.yml
- hosts: webservers
tasks:
- name: Install Nginx Server
yum:
name: nginx
state: present
tags: Install_Nginx_Server
- name: 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的结果存储至check_ngx变量中
changed_when:
- false #由于没有在被控端执行任何操作,所以可以将其修改为false,这个任务每次执行就ok状态
- check_ngx.stdout.find('successful') #检查变量中是否存在successful的字符串,如果存在则继续,不存在则停止,并报错。
- name: Started Nginx Server
systemd:
name: nginx
state: started
enabled: yes
handlers:
- name: Restart Nginx Server
systemd:
name: nginx
state: restarted