Ansible 角色配置

Ansible roles简介

  • Ansible roles是为了层次化、结构化地组织Playbook。
  • roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们。
  • roles一般用于基于主机构建服务的场景中,在企业复杂业务场景中应用的频率很高。
  • 以特定的层级目录结构进行组织的tasks、variables、handlers、templates、files等;相当于函数的调用把各个功能切割成片段来执行。

roles目录结构

roles:          <--所有的角色必须放在roles目录下,这个目录可以自定义位置,默认的位置在/etc/ansible/roles
  project:      <---具体的角色项目名称,比如nginx、tomcat、php
    files:     <--用来存放由copy模块或script模块调用的文件。
    templates: <--用来存放jinjia2模板,template模块会自动在此目录中寻找jinjia2模板文件。
    tasks:     <--此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用include包含其它的位于此目录的task文件。
      main.yml
    handlers:  <--此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作。
      main.yml
    vars:      <--此目录应当包含一个main.yml文件,用于定义此角色用到的变量。
      main.yml
    defaults:  <--此目录应当包含一个main.yml文件,用于为当前角色设定默认变量。
      main.yml
    meta:      <--此目录应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系。
      main.yml

角色基本使用:

创建role的步骤

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

先创建一个roles目录:

[root@browserlb ~]# mkdir ansible
[root@browserlb ~]# cd ansible/
[root@browserlb ansible]# mkdir roles
[root@browserlb ansible]# mkdir roles/{httpd,mysql,memcache} -pv
mkdir: created directory ‘roles/httpd’
mkdir: created directory ‘roles/mysql’
mkdir: created directory ‘roles/memcache’
[root@browserlb ansible]# tree roles/
roles/
├── httpd
├── memcache
└── mysql

3 directories, 0 files

创建nginx目录

[root@browserlb ansible]# mkdir roles/nginx

卸载之前安装的nginx:
[root@browserlb ansible]# ansible all -m shell -a "yum -y remove nginx"
删除已有的nginx组和nginx用户:
[root@browserlb ansible]# ansible all -m shell -a "userdel -r nginx"
确保已删除:
[root@browserlb ansible]# ansible all -m shell -a "getent passwd | grep nginx"
[root@browserlb ansible]# ansible all -m shell -a "getent group | grep nginx"
# roles(角色)和playbook.yml(剧本)是同级单位;
创建需要的任务文件和模板文件:
[root@browserlb roles]# cd nginx/
[root@browserlb nginx]# mkdir tasks templates
[root@browserlb nginx]# ll
total 0
drwxr-xr-x. 2 root root 6 Apr 14 13:40 tasks
drwxr-xr-x. 2 root root 6 Apr 14 13:40 templates

编写所需的任务
[root@browserlb nginx]# cd tasks/

创建组
[root@browserlb tasks]# vi group.yml

  1. - name: create group
  2.   group: name=nginx gid=80

创建用户
[root@browserlb tasks]# vi user.yml

  1. - name: create user
  2.   user: name=nginx uid=80 group=nginx system=yes shell=/sbin/nologin

安装nginx软件
[root@browserlb tasks]# vi yum.yml

  1. - name: install package
  2.   yum: name=nginx

启动服务
[root@browserlb tasks]# vi start.yml

  1. - name: start service
  2.   service: name=nginx state=started enabled=yes

重启服务
[root@browserlb tasks]# vi restart.yml

  1. - name: restart service
  2.   service: name=nginx state=restarted
copy一个本地的配置文件放在templates/下并已j2为后缀
[root@browserlb tasks]# cd /root/ansible/roles/nginx/templates/

[root@browserlb templates]# yum -y install nginx

[root@browserlb templates]# cp /etc/nginx/nginx.conf ./nginx.conf.j2

创建一个调用模板:
[root@browserlb templates]# cd ../tasks/
[root@browserlb tasks]# vi temp1.yml

  1. - name: copy conf
  2.   template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf

创建总tasks文件来控制tasks执行顺序:
[root@browserlb tasks]# vi main.yml

  1. - include: group.yml
  2. - include: user.yml
  3. - include: yum.yml
  4. - include: temp1.yml
  5. - include: start.yml

创建调用角色的剧本:(这个总的playbook要与roles平级)
[root@browserlb tasks]# cd /root/ansible/
[root@browserlb ansible]# vi nginx_role.yml

执行剧本并查看结果
[root@browserlb ansible]# ansible-playbook nginx_role.yml

  1. - hosts: local
  2.   become: yes
  3.   become_user: root
  4.   roles:
  5.   - role: nginx

[root@browserlb ansible]# ansible local -m shell -a "ps aux | grep nginx"
 


roles高级用法:

部署一个httpd服务

[root@browserlb ansible]# cd roles/httpd/
[root@browserlb httpd]# mkdir tasks

卸载之前安装的httpd
[root@browserlb httpd]# ansible all -m shell -a 'yum -y remove httpd'
删除用户apache
[root@browserlb httpd]# ansible all -m user -a 'name=apache state=absent'
创建用户
[root@browserlb httpd]# cd tasks/
[root@browserlb tasks]# vi user.yml

  1. - name: create user
  2.   user: name=apache system=yes shell=/sbin/nologin

创建files目录并把要复制的文件放进去

[root@browserlb httpd]# mkdir files
[root@browserlb httpd]# yum -y install httpd
[root@browserlb httpd]# cp /etc/httpd/conf/httpd.conf ./files/

复制文件
[root@browserlb tasks]# vi copyfile.yml

  1. - name: copy files
  2.   copy: src=httpd.conf dest=/data/ owner=apache

创建总tasks文件来控制tasks执行顺序
[root@browserlb tasks]# vi main.yml

  1. - include: user.yml
  2. - include: copyfile.yml

创建调用角色的剧本:
[root@browserlb tasks]# cd /root/ansible/
[root@browserlb ansible]# vi httpd_role.yml

  1. - hosts: local
  2.   become: yes
  3.   become_user: root
  4.   roles:
  5.    - httpd

执行并验证上面配置的两个任务

  1. [root@browserlb ansible]# ansible-playbook httpd_role.yml
  2. [root@browserlb ansible]# ansible local -m shell -a "ls -l /data"
  3. [root@browserlb ansible]# ansible local -m shell -a "getent passwd | grep apache"
     

跨项目调用角色(roles):

以httpd和nginx为例,假设同时应用于一组服务器上,在此之前的操作清除:
[root@browserlb ansible]# ansible local -m user -a "name=apache state=absent"
[root@browserlb ansible]# ansible local -m shell -a "rm -rf /data/*"

[root@browserlb ansible]# ansible local -m shell -a "yum -y remove nginx"
[root@browserlb ansible]# ansible local -m shell -a "userdel -r nginx"

创建调用角色的剧本
[root@browserlb ansible]# cp nginx_role.yml some_role.yml
[root@browserlb ansible]# vi some_role.yml

  1. - hosts: local
  2.   become: yes
  3.   become_user: root
  4.   roles:
  5.   - role: httpd
  6.   - role: nginx

执行剧本并查看结果

  1. [root@browserlb ansible]# ansible-playbook some_role.yml
  2. [root@browserlb ansible]# ansible local -m shell -a "ls -l /data/"
  3. [root@browserlb ansible]# ansible local -m shell -a "ss -nltp"
     

跨角色引用任务:

比如我们想用nginx角色调用httpd里的copy任务

只需要在nginx的main.yml里面加入一条带路径的调用任务即可解决:

[root@browserlb ansible]# vi roles/nginx/tasks/main.yml

  1. - include: group.yml
  2. - include: user.yml
  3. - include: yum.yml
  4. - include: temp1.yml
  5. - include: start.yml
  6. - include: roles/httpd/tasks/copyfile.yml

记得还要修改httpd的copy剧本为绝对路径,要不然会出错
[root@browserlb ansible]# vi roles/httpd/tasks/copyfile.yml

  1. - name: copy files
  2.   copy: src=/etc/httpd/conf/httpd.conf dest=/data/ owner=apache

测试之前把原有的文件删掉:
[root@browserlb ansible]# ansible local -m shell -a "ls -l /data"
[root@browserlb ansible]# ansible local -m shell -a "rm -rf /data/*"

执行nginx角色的剧本并查看结果:

  1. [root@browserlb ansible]# ansible-playbook nginx_role.yml
  2. [root@browserlb ansible]# ansible local -m shell -a "ls -l /data"

[root@browserlb ansible]# tree
├── httpd_role.yml
├── nginx_role.yml
├── roles
│   ├── app
│   │   ├── tasks
│   │   │   ├── group.yml
│   │   │   ├── main.yml
│   │   │   ├── restart.yml
│   │   │   ├── start.yml
│   │   │   ├── temp1.yml
│   │   │   ├── user.yml
│   │   │   └── yum.yml
│   │   └── templates
│   │       └── nginx.conf.j2
│   ├── httpd
│   │   ├── files
│   │   │   └── httpd.conf
│   │   └── tasks
│   │       ├── copyfile.yml
│   │       ├── main.yml
│   │       └── user.yml
│   ├── memcache
│   ├── mysql
│   └── nginx
│       ├── tasks
│       │   ├── group.yml
│       │   ├── main.yml
│       │   ├── restart.yml
│       │   ├── start.yml
│       │   ├── temp1.yml
│       │   ├── user.yml
│       │   └── yum.yml
│       └── templates
│           └── nginx.conf.j2
├── some_role.yml
├── tags_role.yml
└── when_tags_role.yml

12 directories, 25 files

综合

用httpd服务实现:

查看路径
[root@browserlb app]# pwd
/root/ansible/roles/app

删除目录里所有的内容
[root@browserlb app]# rm -rf *
[root@browserlb app]# ll
total 0

创建目录用来存放任务
[root@browserlb app]# mkdir tasks templates vars handlers files
[root@browserlb app]# ll
total 0
drwxr-xr-x. 2 root root 6 Apr 14 14:55 files
drwxr-xr-x. 2 root root 6 Apr 14 14:55 handlers
drwxr-xr-x. 2 root root 6 Apr 14 14:55 tasks
drwxr-xr-x. 2 root root 6 Apr 14 14:55 templates
drwxr-xr-x. 2 root root 6 Apr 14 14:55 vars

创建组
[root@browserlb app]# cd tasks/
[root@browserlb tasks]# vi group.yml

  1. - name: create group
  2.   group: name=app system=yes gid=123

创建用户
[root@browserlb tasks]# vi user.yml

  1. - name: create user
  2.   user: name=app group=app system=yes shell=/sbin/nologin uid=123

安装httpd软件
[root@browserlb tasks]# vi yum.yml

  1. - name: install package
  2.   yum: name=httpd

提前装好httpd,并复制一份配置文件到templates下还要改名:
[root@browserlb tasks]# cp /etc/httpd/conf/httpd.conf  ../templates/httpd.conf.j2

由于用户和组没有指定系统变量,所以需要我们在规划好的vars下手动定义变量剧本以备调用
[root@browserlb tasks]# vi ../vars/main.yml

  1. username: app
  2. groupname: app

创建调用模板
[root@browserlb tasks]# vi tempp1.yml

  1. - name: copy conf
  2.   template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
  3.   notify: restart service

[root@browserlb tasks]# cd ..
重启服务
[root@browserlb app]# vi handlers/restart.yml

  1. - name: restart service
  2.   service: name=httpd state=restarted

启动服务
[root@browserlb app]# vi tasks/start.yml

  1. - name: start service
  2.   service: name=httpd state=started enabled=yes

[root@browserlb app]# tree
.
├── files
│   └── vhosts.conf
├── handlers
│   ├── main.yml
│   └── restart.yml
├── tasks
│   ├── group.yml
│   ├── start.yml
│   ├── temppl.yml
│   └── yum.yml
├── templates
│   └── httpd.conf.j2
└── vars
    └── main.yml

5 directories, 9 files

创建一个copy任务
[root@browserlb app]# vi tasks/copyfile.yml

  1. - name: copy config
  2.   copy: src=vhosts.conf dest=/etc/httpd/conf.d/ owner=app

创建一个执行次序的剧本
[root@browserlb app]# vi tasks/main.yml

  1. - include: group.yml
  2. - include: user.yml
  3. - include: yum.yml
  4. - include: temp1.yml
  5. - include: copyfile.yml
  6. - include: start.yml

创建角色剧本
[root@browserlb ansible]# cp httpd_role.yml app_role.yml
[root@browserlb ansible]# vi app_role.yml

  1. - hosts: local
  2.   become: yes
  3.   become_user: root
  4.   roles:
  5.    - app

执行剧本并查看结果

  1. [root@browserlb ansible]# ansible-playbook app_role.yml
  2. [root@browserlb ansible]# ansible local -m shell -a "ss -nltp | grep httpd"
  3. [root@browserlb ansible]# ansible local -m shell -a "ps aux | grep app"
     

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老骥又出发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值