10.ansible tags handles fact include
1.tags 在剧本中设置标签功能
作用:
在剧本编写的过程中需要不断的执行和调试,但并不是所有的模块都需要执行。可以通过标签指定任务模块执行 指定任务模块跳过 提高剧本的编写效率!
1.1为playbook添加标签的方式有如下几种:
- 对一个task打一个标签
- 对一个task打多个标签
- 对多个task打一个标签
1.2 task打完标签的调用方式
-t tags_name 执行指定的tags
--skip-tags tags_name 跳过指定的tags
- hosts: 192.168.1.43
tasks:
- name: Check File
file: path=/tmp/this_is_{{ ansible_hostname }}_file state=touch
when: (ansible_hostname == "nfs01") or (ansible_hostname == "backup")
tags: t1
- name: bad thing
command: cmd=echo 123
tags: t2
- name: install httpd
yum: name=httpd state=installed
when: (ansible_all_ipv4_addresses == ["172.16.1.7","10.0.0.7"])
tags: t3
- name: install httpd2
yum: name=httpd2 state=installed
when: (ansible_distribution == "ubuntu")
tags: t4
指定执行哪个标签任务: ansible-playbook --tags=t2 test05.yml
跳过指定标签任务: ansible-playbook --skip-tags=t2 test05.yml
如下例所示,不同的任务可以使用相同的标签。
- hosts: test70
remote_user: root
tasks:
- name: install httpd package
tags: httpd,package
yum:
name=httpd
state=latest
- name: start up httpd service
tags: httpd,service
service:
name: httpd
state: started
上例中每个任务都有多个标签,而且上例中两个任务都有一个共同的标签,就是httpd标签,所以,当我们执行'ansible-playbook --tags=httpd testhttpd.yml',上述两个任务都会执行。
案例1-多个项目调用相同task
1.1.1.编写 restart_httpd.yml 文件
#注意这是一个tasks所有没有play的任何信息
[root@ansible project1]#cat restart_httpd.yml
- name: Restart Httpd Server
service: name=httpd state=restarted
1.1.2.A Project 的 playbook 如下
[root@ansible project1]# cat a_project.yml
- hosts: webserver
tasks:
- name: A Project command
command: echo "A"
- name: Restart httpd
include: restart_httpd.yml
1.1.3.B Project 的 playbook 如下
[root@ansible project1]# cat b_project.yml
- hosts: webserver
tasks:
- name: B Project command
command: echo "B"
- name: Restart httpd
include: restart_httpd.yml
1.1.4.验证
[root@ansible project1]# ansible-playbook a_project.yml
1.2 案例2-Inlcude结合tags应用
通过指定标签tags,来说明是安装 tomcat8 还是tomcat9
1.2.1.准备入口 main.yml 文件,然后包含install_tomcat8.yml以及install_tomcat9.yml
1.2.2.在执行 main.yml时,需要通过 --tags 指明要安装的版本
1).编写 main.yml 入口文件
[root@ansible ~]# cat main.yml
- hosts: localhost
tasks:
- name: Installed Tomcat8 Version
include: install_tomcat8.yml
tags: tomcat8
- name: Installed Tomcat9 Version
include: install_tomcat9.yml
tags: tomcat9
2).编写 install_tomcat8.yml
[root@ansible ~]# cat install_tomcat8.yml
- hosts: webservers
vars:
- tomcat_version: 8.5.63
- tomcat_install_dir: /usr/local
tasks:
- name: Install jdk1.8
yum:
name: java-1.8.0-openjdk
state: present
- name: Download tomcat
get_url:
url: http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v{{ tomcat_version }}/bin/apachetomcat-{{ tomcat_version }}.tar.gz
dest: /tmp
- name: Unarchive tomcat-{{tomcat_version }}.tar.gz
unarchive:
src: /tmp/apache-tomcat-{{tomcat_version }}.tar.gz
dest: "{{ tomcat_install_dir }}"
copy: no
- name: Start tomcat
shell: cd {{ tomcat_install_dir }} && mv apache-tomcat-{{tomcat_version }} tomcat8 && cd tomcat8/bin && nohup ./startup.sh &
3).编写 install_tomcat9.yml
[root@ansible ~]# cat install_tomcat9.yml
- hosts: webservers
vars:
- tomcat_version: 9.0.43
- tomcat_install_dir: /usr/local
tasks:
- name: Install jdk1.8
yum:
name: java-1.8.0-openjdk
state: present
- name: Download tomcat
get_url:
url: http://mirrors.hust.edu.cn/apache/tomcat/tomcat-9/v{{ tomcat_version }}/bin/apachetomcat-{{ tomcat_version }}.tar.gz
dest: /tmp
- name: Unarchive tomcat-{{tomcat_version }}.tar.gz
unarchive:
src: /tmp/apache-tomcat-{{tomcat_version }}.tar.gz
dest: "{{ tomcat_install_dir }}"
copy: no
- name: Start tomcat
shell: cd {{ tomcat_install_dir }} && mv apache-tomcat-{{tomcat_version }} tomcat9 && cd tomcat9/bin && nohup ./startup.sh &
4).执行 main.yml文件,然后通过 --tags 执行对应的版本
[root@ansible ~]# ansible-playbook main.yml --tags tomcat8
[root@ansible ~]# ansible-playbook main.yml --tags tomcat9
2.handlers 触发器
在playbook的任务执行过程中,有些任务的状态每次都会发生变化,当需要根据变化做出响应,而不用更改后续任务时,handlers是一个不错的选择
- hosts: backup
tasks:
- name: 01 Install rsync
yum: name=rsync state=present
- name: 02 push config file
copy: src=./file/{{ item.src }} dest=/etc/{{ item.dest }} mode={{ item.mode }}
with_items:
- { src: "rsyncd.conf", dest: "rsyncd.conf", mode: "0644" }
- { src: "rsync.password", dest: "rsync.password", mode: "0600" }
notify: restart rsync server
handlers:
- name: restart rsync server
service: name=rsyncd state=restarted
实践配置:
[root@m01 ansible_playbook]# cat test_触发功能.yaml
- hosts: 172.16.1.41
tasks:
- name: 分发配置文件
copy: src=./rsyncd.conf dest=/etc
notify: rsync_server_restart
- name: 启动服务
service: name=rsyncd state=started
handlers:
- name: rsync_server_restart
service: name=rsyncd state=restarted
gather_facts 忽略远程主机采集功能
作用:
gather_facts功能可让ansible去收集各机的信息。
开启gather_facts有利有弊,虽然可以看到更多机器的信息,但是也需要更多执行时间。
因此我们需要按照需求决定是否使用。
- hosts: whatever
gather_facts: no or yes #决定是否开启收集功能
实践配置:
- hosts: 172.16.1.7
gather_facts: no
tasks:
- name: create file
file: path=/etc/oldgirl.txt state=touch
- name: mount /data
mount: src=172.16.1.31:/data path=/mnt state=mounted
PS:判断功能会失效
ansible-playbook test_采集功能.yaml -i ./nfs_hosts -vvvv
4. 将多个剧本进行整合
方式一:include_tasks: f1.yml --- roles 汇总多个剧本
- hosts: all
tasks:
- include_tasks: f1.yml
- include_tasks: f2.yml
方式二:include: f1.yml
- include:f1.yml
- include:f2.yml
方式三:- import_playbook:
[root@m01 ansible-playbook]# cat main.yml
- import_playbook: base.yml
- import_playbook: rsync.yml
- import_playbook: nfs.yml
- import_playbook: sersync.yml
- import_playbook: web.yml
- import_playbook: php.yml
- import_playbook: mysql.yml
- import_playbook: lb.yml
- import_playbook: keepalived.yml
===================================
- import_playbook: zabbix.yml
- import_playbook: jumpserver.yml 跳板机
- import_playbook: vpn.yml
- import_playbook: ntpserver.yml
- import_playbook: nosql-redis.yml