前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >09-include

09-include

原创
作者头像
小朋友呢
修改2020-01-14 17:51:08
1.4K0
修改2020-01-14 17:51:08
举报
文章被收录于专栏:小朋友学云计算

include模块

直接引用

现在有一个需求,我想在剧本中实现这样一个功能,我传递一个用户的名称,然后返回它的user uid gid home,可以给多个剧本调用

1.首先编写功能剧本,里面直接写任务列表即可

代码语言:txt
复制
[student@workstation ansible]$ cat get_users_info.yml
- shell: "cat /etc/passwd|cut -d: -f1,3,4,6 |grep devops"
  register: res

2.调用它的功能

代码语言:txt
复制
[student@workstation ansible]$ cat test_include.yml
- hosts: servera
  tasks:
  #这里引用外部剧本,本质就是引用任务列表
  - include: get_users_info.yml

  - debug:
     msg: "{{ res.stdout }}"

3.查看输出结果

代码语言:txt
复制
ok: [servera] => {
    "msg": "devops:1001:1001:/home/devops"
}

带参引用

上面还有一个功能没有实现,就是可以传递参数过去调用

代码语言:txt
复制
[student@workstation ansible]$ cat test_include.yml
- hosts: servera
  tasks:
  #在传递变量的时候,写在include子集下,格式如下,=号两边没有空格!
  - include: get_users_info.yml
     user=root
 #变量可以写多个  

  - debug:
     msg: "{{ res.stdout }}"

传递user参数

代码语言:txt
复制
[student@workstation ansible]$ cat get_users_info.yml
#这个地方就可以直接引用传递过来的变量了
- shell: "cat /etc/passwd|cut -d: -f1,3,4,6 |grep {{ user }}"
  register: res

传递任意类型变量

使用vars关键字传递字典

代码语言:txt
复制
[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循环来遍历字典

代码语言:txt
复制
[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 }}"

与循环和条件一直使用

代码语言:txt
复制
[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}
代码语言:txt
复制
[student@workstation ansible]$ cat add_users.yml 
- user:
   name: "{{ item.user }}"
   #这里也可以直接引用列表
   groups: "{{ item.groups }}"
   uid: "{{ item.uid }}"
  when: item.uid > 555

使用tags标签

代码语言:txt
复制
[student@workstation ansible]$ cat tags1.yml 
- debug:
   msg: "I am a tags111111111"
代码语言:txt
复制
[student@workstation ansible]$ cat tags2.yml 
- debug:
   msg: "I am a tags2222222222"
代码语言:txt
复制
[student@workstation ansible]$ cat calltgs.yml 
- hosts: servera
  tasks:
  - include: tags1.yml
    tags: one
  - include: tags2.yml
    tags: two

执行测试一下

代码语言:txt
复制
[student@workstation ansible]$ ansible-playbook -t two calltgs.yml
ok: [servera] => {
    "msg": "I am a tags2222222222"
}

自定义循环名称

问题

代码语言:txt
复制
[student@workstation ansible]$ cat  A.yml
- hosts: servera
  gather_facts: no
  tasks:
  - include: B.yml
    with_items:
    - orange
    - apple
    - lemon
代码语言:txt
复制
[student@workstation ansible]$ cat B.yml
- debug:
   msg: "{{ item }} -> B.yml"
  with_items:
  - tudou
  - fanqie
  - hongshu

包含与被包含文件中都有循环,那输出的是哪个文件的内容呢?我们执行看一下

代码语言:txt
复制
[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循环中的内容呢?

解决

代码语言:txt
复制
[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的循环变量

代码语言:txt
复制
[student@workstation ansible]$ cat B.yml
- debug:
   msg: "[ {{ A_item }} ] --- {{ item }} -> B.yml"
  with_items:
  - tudou
  - fanqie
  - hongshu

执行查看结果

代码语言:txt
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • include模块
    • 直接引用
      • 带参引用
        • 传递任意类型变量
          • 与循环和条件一直使用
            • 使用tags标签
              • 自定义循环名称
                • 问题
                • 解决
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档