一、 模板Templates

  • 文本文件,嵌套有脚本(使用模板编程语言编写)
  • Jinja2语言,使用字面量,有下面形式

    字符串:使用单引号或双引号

    数字:整数,浮点数

    列表:[item1, item2, ...]

    元组:(item1, item2, ...)

    字典:{key1:value1, key2:value2, ...}

    布尔型:true/false
  • 算术运算:+, -, *, /, //, %, **
  • 比较操作:==, !=, >, >=, <, <=
  • 逻辑运算:and, or, not
  • 流表达式:For If When

1. templates功能

根据模块文件动态生成相应的配置文件
  • templates文件必须存放于templates目录下,且命名为 .j2 结尾
  • ymal/yml 文件需要和templates目录平级,目录结构如下:
./
├── temnginx.yml
└── templates
└── nginx.conf.j2

templates示例

利用templates 同步nginx配置文件
    //准备templates/nginx.conf.j2文件,就是nginx配置文件  加后缀`.j2`
vim temnginx.yml
---
- hosts: webServer
remote_user: root tasks:
- name: template config to remote hosts
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf ansible-playbook temnginx.yml
    //playbook中template变更替换
//修改文件nginx.conf.j2 下列内容:
worker_processes {{ ansible_precessor_vcpus*2 }}; //在配置文件模板里加变量 ,可以根据远程主机的属性不同,值也不同 //再次执行temnginx.yml
ansible-playbook temnginx.yml

2. Playbook中template算术运算

vim nginx.conf.j2

    worker_processes  {{  ansible_precessor_vcpus*2 }};
worker_processes {{ ansible_precessor_vcpus+2 }}; //最后的值会根据机器不同得到的变量不同,然后再进行计算

3. Playbook中的when

条件测试

如果需要根据变量、facts或此前任务的执行结果来做为某task执行与否的前提时要用到条件测试,通过when语句实现,在task中使用,jinja2的语法格式在task后添加when子句即可使用条件测试;when语句支持Jinja2表达式语法
//当setup模块中ansible_os_family等于RedHat时执行关机
tasks:
- name: shutdown redhat system
command: /sbin/shutdown -h now
when: ansible_os_family == 'RedHat' //根据系统版本来安装软件
tasks:
- name: install nginx to centos7
yum: name=nginx
when: ansible_distribution_major_version == '7'
- name: install httpd to centos6
yum: name=httpd
when: ansible_distribution_major_version == '6'

1. 迭代:with——items

迭代:当需要重复性执行任务时,可以使用迭代机制
  • 对迭代项的引用,固定变量名为" item "
  • 要在task中使用with_items给定要迭代的元素列表
  • 列表格式: 字符串,字典
//示例:
- name: add several users
user: name={{ item }} state=present groups=wheel
with_items:
- testuser1
- testuser2
//上面语句的功能等同于下面的语句:
- name: add user testuser1
user: name=testuser1 state=present groups=wheel
- name: add user testuser2
user: name=testuser2 state=present groups=wheel //拷贝多个文件到被控端
- hosts: webServer
remote_user: root
tasks:
- name: copy file
copy: src={{ item }} dest=/tmp/{{ item }}
with_items:
- file1
- file2
- file3
- name: yum install httpd
yum: name={{ item }} state=present
with_items:
- apr
- apr-util
- httpd

迭代嵌套子变量

    - hosts:webServer
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 //嵌套子变量,格式为:item.with_items的列表中的键名
with_items:
- { name: 'user1', group: 'group1' } //最外层{} 是键值对的语法,里面有2个键值对,用逗号,分隔。
- { name: 'user2', group: 'group2' }
- { name: 'user3', group: 'group3' }

4. Playbook中 template 的 for循环

//语法:
{% for i in nginx_vhosts %}
语句块
{% endfor %} {% if vhost.root is defined %}
root {{ vhost.root }};
{% endif %}

示例1

// temnginx.yml
---
- hosts: webServer
remote_user: root
vars:
nginx_vhosts:
- listen: 8080 //templates/nginx.conf.j2
{% for vhost in nginx_vhosts %}
server{
listen {{ vhost.listen}}
} {% endfor%} //生成结果
server {
listen 8080
}

示例2

// temnginx.yml
---
- hosts: webServer
remote_user: root
vars:
nginx_vhosts:
- web1
- web2
- web3
tasks:
- name: template config
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf // templates/nginx.conf.j2
{% for vhost in nginx_vhosts %}
server {
http{
server_name {{ vhost }}
}
}
{% endfor %} //生成的结果:
server {
http{
server_name web1
}
}
server {
http{
server_nameweb2
}
}
server {
http{
server_name web3
}
}

示例3

// temnginx.yml
---
- hosts: webServer
remote_user: root
vars:
nginx_vhosts:
- web1:
listen: 8080
server_name: "web1.test.com"
root: "/var/www/nginx/web1/"
- web2:
listen: 8080
server_name: "web2.test.com"
root: "/var/www/nginx/web2/"
- web3:
listen: 8080
server_name: "web3.test.com"
root: "/var/www/nginx/web3/“
tasks:
- name: template config
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf // templates/nginx.conf.j2
{% for vhost in nginx_vhosts %}
server {
listen {{ vhost.listen }}
server_name {{ vhost.server_name }}
root {{ vhost.root }}
}
{% endfor %}
生成结果:
server {
listen 8080
server_name web1.test.com
root /var/www/nginx/web1/
}
server {
listen 8080
server_name web2.test.com
root /var/www/nginx/web2/
}
server {
listen 8080
server_name web3.test.com
root /var/www/nginx/web3/
}

5. Playbook中template的 if 判断

    增加一个if判断,排除一些特定的情况,然后输出不同配置
//语法
{% if i is defined %}
//判断后执行的内容
{% endif %}

示例:

// temnginx.yml
---
- hosts: webServer
remote_user: root
vars:
nginx_vhosts:
- web1:
listen: 8080
root: "/var/www/nginx/web1/"
- web2:
listen: 8080
server_name: "web2.test.com"
root: "/var/www/nginx/web2/"
- web3:
listen: 8080
server_name: "web3.test.com"
root: "/var/www/nginx/web3/" tasks: // templates/nginx.conf.j2 {% for vhost in nginx_vhosts %}
server{
listen {{ vhost.listen }} {% if vhosts.server_name is defined %} server_name {{ vhost.server_name }} {% endif %} root {{ vhost.root }}
}
{% endfor %} server{
listen 8080 root /var/www/nginx/web1
} server{
listen 8080 server_name web2.test.com root /var/www/nginx/web2
}
server{
listen 8080 server_name web3.test.com root /var/www/nginx/web3
}

二、 Roles

1. roles简介

ansible 自1.2版本引入的新特性,用于层次性,结构化地组织 playbook 。 roles 能够根据层次型结构不自动装载变量文件、 tasks 以及 handlers 等。要使用 roles 只需要在 playbook 中使用 include 指令即可。
简单来讲, roles 就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷的 include 它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。

在复杂的场景中,建议使用roles,代码复用度高。

2. roles创建步骤

1、创建以 roles 命名的目录。

2、在 roles 目录中分别创建以各角色名称命名的目录,如 webServer 等

3、在每个角色命名的目录中分别创建 files,handlers、meta、tasks、templates 和 vars 目录

4、在 playbook 文件中,调用各自角色

3. Ansible Roles 目录编排结构

├── roles                                   // 必须是这个名字
│ ├── git // 具体项目名称
│ │ ├── default // 设定默认变量时使用此目录中的main.yml文件
│ │ │ └── main.yml // 至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
│ │ ├── files // 存放有copy或script模块等调用的文件
│ │ ├── handlers // 定义触发器
│ │ │ └── main.yml // 至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
│ │ ├── meta // 定义当前角色的特殊设定及其依赖关系
│ │ │ └── main.yml // 至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
│ │ ├── tasks // 定义task,role的基本元素
│ │ │ └── main.yml // 至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
│ │ ├── templates // template模块查找所需要模板文件目录
│ │ │ └── main.yml // 至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
│ │ └── vars // 定义变量;;其他的文件需要在此文件中通过include进行包含
│ │ └── main.yml // 至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含

roles示例:

webServer.yml
mysqlServer.yml
roles/
webservers/
files/
templates/
tasks/
handlers/
vars/
meta/
mysqlservers/
files/
templates/
tasks/
handlers/
vars/
meta/

4. Playbook调用角色的方法

方法一:

    - hosts: webServer
remote_user: root
roles:
- mysqlserver
- webserver

方法二:

传递变量给角色
    - hosts:
remote_user:
roles:
- mysqlserver
- { role: nginx, username: nginx }
//键role用于指定角色名称,后续key:value用于传递变量给角色
//也可以基于条件测试实现角色调用
roles:
- { role: nginx, username: nginx, when: ansible_distribution_major_version == '7'}

5. 完整的roles架构

//nginx-role.yml
--- - host: testweb
remote_user: root roles:
- role: nginx // nginx为 roles目录下的任务角色目录的 名字
- role: httpd //可执行多个role // roles/nginx/tasks/main.yml
--- - include:groupadd.yml
- include:useradd.yml
- include:install.yml
- include:restart.yml
- include:filecp.yml
# 顺序不能颠倒,执行顺序是从上往下执行的。 //roles/nginx/tasks/groupadd.yml
--- - name: add group nginx
user: name=nginx state=present
# 创建组 // roles/nginx/tasks/filecp.yml
--- - name:file copy
copy: src=test.conf dest=/tmp/test.conf
#复制配置文件 //以下文件格式类似:
useradd.yml、install.yml、restart.yml ls roles/nginx/files/
test.conf

6. roles playbook tags使用

ansible-playbook --tags="nginx,httpd,mysql" nginx-role.yml
// nginx-role.yml
---
- hosts: testweb
remote_user: root
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 }

推荐资料

http://galaxy.ansible.com

http://github.com/

http://ansible.com.cn/

https://github.com/ansible/ansible

https://github.com/ansible/ansible-examples

自动化运维工具——ansible模板与roles(四)的更多相关文章

  1. 自动化运维工具-Ansible之6-Jinja2模板

    自动化运维工具-Ansible之6-Jinja2模板 目录 自动化运维工具-Ansible之6-Jinja2模板 Ansible Jinja2模板概述 Ansible Jinja2模板使用 Ansib ...

  2. 自动化运维工具-Ansible之7-roles

    自动化运维工具-Ansible之7-roles 目录 自动化运维工具-Ansible之7-roles Ansible Roles基本概述 Ansible Roles目录结构 Ansible Roles ...

  3. 自动化运维工具-Ansible之1-基础

    自动化运维工具-Ansible之1-基础 目录 自动化运维工具-Ansible之1-基础 Ansible 基本概述 定义 特点 架构 工作原理 任务执行模式 命令执行过程 Ansible 安装 Ans ...

  4. CentOS7Linux中自动化运维工具Ansible的安装,以及通过模块批量管理多台主机

    使用自动化运维工具Ansible集中化管理服务器 Ansible概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具.它用Python写成,类似于saltstack和Puppet ...

  5. 在CentOS7.6上安装自动化运维工具Ansible以及playbook案例实操

    前言 Ansible是一款优秀的自动化IT运维工具,具有远程安装.远程部署应用.远程管理能力,支持Windows.Linux.Unix.macOS和大型机等多种操作系统. 下面就以CentOS 7.6 ...

  6. 自动化运维工具Ansible详细部署 (转载)

    自动化运维工具Ansible详细部署 标签:ansible 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://sofar.blog. ...

  7. 自动化运维工具Ansible详细部署 - 人生理想在于坚持不懈 - 51CTO技术博客

    自动化运维工具Ansible详细部署 - 人生理想在于坚持不懈 - 51CTO技术博客 自动化运维工具Ansible详细部署

  8. 自动化运维工具Ansible介绍

    一个由 Python 编写的强大的配置管理解决方案.尽管市面上已经有很多可供选择的配置管理解决方案,但他们各有优劣,而 ansible 的特点就在于它的简洁. 让 ansible 在主流的配置管理系统 ...

  9. 自动化运维工具-Ansible基础

    目录 自动化运维工具-Ansible基础 什么是Ansible 同类型软件对比 Ansible的功能及优点 Ansible的架构 Ansible的执行流程 安装Ansible ansible配置文件 ...

随机推荐

  1. C#中常用的字符串验证

    using System; using System.Text.RegularExpressions; namespace Util { public static class @string { # ...

  2. GCC的内存边界对齐

      GCC有三种影响内存对齐的开关:           首先是命令行参数 –fpack_struct=n (n只可以是1,2,4,8等2的幂,而且要小于平台默认的对齐字节数,否则不会生效)      ...

  3. Spring Cloud config中,使用数据库存储配置信息

    主要内容 在springcloud config中,使用数据库存储配置信息. 系统默认采用git的方式,此处我们介绍使用jdbc的方式存储配置信息 准备数据库 数据库我们使用mysql. 新建库 p- ...

  4. jQuery实现加载中效果,防止重复提交

    //导出表格加载中的提示var dian=0;//控制'●'的个数var t=null;//停止时使用function id_loadspot(loadspotSpan,loadingDiv,expo ...

  5. 分享到qq空间等代码

    <!-- Baidu Button BEGIN --><div id="bdshare" class="bdshare_t bds_tools get- ...

  6. 锁问题与线程queue

    一.同步锁 1.join与互斥锁 线程抢的是GIL锁,GIL锁相当于执行权限,拿到执行权限后才能拿到互斥锁Lock,其他线程也可以抢到GIL,但如果发现Lock仍然没有被释放则阻塞,即便是拿到执行权限 ...

  7. Remote System Explorer Operation在eclipse后台一直跑 解决办法

    在用eclipse开发时,经常遇到卡死的情况,其中一种就是右下角出现:“Remote System Explorer Operation”,解决方案如下: 第一步:Eclipse -> Pref ...

  8. javascript设计模式之中介者模式

    /* * 小游戏演示中介者模式 * Home 按键 1 * Guest 按键 0 * 半分钟内看谁按下的次数多 * * 参与的对象: * 玩家 * 计分板 * 中介者 * * 中介者模式使对象之间松耦 ...

  9. centOS7虚拟机和本机ping通

    1.配置centOS虚拟机网卡 先设置桥接模式 此处的address要和本机的vmware在同一个网段 2.重启centOS网卡 3.关闭本机和虚拟机防火墙,防止ping不通 centOS命令: fi ...

  10. [QualityCenter]设置工作流脚本-根据某字段是否包含指定字符串来判断其他字段的选值

    需求:当在创建或更改值时,自动判断A字段是否包含B值,然后自动填写相应的内容. 如以下例子: 在脚本编辑器新建一个函数TestPlan_Test_New,然后编写脚本如下: '通过主题判断项目内容   ...