一、import_playbook
1、一次性执行多个playbook任务,所有任务必须写完整
2、free-form 自由形式 导入的剧本的名称是直接指定的,没有任何其他选项
第一个playbook:
# vim test1.yaml
---
- hosts: web1
tasks:
- name: install nginx
yum:
name: nginx
state: present
第二个playbook:
# vim test2.yaml
---
- hosts: web1
tasks:
- name: start nginx
service:
name: nginx
state: started
一次性执行多个playbook:
# vim test.yaml
---
- import_playbook: /root/test1.yaml
- import_playbook: /root/test2.yaml
二、include_tasks
在进行编程时,我们都会将可以重复利用的代码提取出来,将提取出的代码作为一个逻辑单元,这个逻辑单元通常被称为”函数”或者”方法”,”函数”可以让我们更加方便的、重复的调用一段代码,而且,如果需要更改这段代码的逻辑,只要更改函数本身即可,所有调用函数之处的逻辑都会随之改变,同时,函数还可以让程序的可读性变强,比如,主干程序中只有几行代码,这几行代码只是调用了对应的几个函数,我们通常通过函数名称,就能大概的推算出函数的功能,当我们阅读主干程序时,看到各个函数的名称之后,就能够大概推算出整个主干程序的作用和逻辑,如果不使用函数,而是将所有代码都写在主干程序文件中,那么只能一行一行的阅读所有代码以后,才能大概的了解主干程序的作用
Ansible经过版本的迭代更新,”include”的使用方法也有所变化,原始的使用方式以及对应的关键字在之后的版本中可能会被弃用,所以官网推荐我们使用新的方式进行操作,在之后的版本中,如果我们想要包含一个任务列表,那么就可以使用”include_tasks”关键字代替”include”关键字
1、include与import_tasks”是透明的,”include_tasks”是可见的,”include_tasks”更像是一个任务,这个任务包含了其他的一些任务
# vim /tmp/intest.yaml
---
- hosts: web1
remote_user: root
tasks:
- debug:
msg: "test task1"
- include_tasks: /tmp/in.yaml
- debug:
msg: "test task2"
# vim /tmp/in.yaml
- debug:
msg: "task1 in in.yaml"
- debug:
msg: "task2 in in.yaml"
# ansible-playbook /tmp/in.yaml
# 显示结果相比于include多出了这一行
TASK [include_tasks] **********************************************************************************************
included: /tmp/in.yaml for 192.168.58.101
- include_tasks: in.yaml和 - include_tasks: \nfile: /tmp/in.yaml 的效果一样,只不过一个使用了”file”参数的方式,另一个使用了”free_form”的方式,从2.7版本开始,”include_tasks”模块加入了file参数和apply参数
2、为”include_tasks”任务添加了标签t1,那么,我们在执行此playbook时,指定使用t1标签执行
# vim /tmp/in.yaml
- debug:
msg: "task1 in in.yaml"
- debug:
msg: "task2 in in.yaml"
# vim /tmp/intest.yaml
---
- hosts: web1
remote_user: root
tasks:
- debug:
msg: "test task1"
- include_tasks:
file: /tmp/in.yaml
tags: t1
- debug:
msg: "test task2"
# ansible-playbook intest.yaml --tags t1
输出结果:
TASK [include_tasks] **********************************************************************************************
included: /tmp/in.yaml for 192.168.58.101
从执行后的输出信息可以看出,当我们指定t1标签后,”include_tasks”这个任务本身被调用了,而”include_tasks”对应文件中的任务却没有被调用,所以我们可以得出结论,
在使用tags时,”include_tasks”与”include”并不相同,标签只会对”include_tasks”任务本身生效,而不会对其中包含的任务生效。如果我们想要tags对”include_tasks”中包含的所有任务都生效,该怎么实现呢?这时,我们就需要使用到”include_tasks”模块的apply参数了
3、使用apply
# vim /tmp/intest.yaml
---
- hosts: web1
remote_user: root
tasks:
- debug:
msg: "test task1"
tags: t0
- include_tasks:
file: /tmp/in.yaml
apply:
tags: t1
- debug:
msg: "test task2"
# ansible-playbook intest.yaml --tags t1
输出结果:
TASK [Gathering Facts] ********************************************************************************************
ok: [192.168.58.101]
PLAY RECAP ********************************************************************************************************
192.168.58.101 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
当我们执行上例playbook以后,并没有如我们预想的一样调用in.yml中的任务,就连”include_tasks”任务自身也没有被调用,我们该怎么办呢?如果想让上例playbook按照我们所想的那样运行,则需要使用如下方法:
4、使用apply,增加tags: always
# vim /tmp/intest.yaml
---
- hosts: web1
remote_user: root
tasks:
- debug:
msg: "test task1"
tags: t0
- include_tasks:
file: /tmp/in.yaml
apply:
tags: t1 # tags: t1,always
tags: always
- debug:
msg: "test task2"
# ansible-playbook intest.yaml --tags t1
在使用”include_tasks”时,不仅使用apply参数指定了tags,同时还使用tags关键字,对”include_tasks”本身添加了always标签,但是你可能会有疑问,如果对”include_tasks”自身添加了always标签,那么我们调用其他标签时,in.yml文件中的任务也会”always”执行吗?
5、添加了always标签,那么我们调用其他标签时,in.yml文件中的任务也会”always”执行吗?
# vim /tmp/intest.yaml
---
- hosts: web1
remote_user: root
tasks:
- debug:
msg: "test task1"
tags: t0
- include_tasks:
file: /tmp/in.yaml
apply:
tags: t1 # tags: t1,always
tags: always
- debug:
msg: "test task2"
# ansible-playbook intest.yaml --tags t0
输出结果:
TASK [include_tasks] **********************************************************************************************
included: /tmp/in.yaml for 192.168.58.101
上例中的always标签只是针对”include_tasks”任务自身而言的,之所以为”include_tasks”任务添加always标签,就是为了让apply参数中的t1标签能够针对包含的所有任务生效,
always标签并不会对被包含的所有任务生效,如果想要被包含的任务也都”always”执行,该怎么办呢?你一定已经想到了,没错,在apply参数的tags列表中添加always标签即可
6、在执行其他tags标签时,也向让”include_tasks”所包含的任务执行,在就在添加tags:always的基础上,在apply参数tags标签中增加always参数(tags:t1,always)
# vim /tmp/intest.yaml
---
- hosts: web1
remote_user: root
tasks:
- debug:
msg: "test task1"
tags: t0
- include_tasks:
file: /tmp/in.yaml
apply:
tags: t1,always
tags: always
- debug:
msg: "test task2"
# ansible-playbook intest.yaml --tags t0
输出结果:
TASK [debug] ******************************************************************************************************
ok: [192.168.58.101] => {
"msg": "test task1"
}
TASK [include_tasks] **********************************************************************************************
included: /tmp/in.yaml for 192.168.58.101
TASK [debug] ******************************************************************************************************
ok: [192.168.58.101] => {
"msg": "task1 in in.yaml"
}
TASK [debug] ******************************************************************************************************
ok: [192.168.58.101] => {
"msg": "task2 in in.yaml"
}
PLAY RECAP ********************************************************************************************************
192.168.58.101 : ok=5 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
综上所述就是,apply参数中的tags用于给in.yml中的任务统一打标签,”include_tasks”对应的tags用于给”include_tasks”任务自身打标签,同时,如果想要apply参数中的tags能够生效,”include_tasks”的标签中必须包含always标签
7、除了使用file参数的方式能够指定tags,使用”free_form”的方式也可以指定tags,前面已经说了file和free_form的效果是一样的哦
# vim /tmp/intest.yaml
---
- hosts: web1
remote_user: root
tasks:
- debug:
msg: "test task1"
tags: t0
- include_tasks: /tmp/in.yaml
args:
apply:
tags: t1,always
tags: always
- debug:
msg: "test task2"
# ansible-playbook intest.yaml --tags t0
总结:
1、指定标签tags: always,执行剧本时没有指定执行--tags always,存在指定标签tags: always的任务也会执行
2、在include_tasks模块中,使用apply参数指定tags标签,执行剧本时不会加载include_tasks模块里面的任务,需要在与include_tasks模块同级的位置添加tags: always
3、结合第一点,指定其他标签会加载include_tasks模块里面的任务吗?答案是不会,只会执行include_tasks模块,但不会加载include_tasks模块里面的任务,要想指定其他标签执行任务时,include_tasks模块中里面的任务也会执行,则需要在apply参数里面的tags标签里加上always