Ansible进阶之roles详解
迭代写法:with_items
迭代:当需要重复性执行的任务时,可以使用迭代机制
·对迭代选项的引用,固定变量名为“item”
·要在task中使用with_items给定要迭代的元素列表
·列表格式:字符串、浮点
使用字符串
--- - host: webservs remote_user: root tasks: - name: create some files file: name=/data/{{ item }} start=touch with_itmes: - file1 - file2 - file3
迭代嵌套子变量
使用字典
--- - host: webservs remote_user: root tasks: - name: create some files group: name={{item}} when: ansible_distribution_major_version == "7"#是版本7才执行下面的 with_items: - g1 - g2 - g3 - name: create some users user: name={{itme.name}} group={{item.group}} with_items: - { name: 'user1', group: 'g1'} - { name: 'user2', group: 'g2'} - { name: 'user3', group: 'g3'}
Playbook中template for if
for循环的运用
---
- hosts: websrvs
remote_user: root
vars:
ports:#定义变量列表
- 81
- 82
- 83
tasks:
- name: copy conf
template: src=for1.conf.j2 dest+/data/for1.conf#使用模板将src作为模板
需要创建for1.conf.j2这个模板文件
vim for1.conf.j2#在里面写下面的内容
{% for port in ports%} server { listen {{ port }}
}
{%endfor%}
###############################
使用键值对的时候将81、82、83改为listen_port: 81这样的格式类推,然后在模板文件里将调用的变量port改为port.listen_port
使用键值对实例
说明:一个web属于一个变量
模板文件的创建:
说明:p.port是变量的调用
if的运用
{% if vhost.server_ name is defined %} server_ name {{ vhost.server_ name }}; {% endif %}
for和if配合使用
if语句的说明:如果p.name是被定义的则执行下面的语句
roles
ansilbe自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。 要使用roles只需要在playbook中使用include指令即可。简单来讲, roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色-般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中
复杂场景:建议使用roles,代码复用度高
·变更指定主机或主机组
·如命名不规范维护和传承成本大
·某些功能需要多个playbook,通过inscudes即可实现
·一般的角色都会写在/etc/ansible/roles下对应服务创建相应的服务文件夹
roles目录结构示例:
实例:通过角色实现nginx的安装到运行
1.创建nginx用户并创建nginx用户组然后加到组里
2.yum这个Nginx包
3.通过template使用Nginx的配置文件模板
4.启动Nginx
创建tasks文件夹内写具体的小功能
1.vim group.yml - name: create group group: name=nginx gid=80 2.vim user.yml - name: create user user: name=nginx grounp=nginx shell=/sbin/nologin uid=80 3.vim yum.yml - name: install package yum: name=nginx 4.vim start.yml - name:start nginx service: name=nginx state=started enabled=yes 5.cp /etc/nginx/nginx.conf /etc/ansible/templates/nginx.conf.j2 6.vim templ.yml - name: copy conf template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf 7.创建总的剧本调用任务剧本 vim main.yml - include: group.yml - include: user.yml - include: yum.yml - include: templ.yml - include: start.yml 8.创建调用角色的剧本 cd /etc/ansble vim nginx_roles.yml - hosts: 106.12.39 remote_user: root roles: - role: nginx