zoukankan      html  css  js  c++  java
  • Ansible_创建角色_role

    一、创建角色目录结构

    1、角色创建流程

    1️⃣:在Ansible中创建角色不需要特别的开发工具。创建和使用角色包含三个步骤:

    1. 创建角色目录结构
    2. 定义角色内容
    3. playbook中使用角色

    2、角色目录创建说明

    1️⃣:默认情况下AnsibleAnsible Playbook所在目录的roles子目录中查找角色。这样,用户可以利用playbook和其他支持文件存储角色

    2️⃣:如果Ansible无法在该位置找到角色,它会按照顺序在Ansible配置设置roles_path所指定的目录中查找

    • 此变量包含要搜索的目录的冒号分隔列表。此变量的默认值为:
      ~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles
    • 例如:在/etc/ansible/ansible.cfg文件中添加roles_path(以冒号分隔)
      [root@localhost ~]# grep roles_path /etc/ansible/ansible.cfg 
      roles_path    = ~/.ansible/roles:/usr/share/ansible/roles:/etc/ansible/roles  

    3️⃣:这允许用户将角色安装到由多个项目共享的系统上。

    • 例如,用户可能将自己的角色安装在自己的主目录下的~/.ansible/roles子目录中,而系统可能将所有用户的角色安装在/usr/share/ansible/roles目录中

    3、角色各目录说明

    1️⃣:README.md提供人类可读的基本角色描述、有关如何使用该角色的文档和示例,以及其发挥作用所需要满足的任何非Ansible要求

    2️⃣:meta子目录包含一个main.yml文件,该文件指定有关模块的作者、许可证、兼容性和依赖项的信息

    3️⃣:files子目录包含固定内容的文件,而templates子目录则包含使用时可由角色部署的模板

    4️⃣:其他子目录中可以包含main.yml文件,它们定义默认的变量值、处理程序、任务、角色元数据或变量,具体取决于所处的子目录

    5️⃣:注意

    如果某一子目录存在但为空,如本例中的handlers,它将被忽略。如果某一角色不使用功能,则其子目录可以完全省略。例如,本例中的vars子目录已被省略

     二、创建角色框架

     1、角色框架构建

    1️⃣:ansible-galaxy命令行工具可用于管理Ansible角色,包括新角色的创建。用户可以运行ansible-galaxy init来创建新角色的目录结构(init:初始化

    2️⃣:指定角色的名称作为命令的参数,该命令在当前工作目录中为新角色创建子目录

    • 演示实例:创建一个httpd角色
      [root@localhost project]# ls
      playbook.yaml
      [root@localhost project]# ansible-galaxy init httpd
      - Role httpd was created successfully
      [root@localhost project]# ls
      httpd  playbook.yaml
      [root@localhost project]# tree httpd/
      httpd/
      ├── defaults
      │   └── main.yml
      ├── files
      ├── handlers
      │   └── main.yml
      ├── meta
      │   └── main.yml
      ├── README.md
      ├── tasks
      │   └── main.yml
      ├── templates
      ├── tests
      │   ├── inventory
      │   └── test.yml
      └── vars
          └── main.yml
      
      8 directories, 8 files
        //创建httpd目录后,会自动创建一些示例的文件

    三、定义角色内容

    1、创建角色内容

    • 演示实例:以上面创建的httpd角色目录结构
      • 1、在file目录中创建需要copy的文件
        [root@localhost project]# ls httpd/files/
        dvd.repo
      • 2、在templates目录中创建模板文件
        [root@localhost project]# cat httpd/templates/httpd.conf.j2 
        <VirtualHost {{ anisble_facts['default_ipv4']['address'] }}:{{ port }}>
            DocumentRoot "/var/www/html/{{ dir_name }}"
            ErrorLog "/var/log/httpd/{{ dir_name }}-error_log"
            CustomLog "/var/log/httpd/{{ dir_name }}-access_log" common
        </VirtualHost>
      • 3、在vars目录下床架变量文件
        [root@localhost project]# cat httpd/vars/main.yml 
        ---
        # vars file for httpd
        port: 8080
        dir_name: sharedir
      • 4、在tasks目录中床架执行文件
        [root@localhost project]# cat httpd/tasks/main.yml 
        ---
        - name: copy dvd.repo
          copy:
            src: ../files/dvd.repo
            dest: /etc/yum.repos.d/dvd.repo
        
        - name: sent template
          template:
            src: ../templates/httpd.conf.j2
            dest: /etc/httpd/conf.d/httpd.conf

    其他的我就不一一举例了,说白了就是在每个对应的目录下,写入每个YAML文件

    四、角色内容开发推荐做法

    1、模块化编写

    1️⃣:角色允许以模块化方式编写playbook。为了最大限度地提高新开发角色的效率,请考虑在角色开发中采用以下推荐做法:

    1. 在角色自己的版本控制存储库中维护每个角色。Ansible很适合使用基于git的存储库
    2. 角色存储库中不应存储敏感信息,如密码或SSH密钥。敏感值应以变量的形式进行参数化,其默认值应不敏感。
    3. 使用角色的playbook负责通过Ansible Vault变量文件、环境变量或其他ansible-playbook选项定义敏感变量。
    4. 使用ansible-galaxy init启动角色,然后删除不需要的任何目录和文件
    5. 创建并维护README.mdmeta/main.yml文件,以记录用户的角色的用途、作者和用法
    6. 让角色侧重于特定的用途或功能。可以编写多个角色,而不是让一个角色承担许多任务
    7. 经常重用和重构角色。避免为边缘配置创建新的角色。如果现有角色能够完成大部分的所需配置,请重构现有角色以集成新的配置方案
    8. 使用集成和回归测试技术来确保角色提供所需的新功能,并且不对现有的playbook造成问题

    五、定义角色依赖项

    1、角色依赖

    1️⃣:角色依赖项使得角色可以将其他角色作为依赖项包含在内

    • 演示实例:一个定义文档服务器的角色可能依赖于另一个安装和配置web服务器的角色。依赖关系在角色目录层次结构中的meta/main.yml文件内定义
      [root@localhost project]# cat httpd/meta/main.yml 
      ---
      - name: dependen role 
        dependencies:
          - role: apache
            port: 8080
          - role: postgres
            dbname: serverlist
            admin_user: felix

    2️⃣:默认情况下,角色仅作为依赖项添加到playbook中一次。若有其他角色也将它作为依赖项列出,它不会再次运行

    • 此行为可以被覆盖,将meta/main.yml文件中的allow_duplicates变量设置为yes即可

    六、在playbook中使用角色

    1、在playbook中引用角色

    1️⃣:要访问角色,可在playroles:部分引用它

    [root@localhost project]# cat playbook.yaml 
    ---
    - hosts: all
      roles:
        - httpd

    这里可以不用加roles,默认情况下,Ansible会在Playbook所在目录的roles子目录中查找角色

    七、通过变量更改角色行为

    1、角色中变量优先级

    1️⃣:如果通过以下方式定义了相同的变量,则角色的defaults目录中定义的变量的值将被覆盖

    1. 在清单文件中定义,作为主机变量或组变量
    2. 在playbook项目的group_vars或host_vars目录下的YAML文件中定义
    3. 作为变量嵌套在play的vars关键字中定义
    4. 在play的roles关键字中包含该角色时作为变量定义

    总结:在httpd/vars目录下定义的变量的优先级最高;/httpd/vars目录下的变量会覆盖/httpd/defaults目录下的定义的变量

    2️⃣:重要:

    • 在play中使用角色变量时,变量的优先顺序可能会让人困惑
    • 几乎任何其他变量都会覆盖角色的默认变量,如清单变量、playvars变量,以及内嵌的角色参数等。
    • 较少的变量可以覆盖角色的vars目录中定义的变量。
    • 事实、通过include_vars加载的变量、
    • 清单变量和playvars无此能力。这非常重要,因为它有助于避免用户的play意外改变角色的内部功能。注册的变量和角色参数是其中一些具备这种能力的变量
    • 不过,正如上述示例中最后一个所示,作为角色参数内嵌声明的变量具有非常高的优先级,它们可以覆盖角色的vars目录中定义的变量。
    • 如果某一角色参数的名称与playvars或角色vars中设置的变量或者清单变量或playbook变量的名称相同,该角色参数将覆盖另一个变量
  • 相关阅读:
    事务
    约束条件(CONSTRAINTS)
    算术运算符
    数据查询、修改指令
    iview-admin使用webpack打包之后发布报Uncaught SyntaxError: Unexpected token <
    使用localhost可以访问,但使用本地ip+端口号无法访问
    datatables里面的search怎么去掉?
    删除操作之后的确定或取消弹出框?
    jquery实现上传图片本地预览效果
    怎么改变title属性的样式?
  • 原文地址:https://www.cnblogs.com/itwangqiang/p/13686987.html
Copyright © 2011-2022 走看看