ansible进阶模板和角色使用
使用场景
Ansible 由于采用ssh远程连接登录管理,虽然不需要额外安装agent,但是速度慢效率低.不适合管理大规模的主机一般最大规模在200-300台,超大规模的主机管理适合使用puppet
模板
templates功能:根据模块文件动态生成对应的配置文件
templates文件必须存放于templates目录下,且命名为 .j2 结尾
yaml/yml 文件需和templates目录平级
Jinja2语言
字符串:使用单引号或双引号
数字:整数,浮点数
列表:[item1, item2, ...]
元组:(item1, item2, ...)
字典:{key1:value1, key2:value2, ...}
布尔型:true/false
算术运算:+, -, *, /, //, %, ** // 表示把相除得到的结果取整数
比较操作: ==, !=, >, >=, <, <=
逻辑运算:and, or, not
流表达式: for if when
when条件判断语法
tasks:
- name: install nginx
yum: name=nginx
- name: copy config for
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
when: ansible_distribution_major_version == ""
notify: restart nginx
- name: copy config for
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
when: ansible_distribution_major_version == ""
when条件判断
迭代:with_items
迭代:当有需要重复性执行的任务时,可以使用迭代机制 如:同时安装多个软件包或者批量创建文件
---
- hosts: webservers
remote_user: root tasks:
- name: create some files
file: name=/data/ {{ item }} state=touch with_items:
- file1
- file2
- file3 - name: install package
yum: name={{ item }} with_items:
- htop
- sl
- hping3
迭代
- hosts:websrvs
remote_user: root tasks:
- name: add some groups
group: name={{ item }} state=present with_items:
- group1
- group2
- group3 - name: add some users
user: name={{ item.name }} group={{ item.group }} state=present with_items:
- { name: 'user1', group: 'group1' }
- { name: 'user2', group: 'group2' }
- { name: ‘user3’, group: ‘group3’ }
迭代嵌套
模板文件j2语法
{% for vhost in nginx_vhosts %}
server
{
listen {{ vhost.listen }}
server_name {{ vhost.server_name }}
root {{ vhost.root }}
} {% endfor %} {% for vhost in nginx_vhosts %}
server
{
listen {{ vhost.listen }}
{% if vhost.server_name is defined %}
server_name {{ vhost.server_name }}
{% endif %}
root {{ vhost.root }}
}
{% endfor %}
模板语法
角色
用于层次性,结构化地组织playbook.roles 能够根据层次型结构自动装载变量文件,tasks以及handlers等.要使用roles只需要在playbook中使用include指令即可
Roles各目录作用 :
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文件
角色的基本示例
使用Role安装编译nginx的流程
1.创建group nginx
2.创建user nginx
3.yum install nginx
4.template nginx.conf.j2
5.service nginx
[root@localhost playbookbak]# ls
roles useroles.yaml
[root@localhost playbookbak]# ansible-playbook useroles.yaml
[root@localhost roles]# ls
httpd memcache mysql nginx
[root@localhost nginx]# ls
files tasks templates
[root@localhost tasks]# ls
group.yaml main.yaml restart.yaml start.yaml templ.yaml user.yaml yum.yaml
---
- hosts: webservers
remote_user: root
roles:
- role: nginx
useroles.yaml
- include: group.yaml
- include: user.yaml
- include: yum.yaml
- include: templ.yaml
- include: start.yaml
main.yaml
- name: add group
group: name=nginx gid=
group.yaml
- name: create user
user: name=nginx uid= system=yes shell=/sbin/nologin
user.yaml
- name: install nginx
yum: name=nginx
yum.yaml
- name: copy conf
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
templ.yaml
- name: start nginx
service: name=nginx state=started enabled=yes
start.yaml
---
- hosts: webservers
remote_user: root
roles:
- role: nginx
- role: mysql
同时执行多个角色
- include: group.yaml
- include: user.yaml
- include: yum.yaml
- include: templ.yaml
- include: start.yaml
- include: /roles/mysql/tasks/copyfile.yaml
跨角色调用main.yaml
角色标签
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 }
标签的调用方法(相当于在角色列表中挑选某些个角色单独执行):
ansible-playbook --tags="nginx,httpd,mysql" nginx-role.yml
角色调用方法种类
调用角色方法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' }
handlers , tasks, vars 的入口文件都是通过main.yaml文件来执行的
模块源码分析
from ansible.module_utils.basic import AnsibleModule def main():
module = AnsibleModule(
#如果没有传递-a选项参数,返回pong做为默认返回值
argument_spec=dict(
data=dict(type='str', default='pong'),
),
supports_check_mode=True
)
#ansible all -m ping -a "data=haha"
#ansible all -m ping -a "data=crash"
#module.params['data'] 接收的是 -a 后面的参数
if module.params['data'] == 'crash':
raise Exception("boom") result = dict(
ping=module.params['data'],
) module.exit_json(**result)
ping模块
ansible进阶模板和角色使用的更多相关文章
- ansible jinja2模板概述
目录 ansible jinja2模板概述 ansible jinja2模板使用 基本语法 jinja2模板逻辑判断 ansible jinja2管理nginx ansible jinja2管理kee ...
- Ansible Jinja2 模板使用
Ansible Jinja2 模板使用.语法与使用案例 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放: ...
- devops工具-Ansible进阶playbook&roles
一.playbook介绍 playbook 是 Ansible 管理配置.部署应用的核心所在,一个playbook由有多“play组成”,而一个play实际就是一个task,每个task是由多 ...
- Ansible进阶
YAML YAML简介 YAML是一个可读性高,并用来表达资料序列的格式.YAML参考了其它多种语言,包括:XML.C语言.Python.Perl以及电子邮件格式RFC2822等 它是一种直观的能够被 ...
- Ansible进阶--playbook的使用
一.什么是playbooksplaybooks是ansible的脚本.如同shell脚本一样,它是控制远程主机的一系列命令的集合,通过YAML语言编写.执行一些简单的任务,我们可以使用ad-hoc命令 ...
- 5.Ansible Jinja2 模板
1.jinja2渲染NginxProxy配置文件 jinja2 房屋建筑设计固定的 jinja2模板与Ansible关系 Ansible如何使用jinja2模板 template模块 拷贝文件? te ...
- Ansible Jinja2 模板
1.jinja2渲染NginxProxy配置文件 jinja2 房屋建筑设计固定的? jinja2模板与Ansible关系 Ansible如何使用jinja2模板 template模块 拷贝文件? t ...
- C++进阶--模板及关键字typename
//############################################################################ /* * 模板介绍 */ //函数模板 t ...
- Ansible 进阶技巧
原文 http://www.ibm.com/developerworks/cn/linux/1608_lih_ansible/index.html?ca=drs- 简介 Ansible 是一个系 ...
随机推荐
- MySQL高性能优化系列
https://www.cnblogs.com/huchong/p/10219318.html https://www.cnblogs.com/huchong/tag/MySQL%E9%AB%98%E ...
- 设计模式-行为型模式,python访问者模式
访问者模式 在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法.通过这种方式,元素的执行算法可以随着访问者改变而改变.这种类型的设计模式属于行为型模式. ...
- [Artoolkit] Android Sample of nftSimple
结合:[Artoolkit] ARToolKit's SDK Structure on Android 重难点:aRBaseLib/, nftSimple/, libcpufeatures.a aRB ...
- iOS开发-- TFHpple抓取GB-2312编码的html页面,页面返回编码错误
今天用TFHpple解析html,发现老报错encoding error : input conversion failed due to input error, bytes I/O error ...
- jstat 简介
1. jstat -gc pid 可以显示gc的信息,查看gc的次数,及时间. 其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc ...
- node-sass 安装
设置 export ELECTRON_MIRROR="https://npm.taobao.org/mirrors/electron/" export SASS_BINARY_SI ...
- 移动APP项目总结
刚开始做这个项目,看着觉得内容不多,但细节问题很多,很多容易出错的地方, 如下: 项目效果 起初是这样做的 HTML: <div class="seller"> < ...
- log4j组件的用法(log4j1)
在实际的项目开发和维护中,日志是经常用到的一个内容.遇到问题的时候,经常需要通过日志去查出问题的所在并解决问题. 通常我们会用: System.out.println(xxx); 来打印运行中所需要的 ...
- LeetCode 29 - 两数相除 - [位运算]
题目链接:https://leetcode-cn.com/problems/divide-two-integers/description/ 给定两个整数,被除数 dividend 和除数 divis ...
- [No0000191]7种提高工作效率的Vim操作-Vim使用技巧(6)
Vim一直被认为是一种非常高效的文本编辑器,但是对于普通用户来说,很难在入门的时候就体会到Vim的所谓高效性. 本文介绍7种提高你工作效率和生产力的Vim使用技巧,主要集中在对某个文件范围内的特定目标 ...