Ansible的roles

Ansible的roles

roles的介绍

roles的解析

​ ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。
​ ``roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中, ​ 并可以便捷地include它们的一种机制。
​ 角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中

复杂场景:建议使用roles,代码复用度高
变更指定主机或主机组
如命名不规范维护和传承成本大
某些功能需多个Playbook,通过includes即可实现

Roles

角色(roles):角色集合
[root@ansible ansible]# tree 
.
└── roles
    ├── httpd
    ├── memcache
    ├── mysql
    └── nginx
    
可以互相调用

image

Roles各目录作用

/roles/project/ :项目名称,有以下子目录
    files/ :存放由copy或script模块等调用的文件
    templates/:template模块查找所需要模板文件的目录
    tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;
            其它的文件需要在此文件中通过include进行包含
    handlers/:至少应该包含一个名为main.yml的文件;
               其它的文件需要在此文件中通过include进行包含
    vars/:定义变量,至少应该包含一个名为main.yml的文件;
           其它的文件需要在此文件中通过include进行包含
    meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,
           其它文件需在此文件中通过include进行包含
    default/:设定默认变量时使用此目录中的main.yml文件
    
roles/appname 目录结构
    tasks目录:至少应该包含一个名为main.yml的文件,其定义了此角色的任务列表;
               此文件可以使用include包含其它的位于此目录中的task文件
    files目录:存放由copy或script等模块调用的文件;
    templates目录:template模块会自动在此目录中寻找Jinja2模板文件
    handlers目录:此目录中应当包含一个main.yml文件,用于定义此角色用到的各handler;
                  在handler中使用include包含的其它的handler文件也应该位于此目录中;
    vars目录:应当包含一个main.yml文件,用于定义此角色用到的变量;
    meta目录:应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系;
              ansible1.3及其以后的版本才支持;
    default目录:为当前角色设定默认变量时使用此目录;应当包含一个main.yml文件

roles/example_role/files/             所有文件,都将可存放在这里
roles/example_role/templates/         所有模板都存放在这里
roles/example_role/tasks/main.yml:   主函数,包括在其中的所有任务将被执行
roles/example_role/handlers/main.yml:所有包括其中的 handlers 将被执行
roles/example_role/vars/main.yml:    所有包括在其中的变量将在roles中生效
roles/example_role/meta/main.yml:    roles所有依赖将被正常登入

创建role

创建role的步骤
(1) 创建以roles命名的目录
(2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等
(3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;
    用不到的目录可以创建为空目录,也可以不创建
(4) 在playbook文件中,调用各角色

实验: 创建nginx角色

1.创建roles目录
   mkdir roles/{httpd,mysql,redis}/tasks -pv
   mkdir  roles/httpd/{handlers,files}
   
2.查看目录结构
[root@ansible ansible]# tree  roles/
roles/
└── nginx
    ├── tasks
    └── templates
        
3.创建目标文件
[root@ansible ansible]#touch group.yaml user.yaml yum.yaml templates.yaml start.yaml

[root@ansible tasks]# vim group.yaml 
- name: create group 
  group: name=nginx 

[root@ansible tasks]# vim  user.yaml 
- name: create user 
  user: name=nginx group=nginx  shell=/sbin/nologin

[root@ansible tasks]# vim  yum.yaml 
- name: copy file 
  copy: src=/etc/yum.repos.d/CentOS-Base.repo dest=/etc/yum.repos.d/CentOS-Base.repo
- name: install packages 
  yum: name=nginx 

[root@ansible tasks]# vim templates.yaml 
- name:  copy conf 
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf 

[root@ansible tasks]# vim start.yaml 
- name: start service 
  service: name=nginx state=started enabled=yes

4.创建main.yml主控文件,调用以上单独的yml文件,main.yml定义了谁先执行谁后执行的顺序
[root@ansible tasks]# vim main.yaml 
- include: group.yaml 
- include: user.yaml 
- include: yum.yaml 
- include: templates.yaml
- include: start.yaml 

5.创建好j2的nginx配置文件
[root@ansible nginx]# vim templates/nginx.conf.j2 
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes {{ansible_processor_vcpus+2}};  #改个CPU数量
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

6.在roles同级的情况下创建使用角色role的yaml文件。
[root@ansible ansible]# vim nginx_role.yaml  
- hosts: server 
  remote_user: root 
  roles: 
    - role: nginx  #调用角色

7.查看完整的目录结构
[root@ansible ansible]# tree  roles 
roles
├── httpd
├── memcache
├── mysql
└── nginx
    ├── tasks
    │   ├── group.yaml
    │   ├── main.yaml
    │   ├── start.yaml
    │   ├── templates.yaml
    │   ├── user.yaml
    │   └── yum.yaml
    └── templates
        └── nginx.conf.j2

8.运行role的剧本
[root@ansible ansible]# ansible-playbook nginx_role.yaml 

PLAY [server] **********************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************
ok: [192.168.1.107]
ok: [192.168.1.106]
ok: [192.168.1.105]

TASK [nginx : create group] ********************************************************************************************
ok: [192.168.1.105]
ok: [192.168.1.107]
ok: [192.168.1.106]

TASK [nginx : create user] *********************************************************************************************
ok: [192.168.1.105]
ok: [192.168.1.107]
ok: [192.168.1.106]

TASK [nginx : copy file] ***********************************************************************************************
ok: [192.168.1.107]
ok: [192.168.1.105]
ok: [192.168.1.106]

TASK [nginx : install packages] ****************************************************************************************
ok: [192.168.1.107]
ok: [192.168.1.106]
ok: [192.168.1.105]

TASK [nginx : copy conf] ***********************************************************************************************
ok: [192.168.1.105]
ok: [192.168.1.106]
ok: [192.168.1.107]

TASK [nginx : start service] *******************************************************************************************
changed: [192.168.1.106]
changed: [192.168.1.107]
changed: [192.168.1.105]

PLAY RECAP *************************************************************************************************************
192.168.1.105              : ok=7    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.1.106              : ok=7    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
192.168.1.107              : ok=7    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

roles多角色调用

#调用角色方法1:
[root@ansible ansible]# vim web.yaml 
- hosts: server 
  remote_user: root 

  roles: 
    - role: httpd 
    - role: nginx

#调用角色方法2
传递变量给角色
- hosts:
  remote_user:
  roles:
    - mysql
    - { role: nginx, username: nginx }   #不同的角色调用不同的变量  
    键role用于指定角色名称
    后续的k/v用于传递变量给角色

调用角色方法3:还可基于条件测试实现角色调用
roles:
  - { role: nginx, username: nginx, when: ansible_distribution_major_version == '7' }

通过roles传递变量

通过roles传递变量
当给一个主机应用角色的时候可以传递变量,然后在角色内使用这些变量
示例:
- hosts: webservers
  roles:
    - common
    - { role: foo_app_instance, dir: '/web/htdocs/a.com', port: 8080 }

向roles传递参数

而在playbook中,可以这样使用roles:
---
- hosts: webservers
  roles:
    - common
    - webservers

也可以向roles传递参数
示例:
---
- hosts: webservers
  roles:
    - common
    - { role: foo_app_instance, dir: '/opt/a', port: 5000 }
    - { role: foo_app_instance, dir: '/opt/b', port: 5001 }

条件式地使用roles

甚至也可以条件式地使用roles
示例:
---
- hosts: webservers
  roles:
    - { role: some_role, when: "ansible_os_family == 'RedHat'" }

Roles条件及变量等案例

When条件
    roles:
      - {role: nginx, when: "ansible_distribution_major_version == '7' " ,username: nginx }
变量调用
- hosts: zabbix-proxy
  sudo: yes
  roles:
    - { role: geerlingguy.php-mysql }
    - { role: dj-wasabi.zabbix-proxy, zabbix_server_host: 192.168.37.167 }

完整的roles架构

// nginx-role.yml 顶层任务调用yml文件
---
- hosts: testweb
  remote_user: root
  roles:
    - role: nginx
    - role: httpd 可执行多个role

cat roles/nginx/tasks/main.yml
---
- include: groupadd.yml
- include: useradd.yml
- include: install.yml
- include: restart.yml
- include: filecp.yml

// roles/nginx/tasks/groupadd.yml
---
- name: add group nginx
  user: name=nginx state=present

cat roles/nginx/tasks/filecp.yml
---
- name: file copy
  copy: src=tom.conf dest=/tmp/tom.conf

以下文件格式类似:
useradd.yml,install.yml,restart.yml

ls roles/nginx/files/
tom.conf

roles playbook tags使用

roles playbook tags使用
    ansible-playbook --tags="nginx,httpd,mysql" nginx-role.yml  对标签进行挑选执行

// nginx-role.yml
---
- hosts: testweb
  remote_user: root
  roles:
    - { role: nginx ,tags: [ 'nginx', 'web' ] ,when: ansible_distribution_major_version == "6“ }
    - { role: httpd ,tags: [ 'httpd', 'web' ] }
    - { role: mysql ,tags: [ 'mysql', 'db' ] }
    - { role: marridb ,tags: [ 'mysql', 'db' ] }
    - { role: php }

实验: 创建角色memcached

memcacched 当做缓存用,会在内存中开启一块空间充当缓存
cat /etc/sysconfig/memcached 
    PORT="11211"
    USER="memcached"
    MAXCONN="1024"
    CACHESIZE="64"    # 缓存空间默认64M 
    OPTIONS=""

1> 创建对用目录
   cd /app/ansible
   mkdir roles/memcached/{tasks,templates} -pv
   
2> 拷贝memcached配置文件模板
   cp /etc/sysconfig/memcached  templates/memcached.j2
   vim templates/memcached.j2
   CACHESIZE="{{ansible_memtotal_mb//4}}"   #物理内存的1/4用做缓存
   
3> 创建对应yml文件,并做相应配置
   cd tasks/
   touch install.yml config.yml service.yml
   创建main.yml文件定义任务执行顺序
   vim main.yml
   - include: install.yml
   - include: config.yml
   - include: service.yml  
   
   vim install.yml
   - name: install 
     yum: name=memcached
     
   vim config.yml
   - name: config file
     template: src=memcached.j2 dets=/etc/sysconfig/memcached

   vim service.yml
   - name: service
     service: name=memcached state=started enabled=yes

4> 创建调用角色文件
   cd /app/ansible/roles/
   vim role_memcached.yml
    ---
    - hosts: appsrvs
    
      roles: 
        - role: memcached

5> 安装
   ansible-playbook  role_memcached.yml 
   memcached端口号11211

其它功能

委任(指定某一台机器做某一个task)
    delegate_to
    local_action (专指针对ansible命令执行的机器做的变更操作)
交互提示
    prompt
*暂停(java)
    wait_for
Debug
    debug: msg="This always executes."
Include
Template 多值合并
Template 动态变量配置
posted @ 2021-09-27 21:09  isicman  阅读(209)  评论(0编辑  收藏  举报