本节内容:

  • 迭代
  • 模板(JInjia2相关)
  • Jinja2相关

一、迭代

当有需要重复性执行的任务时,可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用,并通过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

另外,with_items中使用的元素还可以是hashes,例如:

- name: add several users
user: name={{ item.name }} state=present groups={{ item.groups }}
with_items:
- { name: 'testuser1', groups: 'wheel'}
- { name: 'testuser2', groups: 'root'}

【注意】:item是固定变量名。

二、模板(JInjia2相关)

假如为两台webserver安装httpd,而他们的配置文件,172.16.7.152上的httpd需要监听80端口,172.16.7.153需要监听8080端口,ServerName也是不一样的,所以我们就需要两个配置文件,这管理起来极为不便。

在这种情况下,我们可以考虑在配置文件中使用变量来定义。

[root@node1 ~]# mkdir templates
[root@node1 ~]# cp conf/httpd.conf templates/
[root@node1 ~]# mv templates/httpd.conf templates/httpd.conf.j2

后缀为j2表明是Jinja2模板。编辑这个模板:

[root@node1 ~]# vim templates/httpd.conf.j2

这个模板复制到每台主机上时都应该将这文件里的变量换成对应的值。这个模板就是Jinjia2模板。

设置每台主机使用的变量值:

[root@node1 ~]# vim /etc/ansible/hosts

当然这http_port和maxClients也可以在playbook中定义。但是那样我们没法区别每台主机使用不同的值了。因此我们要想让每个主机变量名相同但值不同时只能使用主机变量来定义。下面定义playbook:

[root@node1 ~]# vim apache.yml
- hosts: nginx
remote_user: root
vars:
- package: apache
tasks:
- name: install httpd package
yum: name={{ package }} state=latest
- name: install configuration file for httpd
template: src=/root/conf/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
- name: start httpd service
service: enabled=true name=httpd state=started
handlers:
- name: restart httpd
service: name=httpd state=restarted

[root@node1 ~]# ansible-playbook apache.yml 

执行完成后,去查看两个节点的配置文件,发生变量都被替换了。

三、Jinja2相关

1. 字面量

表达式最简单的形式就是字面量。字面量表示诸如字符串和数值的Python对象。下面的字面量是可用的:

(1)字符串:“Hello World”

双引号或单引号中间的一切都是字符串,无论何时你需要在模板中使用一个字符串(比如函数引用、过滤器或只是包含或继承一个模板的参数),它们都是有用的。

(2)整数和浮点数:42 / 42.23

直接写下数值就可以创建整数和浮点数。如果有小数点,则为浮点数,否则为整数。在Python里,42和42.0是不一样的。

(3)列表:['list', 'of', 'object']

一对中括号括起来的东西是一个列表。列表用于存储和迭代序列化的数据。例如你可以容易地在for循环中用列表和元组创建一个链接的列表:

<ul>
{% for href, caption in [('index.html', 'Index'), ('about.html', 'About'), ('download.html', 'Downloads')] %}
<li><a href="{{ href }}">{{ caption }}</a></li>
{% end for %}
</ul>

(4)元组:('tuple', 'of', 'values')

元组和列表类似,只是不能修改里面的元素。如果元组中只有一项,你需要使用逗号结尾它。元组通常用于表示两个或更多元素的项。

(5)字典:{'dict': 'of', 'key': 'and', 'value': 'pairs'}

Python中的字典是一种关联键和值的结构。键必须是唯一的,并且键必须只有一个值。

(6)Boolen:true / false

2. 算术运算

Jinja2允许你用计算值。这在模板中很少使用,但为了完整性允许其存在,支持下面的运算符:

+ 把两个对象加到一起,通常对象是整数或浮点数,但是如果两者是字符串或列表,你可以用这种方式来连接它们。无论如何这不是首选的连接字符串的方式。{{  +  }}等于2。

- 用第一个数减去第二个数,{{  -  }}等于1.

/ 对两个数做除法,返回值会是一个浮点数。{{  /  }}等于{{ 0.5 }}。

// 对两个手做除法,返回整数商,{{ 20 / 7 }}等于2。

% 计算整数除法的余数。{{   %  }}等于4。

* 用右边的数乘左边的操作数。{{  *  }}会返回4,也可以用于重复一个字符串多次,{{ '=' *  }}会打印80个等号的横条。

** 取左操作数的右操作数次幂,{{ ** }}会返回8。

3. 比较操作符

== 比较两个对象是否相等。
!= 比较两个对象是否不等。
> 如果左边大于右边,返回true。
< 如果左边小于右边,返回true。
>= 如果左边大于等于右边,返回true。
<= 如果左边小于等于右边,返回true。

Ansible之迭代、模板的更多相关文章

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

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

  2. Ansible之templates模板

    一.jinja2简介解 Jinja2是Python下一个被广泛应用的模版引擎,他的设计思想来源于Djanjo的模板引擎,并扩展了其语法和一系列强大的功能.ansible的模板配置文件就是用jinja2 ...

  3. 5.Ansible Jinja2 模板

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

  4. ansible jinja2模板概述

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

  5. Ansible Jinja2 模板

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

  6. Ansible Jinja2 模板使用

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

  7. ansible学习(二)

    什么是YAML? YAML是一种标记语言.适合用来表达层次结构式的数据结构. YAML的基本组件:清单(短杠——空白字符)和散列表(短杠+空白字符分隔key:value对). Playbook的核心元 ...

  8. ansible的基础使用(一)

    ansible基础使用(一) ansible的主要功能 A:为什么是ansible B:ansible的安装 C:ansible的相关文件 D:ansible的基本使用 ansible的简单操作 A: ...

  9. Ansible_使用jinja2模板部署自定义文件

    一.jinja2简介 1.jinja2模板 1️⃣:Ansible将jinja2模板系统用于模板文件,Ansible还使用jinja2语法来引用playbook中的变量 2️⃣:变量和逻辑表达式置于标 ...

随机推荐

  1. Java入门:基础算法之计算园的面积

    本部分内容介绍如何使用Java计算圆的周长和面积.分两种方法来实现: 1)圆的半径由用户输入 2)圆的半径由程序指定 代码1: /** * @作者: 理工云课堂 * @描述: 用户输入圆的半径,程序结 ...

  2. Java基础-日期格式化DateFormat类简介

    Java基础-日期格式化DateFormat类简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.DateFormat类概述 DateFormat 是日期/时间格式化子类的抽象 ...

  3. IOS的__bridge

    使用 __bridge 关键字来实现id类型与void*类型的相互转换.看下面的例子. id obj = [[NSObject alloc] init]; void *p = (__bridge vo ...

  4. jquery validate 增加过滤特殊字符的方法

    jQuery.validator.addMethod("specialCharFilter", function(value, element) { var pattern = n ...

  5. zz图像卷积与滤波的一些知识点

    Xinwei: 写的通俗易懂,终于让我这个不搞CV.不搞图像的外行理解卷积和滤波了. 图像卷积与滤波的一些知识点 zouxy09@qq.com http://blog.csdn.net/zouxy09 ...

  6. python学习笔记3-函数,判断负小数

    一.函数 def hello(file_name,content): #形参file_name content f=open(file_name,'a+') f.seek(0) f.write(con ...

  7. JAVA多线程提高十四: 面试题

    前面针对多线程相关知识点进行了学习,那么我们来来看看常见的面试题: 1. 空中网面试题1 package com.kongzhongwang.interview; import java.util.c ...

  8. 20155331 2016-2017-2 《Java程序设计》第6周学习总结

    20155331 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 输入/输出基础 很多实际的Java应用程序不是基于文本的控制台程序.尽管基于文本的程序作为教 ...

  9. 【Linux 命令】iftop安装与简单使用

    iftop是linux下的一个流量监控工具,用于查看实时网络流量,反向解析IP,显示端口信息官网:http://www.ex-parrot.com/~pdw/iftop/ 1.安装必须软件包 yum ...

  10. ASP.NET 网站部署到IIS上如何进行调试

    1:在一个网站成功部署后,有可能会遇到一些错误,但是又不能直接看出错误源(如果能在源程序里下断点进行调试就好了,这样就能准确的找出错误代码),下面介绍如何在一个已经部署的网站上进行断点调试(前提有网站 ...