自动化运维工具Ansible之playbooks剧本及roles角色定制

一:playbooks;                                                                                                              

playbooks是Ansible用于配置、部署和管理被控节点的剧本。 通过执行一系列tasks,让远程主机达到预期状态;playbooks就像Ansible控制器给被控节点列出的的一系列to-do-list,而被控节点必须要完成。playbooks由YAML语言编写,YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822,Clark Evans在2001年5月在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。

playbooks格式:

1、文件的第一行应该以 ”—” (三个连字符)开始,表明YAML文件的开始(非必须);

2、在同一行中,#之后的内容表示注释,类似于shell,python和ruby;

3、YMAL中的列表元素以”-”开头然后紧跟着一个空格,后面为元素内容;

4、同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理;

5、play中hosts,variables,roles,tasks等对象的表示方法都是键值中间以”:”分隔表示,”:”后面还要增加一个空格;

6、文件以.yml结尾。

eg:- apple- banana- orange等价于JSON的这种格式

Playbooks配置文件的基础组件:

Hosts:运行指定任务的目标主机;
remoute_user: 在远程主机上执行任务的用户;
sudo_user:也可以使用sudo,但是用户必须要有执行相应tasks的权限;
tasks:任务列表;
模块,模块参数;
格式:
(1) action: module arguments
(2) module: arguments
注意:shell和command模块后面直接跟命令,而非key=value类的参数列表;
(1) 某任务的状态在运行后为changed时,可通过“notify”通知给相应的handlers;
(2) 任务可以通过“tags“打标签,而后可在ansible-playbook命令上使用 - t 指定进行调用;
例:

---
- hosts: web  
  remote_user: root
  tasks:
     - name: yum install samba
       yum: name=samba state=latest
     - name: start service
       service: name=smb state=started
       tags: startsmb
  handlers:
     - name: reload
       server:name=smb state=restarted

如上代码所示:

1、hosts部分:使用hosts指明使用哪个主机或主机组来运行下面的tasks,每个playbook都必须指定hosts,hosts也可以使用通配符格式。主机或主机组在inventory清单中指定,可以使用系统默认的/etc/ansible/hosts,也可以自己编辑,在运行的时候加上-i选项,指定清单的位置即可。在运行清单文件的时候,–list-hosts选项会显示那些主机将会参与执行task的过程中;

2、remote_user:指定远端主机中的哪个用户来登录远端系统,在远端系统执行tasks的用户,可以任意指定,也可以使用sudo,但是用户必须要有执行相应tasks的权限;

3、tasks:指定远端主机将要执行的一系列动作。tasks的核心为ansible的模块,前面已经提到模块的用法。tasks包含name和要执行的模块,name是可选的,只是为了便于用户阅读,不过还是建议加上去,模块是必须的,同时也要给予模块相应的参数;

4、tags:打标签,在命令行执行操作时在ansible-playbook 后加上-t选项指定操作哪个tags;

5、handlers:由特定条件触发的任务;格式似tasks;

定义变量variable:

1 facts :直接调用:可使用 setup 模块直接获取主机的 facters
2 、用户自定义变量;
(a) 在执行ansible-playbook命令的命令行中的 -e VARS, --extra-vars=VARS
(b) 在playbook中定义变量的方法:
vars:
- var1: value1
- - var2: value2
3 、通过 roles 传递变量;
4 、在 Host Inventory中定义;
用户自定义变量
(i) 向不同的主机传递不同的变量;
IP/HOSTNAME varaiable=value var2=value2
(ii) 向组中的主机传递相同的变量;
[groupname:vars]
variable=value
运行 paybook 方式:

1、测试:

ansible-playbook --check(|-C)只检测可能会发生的改变,但不真正执行操作;

ansible-playbook --list-hosts 列出运行任务的主机;

2、直接运行;

ansible-playbook filename.yml

二:roles;                                                                                 

roles 用于层次性、结构化地组织playbooks。roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等,简单来讲,roles就是通过分别将变量(vars)、文件(file)、任务(tasks)、模块(modules)及处理器(handlers)放置于单独的目录中,并可以便捷地include它们的一种机制。使用时,在playbook中使用include即可;一般用于主机构建服务的场景中,或者构建守护进程场景中。

角色集合:即roles目录下的子目录

1、files/:存储由copy或script等模块调用的文件;

2、tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用;

3、handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行“包含”调用;

4、vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各变量variable;其它的文件需要由main.yml进行“包含”调用;

5、templates/:存储由template模块调用的模板文本;

6、meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用;

7、default/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;

实现角色定制:(这里使用的是nginx、mysql和httpd服务为例)

1、在roles目录下生成对应的目录结构
mkdir -pv ./{nginx,mysql,httpd}/{files,templates,vars,tasks,handlers,meta,default}
2、定义/tasks/main.yml的配置文件
- name: cp
  copy: src=nginx-1.10.2-1.el7.ngx.x86_64.rpm dest=/tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm
- name: install
   yum: name=/tmp/nginx-1.10.2-1.el7.ngx.x86_64.rpm state=latest
- name: conf
   template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
   tags: nginxconf
   notify: new conf to reload
  - name: start service
   service: name=nginx state=started enabled=true
3、修改边变量文件
vars/main.yml 添加变量nginx_port: “8888”
4、定义handlers文件
handlers/main.yml
- name: new conf to reload
   service: name=nginx state=restarted
5、定义/etc/ansible/nginx.yml的playbook文件
- hosts: nginx
   remote_user: root
   roles:
      - nginx
6、可以通过roles传递变量
- hosts: nginx
   remote_user: root
   roles:
     - { role: nginx, nginxport: 12345 }
7、也可以配置多个角色
roles:
# - { role: nginx, nginxport: 12345 }
- { role: memcached}

最后文件目录结构如下所示:

├── default
├── files
│├── nginx-1.10.2-1.el7.ngx.x86_64.rpm
├──handlers
│ └── main.yml
├── meta
├── tasks
│└── main.yml
├── templates
│ └── nginx.conf.j2
└──vars
   ├── main.yml

你可能感兴趣的:(自动化运维)