现在有一个需求,我想在剧本中实现这样一个功能,我传递一个用户的名称,然后返回它的user uid gid home,可以给多个剧本调用
1.首先编写功能剧本,里面直接写任务列表即可
[student@workstation ansible]$ cat get_users_info.yml
- shell: "cat /etc/passwd|cut -d: -f1,3,4,6 |grep devops"
register: res
2.调用它的功能
[student@workstation ansible]$ cat test_include.yml
- hosts: servera
tasks:
#这里引用外部剧本,本质就是引用任务列表
- include: get_users_info.yml
- debug:
msg: "{{ res.stdout }}"
3.查看输出结果
ok: [servera] => {
"msg": "devops:1001:1001:/home/devops"
}
上面还有一个功能没有实现,就是可以传递参数过去调用
[student@workstation ansible]$ cat test_include.yml
- hosts: servera
tasks:
#在传递变量的时候,写在include子集下,格式如下,=号两边没有空格!
- include: get_users_info.yml
user=root
#变量可以写多个
- debug:
msg: "{{ res.stdout }}"
传递user参数
[student@workstation ansible]$ cat get_users_info.yml
#这个地方就可以直接引用传递过来的变量了
- shell: "cat /etc/passwd|cut -d: -f1,3,4,6 |grep {{ user }}"
register: res
使用vars关键字传递字典
[student@workstation ansible]$ cat set_user.yml
- hosts: servera
tasks:
- include: add_users.yml
vars:
users:
shenqi:
id: 1
level: 99
phone: 10086
yaya:
id: 2
level: 12
phone: 10010
使用with_dict循环来遍历字典
[student@workstation ansible]$ cat add_users.yml
- debug:
msg: "name={{ item.key }} id={{ item.value.id }} level={{ item.value.level }} phone={{ item.value.phone }}"
with_dict: "{{ users }}"
[student@workstation ansible]$ cat users.yml
- hosts: servera
tasks:
- include: add_users.yml
with_items:
#groups 这里可以直接传递一个列表
- {user: "xixi",groups: ["wheel","root"] ,uid: 936}
- {user: "wawa",groups: ["wheel","root"] ,uid: 333}
- {user: "miemie",groups: ["wheel","root"] ,uid: 666}
[student@workstation ansible]$ cat add_users.yml
- user:
name: "{{ item.user }}"
#这里也可以直接引用列表
groups: "{{ item.groups }}"
uid: "{{ item.uid }}"
when: item.uid > 555
[student@workstation ansible]$ cat tags1.yml
- debug:
msg: "I am a tags111111111"
[student@workstation ansible]$ cat tags2.yml
- debug:
msg: "I am a tags2222222222"
[student@workstation ansible]$ cat calltgs.yml
- hosts: servera
tasks:
- include: tags1.yml
tags: one
- include: tags2.yml
tags: two
执行测试一下
[student@workstation ansible]$ ansible-playbook -t two calltgs.yml
ok: [servera] => {
"msg": "I am a tags2222222222"
}
[student@workstation ansible]$ cat A.yml
- hosts: servera
gather_facts: no
tasks:
- include: B.yml
with_items:
- orange
- apple
- lemon
[student@workstation ansible]$ cat B.yml
- debug:
msg: "{{ item }} -> B.yml"
with_items:
- tudou
- fanqie
- hongshu
包含与被包含文件中都有循环,那输出的是哪个文件的内容呢?我们执行看一下
[WARNING]: The loop variable 'item' is already in use. You should set the `loop_var` value in the `loop_control` option for the task to something else to avoid variable
collisions and unexpected behavior.
ok: [servera] => (item=tudou) => {
"item": "tudou",
"msg": "tudou -> B.yml"
}
ok: [servera] => (item=fanqie) => {
"item": "fanqie",
"msg": "fanqie -> B.yml"
}
ok: [servera] => (item=hongshu) => {
"item": "hongshu",
"msg": "hongshu -> B.yml"
}
经过执行后发现输出的是被包含B.yml文件中的内容,那如何输出A.yml循环中的内容呢?
[student@workstation ansible]$ cat A.yml
- hosts: servera
gather_facts: no
tasks:
- include: B.yml
with_items:
- orange
- apple
- lemon
loop_control:
loop_var: A_item
#在循环下面加上这两条,loop_var表示的是循环变量的新名字,原来的item就不能再用了
在B中去引用A.yml的循环变量
[student@workstation ansible]$ cat B.yml
- debug:
msg: "[ {{ A_item }} ] --- {{ item }} -> B.yml"
with_items:
- tudou
- fanqie
- hongshu
执行查看结果
TASK [debug] **************************************************************************************************
ok: [servera] => (item=tudou) => {
"item": "tudou",
"msg": "[ orange ] --- tudou -> B.yml"
}
ok: [servera] => (item=hongshu) => {
"item": "hongshu",
"msg": "[ orange ] --- hongshu -> B.yml"
}
ok: [servera] => (item=fanqie) => {
"item": "fanqie",
"msg": "[ orange ] --- fanqie -> B.yml"
}
TASK [debug] **************************************************************************************************
ok: [servera] => (item=tudou) => {
"item": "tudou",
"msg": "[ apple ] --- tudou -> B.yml"
}
ok: [servera] => (item=fanqie) => {
"item": "fanqie",
"msg": "[ apple ] --- fanqie -> B.yml"
}
ok: [servera] => (item=hongshu) => {
"item": "hongshu",
"msg": "[ apple ] --- hongshu -> B.yml"
}
TASK [debug] **************************************************************************************************
ok: [servera] => (item=tudou) => {
"item": "tudou",
"msg": "[ lemon ] --- tudou -> B.yml"
}
ok: [servera] => (item=fanqie) => {
"item": "fanqie",
"msg": "[ lemon ] --- fanqie -> B.yml"
}
ok: [servera] => (item=hongshu) => {
"item": "hongshu",
"msg": "[ lemon ] --- hongshu -> B.yml"
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。