使用场景

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进阶模板和角色使用的更多相关文章

  1. ansible jinja2模板概述

    目录 ansible jinja2模板概述 ansible jinja2模板使用 基本语法 jinja2模板逻辑判断 ansible jinja2管理nginx ansible jinja2管理kee ...

  2. Ansible Jinja2 模板使用

    Ansible Jinja2 模板使用.语法与使用案例 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放: ...

  3. devops工具-Ansible进阶playbook&roles

    一.playbook介绍     playbook 是 Ansible 管理配置.部署应用的核心所在,一个playbook由有多“play组成”,而一个play实际就是一个task,每个task是由多 ...

  4. Ansible进阶

    YAML YAML简介 YAML是一个可读性高,并用来表达资料序列的格式.YAML参考了其它多种语言,包括:XML.C语言.Python.Perl以及电子邮件格式RFC2822等 它是一种直观的能够被 ...

  5. Ansible进阶--playbook的使用

    一.什么是playbooksplaybooks是ansible的脚本.如同shell脚本一样,它是控制远程主机的一系列命令的集合,通过YAML语言编写.执行一些简单的任务,我们可以使用ad-hoc命令 ...

  6. 5.Ansible Jinja2 模板

    1.jinja2渲染NginxProxy配置文件 jinja2 房屋建筑设计固定的 jinja2模板与Ansible关系 Ansible如何使用jinja2模板 template模块 拷贝文件? te ...

  7. Ansible Jinja2 模板

    1.jinja2渲染NginxProxy配置文件 jinja2 房屋建筑设计固定的? jinja2模板与Ansible关系 Ansible如何使用jinja2模板 template模块 拷贝文件? t ...

  8. C++进阶--模板及关键字typename

    //############################################################################ /* * 模板介绍 */ //函数模板 t ...

  9. Ansible 进阶技巧

    原文  http://www.ibm.com/developerworks/cn/linux/1608_lih_ansible/index.html?ca=drs-   简介 Ansible 是一个系 ...

随机推荐

  1. memcpy in place 数组内拷贝

    首先看一段代码 #include <stdio.h> #include <pthread.h> int main(){ ]; ; ; i++) { t1[i] = i; pri ...

  2. [Android] 基于 Linux 命令行构建 Android 应用(四):命令行构建

    谷歌提供的 Android SDK 支持 Ant 自动构建[1],你可以使用调试和发行两种模式进行构建,两种模式不同之处在于调试模式 Ant 会调用内置的调试密钥,而发行模式调用你提供的私钥. 首先安 ...

  3. DevExpress MemoEdit定位到末尾

    1: /// <summary> 2: /// 追加文本到MemoEdit中 3: /// </summary> 4: /// <param name="mem ...

  4. Jenkins和Sonar集成

    Jenkins可以通过插件的形式和Sonar很好的集成. (1)Jenkin安装Sonar插件(这里我估计安装的插件有点多) 注意:之前安装Jenkins的时候我用的是JDK系统环境环境变量jdk1. ...

  5. JMS规范概览

    JMS(java message service)常用的消息模式有两种:点对点(PTP)和订阅发布(Pub/Sub) Clients A 和 B是消息生产者,以两种不同的目的地向Clients C, ...

  6. A - Wall

    Once upon a time there was a greedy King who ordered his chief Architect to build a wall around the ...

  7. H - Being a Good Boy in Spring Festival

    一年在外 父母时刻牵挂 春节回家 你能做几天好孩子吗 寒假里尝试做做下面的事情吧 陪妈妈逛一次菜场 悄悄给爸爸买个小礼物 主动地 强烈地 要求洗一次碗 某一天早起 给爸妈用心地做回早餐 如果愿意 你还 ...

  8. win10 开启蓝 由于其配置信息(注册表中的)不完整或已损坏

    在管理员命令提示符下键入以下命令: Dism /Online /Cleanup-Image /ScanHealth 这条命令将扫描全部系统文件并和官方系统文件对比,扫描计算机中的不一致情况. Dism ...

  9. Android开发-基本概念(申明:来源于网络)

    Android开发-基本概念(申明:来源于网络) 地址:http://blog.csdn.net/iwanghang/article/details/53505926

  10. Flask----基础

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...