• Ansible-----角色


    什么是角色

    角色是一种解决问题的思想,也是一种规范。

    目录

    角色的目录结构如下:

    files:
        存放由copy或script模块等调用的文件。
    
    templates:
        template模块查找所需要模板文件的目录。
    
    tasks:
        用于定义任务,至少应该包含一个名为main.yml的文件(类似于java和go等编译性语言,用于指定程序的入口),其他的文件需要在此文件中通过include进行包含。
    
    handlers:
        定义处理器,至少应该包含一个名为main.yml的文件,其他的文件需要在此文件中通过include进行包含。
    
    vars:
        定义变量,至少应该包含一个名为main.yml的文件,其他的文件需要在此文件中通过include进行包含。
    
    meta:
        定义元数据,至少应该包含一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系,其他的文件需要在此文件中通过include进行包含。
    
    default:
        设定模式变量时使用此目录中的main.yml文件。
    

    存放路径

    #查看默认存放位置,当然这个路径是可以修改的
    [root@node101.yinzhengjie.org.cn ~]# grep roles_path /etc/ansible/ansible.cfg 
    roles_path    = /etc/ansible/roles:/usr/share/ansible/roles
    

     也可以使用绝对路径的方式调用角色,例如:

    - hosts: test70
      roles:
      - "/testdir/ansible/testrole/"
    

     实例

    1、简单变量应用

    [root@localhost ansible]# tree roles/
    roles/
    └── ceshi
        ├── defaults
        │   └── main.yml
        └── tasks
            └── main.yml
    
    3 directories, 2 files
    [root@localhost ansible]# more test.yml 
    - hosts: all
      roles:
      - role: ceshi
    [root@localhost ansible]# more roles/ceshi/tasks/main.yml 
    - debug:
        msg: "hello {{ testvar }}!"
    [root@localhost ansible]# more roles/ceshi/defaults/main.yml 
    testvar: "role"
    

    我们在defaults文件夹下设置默认变量,即使在调用角色时没有任何参数的传入,也有默认的值可以使用。

    此处需要注意,在默认情况下,角色中的变量是全局可访问的。

    这句话怎么理解呢,看两个小实验:

    1、新建一个role,并设置默认role变量

    2、在调用角色时传入变量

    在默认的情况下,角色的变量是全局可访问的,在上例中,将testvar设置为ceshi3的同时,默认将角色的变量也设置成了ceshi3,所以最终呈现了相同的变量。

    如果想要改变这种情况,需要将变量的访问域变成角色所私有的。

    需要设置/etc/ansible/ansible.cfg文件,去掉private_role_vars = yes的注释号。

    这时候重新执行,查看结果,如你所想!

    2、对同一角色的多次调用

    默认情况下,我们无法对同一角色多次调用,即使你写很多遍,默认的只是调用了一次。

    同样以上述环境举例:

    要想多次调用同一角色,有两种方法:

    方法一:设置角色的allow_dumplates属性,让其支持重复调用

    这个属性需要在meta/main.yml文件中设置

    方法二:调用角色时传入的参数值不同

    3、var文件下变量优先级问题

    var文件下变量的优先级具有很高的权限,距离测试一下

    定义了3种变量,最终生效的还是vars下的变量!

    当然如果你实在不想用这个变量,还可以在执行playbook时用-e传递新的参数变量

    由此可见,除了使用-e参数外,任意变量的优先级都不如vars下的高!

     4、templates使用

    定义一个模板并放置在templates目录下

    [root@localhost templates]# more test.conf.j2 
    something in template;
    {{ template_var }}
    

    模板中使用了template_var变量,我们把他定义在defaultes目录下

    [root@localhost defaults]# more main.yml 
    testvar: "defaults"
    template_var: "template"
    

    在tasks直接使用这个模板

    [root@localhost tasks]# more main.yml 
    - debug:
        msg: "hello {{ testvar }}!"
    - template:
        src: test.conf.j2
        dest: /opt/test.conf
    

     

    5、handlers使用

    在角色中使用handler触发,需要在handlers文件夹下进行配置。

    [root@localhost handlers]# more main.yml 
    - name: test_handler
      debug:
        msg: "this is a test handler"
    

    在其中定义了一个test_handler任务以便随时触发

    为了能够更加简单的触发,在task/main.yml中的debug任务的状态设置为changed

    [root@localhost tasks]# more main.yml 
    - debug:
        msg: "hello {{ testvar }}!"
      changed_when: true
      notify: test_handler
    

    当需要notify对应的handler时,直接写入名字就行,角色会自动去handlers/main.yml中去寻找

  • 相关阅读:
    Dagger2使用
    Android自定义processor实现bindView功能
    Android注解方式实现表单校验
    一次简单的SQL手工注入
    Drozer简单使用
    Android刷机
    Python Network Security Programming-1
    存在于文件名中的SQL手工注入
    java 动手动脑7
    Java课堂 动手动脑6
  • 原文地址:https://www.cnblogs.com/jinyuanliu/p/10654820.html
Copyright © 2020-2023  润新知