运维自动化之ANSIBLE--Roles

roles

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

角色(roles):角色集合

  • roles/
  • mysql/
  • httpd/
  • nginx/
  • memcached/

可以互相调用

Ansible Roles目录编排

roles目录结构 

每个角色,以特定的层级目录结构进行组织

roles目录结构:

playbook.yml 调用角色

roles/

        project/ (角色名称)

                tasks/

                files/

                vars/

                templates/

                handlers/

                default/ 不常用

                meta/ 不常用

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文件。

创建role

创建role的步骤

(1) 创建以roles命名的目录

(2) 在roles目录中分别创建以各角色名称命名的目录,如webservers等

(3) 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录; 用不到的目录可以创建为空目录,也可以不创建

(4) 在playbook文件中,调用各角色

实验: 创建httpd角色

1> 创建roles目录

   mkdir roles/{httpd,mysql,redis}/tasks -pv
   mkdir  roles/httpd/{handlers,files}

查看目录结构

tree roles/
    roles/
    ├── httpd
    │   ├── files
    │   ├── handlers
    │   └── tasks
    ├── mysql
    │   └── tasks
    └── redis
        └── tasks

2> 创建目标文件

   cd roles/httpd/tasks/
   touch install.yml config.yml service.yml

3> vim install.yml

   - name: install httpd package
     yum: name=httpd
     
   vim config.yml
   - name: config file  
     copy: src=httpd.conf dest=/etc/httpd/conf/ backup=yes 
   
   vim service.yml
   - name: start service 
     service: name=httpd state=started enabled=yes

4> 创建main.yml主控文件,调用以上单独的yml文件, main.yml定义了谁先执行谁后执行的顺序

   vim main.yml
   - include: install.yml
   - include: config.yml
   - include: service.yml

5> 准备httpd.conf文件,放到httpd单独的文件目录下

   cp /app/ansible/flies/httpd.conf ../files/

6> 创建一个网页

   vim flies/index.html
   <h1> welcome to weixiaodong home <\h1>

7> 创建网页的yml文件

  vim tasks/index.yml
   - name: index.html
     copy: src=index.html dest=/var/www/html 

8> 将网页的yml文件写进mian.yml文件中

   vim mian.yml
   - include: install.yml
   - include: config.yml
   - include: index.yml
   - include: service.yml

9> 在handlers目录下创建handler文件mian.yml

   vim handlers/main.yml
   - name: restart service httpd
     service: name=httpd state=restarted

10> 创建文件调用httpd角色

    cd /app/ansidle/roles
    vim role_httpd.yml
    ---
    # httpd role
    - hosts: appsrvs
      remote_user: root 

      roles:       #调用角色
        - role: httpd  

11> 查看目录结构

    tree 
    .
    httpd
    ├── files
    │   ├── httpd.conf
    │   └── index.html
    ├── handlers
    │   └── main.yml
    └── tasks
        ├── config.yml
        ├── index.yml
        ├── install.yml
        ├── main.yml
        └── service.yml

12> ansible-playbook role_httpd.yml

针对大型项目使用Roles进行编排

roles目录结构

playbook.yml

roles/

        project/

                tasks/

                files/

                vars/

                templates/

                handlers/

                default/ # 不经常用

                meta/ # 不经常用

示例:nginx-role.yml

roles/
└── nginx
    ├── files
    │ └── main.yml
    ├── tasks
    │ ├── groupadd.yml
    │ ├── install.yml
    │ ├── main.yml
    │ ├── restart.yml
    │ └── useradd.yml
    └── vars
        └── main.yml

示例

roles的示例如下所示:
site.yml
webservers.yml
dbservers.yml
roles/
  common/
    files/
    templates/
    tasks/
    handlers/
    vars/
    meta/
  webservers/
    files/
    templates/
    tasks/
  handlers/
    vars/
    meta/

实验: 创建一个nginx角色

建立nginx角色在多台主机上来部署nginx需要安装 创建账号

1> 创建nginx角色目录

     cd /app/ansible/role
     mkdir nginx{tesks,templates,hanslers} -pv

2> 创建任务目录

     cd tasks/
     touch insatll.yml config.yml service.yml file.yml user.yml
   创建main.yml文件定义任务执行顺序
     vim main.yml
     - include: user.yml
     - include: insatll.yml
     - include: config.yml
     - include: file.yml
     - include: service.yml

3> 准备配置文件(centos7、8)

   ll /app/ansible/role/nginx/templates/
   nginx7.conf.j2
   nginx8.conf.j2

4> 定义任务

 vim tasks/install.yml
   - name: install
     yum: name=nginx
     
   vim tasks/config.yml
    - name: config file
      template: src=nginx7.conf.j2 dest=/etc/nginx/nginx.conf
      when: ansible_distribution_major_version=="7"
      notify: restrat
      
    - name: config file
      template: src=nginx8.conf.j2 dest=/etc/nginx/nginx.conf
      when: ansible_distribution_major_version=="8"
      notify: restrat
      
    vim tasks/file.yml   跨角色调用file.yum文件,实现文件复用
    - name: index.html
      copy: src=roles/httpd/files/index.html dest=/usr/share/nginx/html/ 
   
    vim tasks/service.yml
    - nmae: start service
      service: name=nginx state=started enabled=yes
      
    vim handlers/main.yml
    - name: restrat
      service: name=nginx state=restarted
      
    vim roles/role_nginix.yml
    --- 
    #test rcle
    - hosts: appsrvs
    
      roles: 
        - role: nginx

5> 测试安装

ansible-playbook role_nginx.yml

Roles案例

Roles目录编排

Playbook中调用

playbook调用角色

调用角色方法1:

- hosts: websrvs
  remote_user: root
  
  roles:
    - mysql
    - memcached
    - 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传递变量

当给一个主机应用角色的时候可以传递变量,然后在角色内使用这些变量

示例:

- hosts: webservers
  roles:
    - common
    - { role: foo_app_instance, dir: '/web/htdocs/a.com', port: 8080 }

而在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

示例:

---
- 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使用

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

其它功能

1️⃣委任(指定某一台机器做某一个task)

        delegate_to

        local_action (专指针对ansible命令执行的机器做的变更操作)

2️⃣交互提示

        prompt

3️⃣*暂停(java)

        wait_for

4️⃣Debug

        debug: msg="This always executes."

5️⃣Include

6️⃣Template 多值合并

7️⃣Template 动态变量配置

推荐资料

http://galaxy.ansible.com

https://galaxy.ansible.com/explore#/

http://github.com/ http://ansible.com.cn/

https://github.com/ansible/ansible

https://github.com/ansible/ansible-examples

实验: 实现二进制安装mysql的卸载

cat remove_mysql.yml 
---
# install mariadb server 
- hosts: appsrvs:!192.168.38.108
  remote_user: root

  tasks:
    - name: stop service 
      shell: /etc/init.d/mysqld stop
    - name: delete user 
      user: name=mysql state=absent remove=yes
    - name: delete
      file: path={{item}} state=absent
      with_items: 
        - /usr/local/mysql
        - /usr/local/mariadb-10.2.27-linux-x86_64
        - /etc/init.d/mysqld
        - /etc/profile.d/mysql.sh
        - /etc/my.cnf
        - /data/mysql

ansible-playbook  remove_mysql.yml

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值