一、Ansible条件测试

在ansible中还可以进行条件测试。如果需要根据变量、facts或此前任务的执行结果来做为某task执行与否的前提时要用到条件测试。

1. when语句

在task后添加when子句即可使用条件测试:when语句支持Jinja2表达式语法。例如:

tasks:
- name: "shutdown Debian flavored systems"
command: /sbin/shutdown -h now
when: ansible_os_family == "Debian"

when语句还可以使用Jinja2的大多“filter”,例如要忽略此前某语句额错误并基于其结果(failed或success)运行后面指定的语句,可使用类似如下形式:

tasks:
- command: /bin/false
register: result
ignore_errors: True
- command: /bin/sonmething
when: result|failed
- command: /bin/something_else
when: result|success
- command: /bin/still/something_else
when: result|skipped

此外,when语句还可以使用facts或playbook中定义的变量。facts就是主机报告上来的变量。比如:

二、迭代

当有需要重复性执行的任务时,可以使用迭代机制。其使用格式为将需要迭代的内容定义为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允许你用计算值。这在模板中很少使用,但为了完整性允许其存在,支持下面的运算符:

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

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

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

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

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

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

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

3. 比较操作符

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

五、tags介绍

我们每次改完配置文件,比如上一篇博客中的的apache.yml,没必要把整个playbook都运行一遍,只需要运行改变了的task。我们可以给task一个标签,运行playbook时明确只运行这个标签对应的task就可以了。多个任务可以使用同一个tags。

如果在某次运行中,我们多次运行同一个playbook,第一次运行时我们期望所有的tasks都运行,第二次运行时我们期望只运行某一个task,你可以给这个task定义一个tags,例如:

[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
tags:
- 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 --tags="conf"

如果一个playbook中有多个tags,但是有个tag你不想跑,可以使用--skip-tags。

ansible入门五的更多相关文章

  1. Ansible 入门指南 - ansible-playbook 命令

    上篇文章Ansible 入门指南 - 安装及 Ad-Hoc 命令使用介绍的额是 Ad-Hoc 命令方式,本文将介绍 Playbook 方式. Playbook 译为「剧本」,觉得还挺恰当的. play ...

  2. openresty 前端开发入门五之Mysql篇

    openresty 前端开发入门五之Mysql篇 这章主要演示怎么通过lua连接mysql,并根据用户输入的name从mysql获取数据,并返回给用户 操作mysql主要用到了lua-resty-my ...

  3. Thinkphp入门 五 —模型 (49)

    原文:Thinkphp入门 五 -模型 (49) [数据库操作model模型] model  模型  数据库操作 tp框架主要设计模式:MVC C:controller   控制器   shop/Li ...

  4. DevExpress XtraReports 入门五 创建交叉表报表

    原文:DevExpress XtraReports 入门五 创建交叉表报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的,为了帮助更多的人不会像我这样浪 ...

  5. [转帖]Ansible 入门秘诀

    Ansible 入门秘诀 作者: Jose Delarosa 译者: LCTT jdh8383 | 2019-03-08 09:24   收藏: 2 用 Ansible 自动化你的数据中心的关键点. ...

  6. 脑残式网络编程入门(五):每天都在用的Ping命令,它到底是什么?

    本文引用了公众号纯洁的微笑作者奎哥的技术文章,感谢原作者的分享. 1.前言   老于网络编程熟手来说,在测试和部署网络通信应用(比如IM聊天.实时音视频等)时,如果发现网络连接超时,第一时间想到的就是 ...

  7. Ansible 入门指南 - 学习总结

    概述 这周在工作中需要去修改 nginx 的配置,发现了同事在使用 ansible 管理者系统几乎所有的配置,从数据库的安装.nginx 的安装及配置.于是这周研究起了 ansible 的基础用法.回 ...

  8. C#基础入门 五

    C#基础入门 五 递归 递归调用:一个方法直接或间接地调用了它本身,就称为方法的递归调用. 递归方法:在方法体内调用该方法本身. 递归示例 public long Fib(int n) { if(n= ...

  9. ansible入门一(Ansible介绍及安装部署)

    本节内容: 运维工具 Ansible特性 Ansible架构图和核心组件 安装Ansible 演示使用示例 一.运维工具 作为一个Linux运维人员,需要了解大量的运维工具,并熟知这些工具的差异,能够 ...

随机推荐

  1. HomeBrew的安装详细步骤

    1)终端输入:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master ...

  2. JVM调优之Java进程消耗CPU过高

    JVM调优之Java进程消耗CPU过高 查找问题思路 1.查看cpu使用率,发现有线程cpu占用率很高  tops 咱们拿18092线程举例示范 2.查询pid对应的进程 ps -ef|grep 18 ...

  3. Winter-1-A A + B 解题报告及测试数据

    Time Limit:1000MS Memory Limit:32768KB Description Calculate A + B. Input Each line will contain two ...

  4. Web Servlet的体系架构

    Servlet为根接口,里面有5个方法,init() servlet初始化,将ServletConfig作为参数传入,service() 响应请求,destroy() 销毁servlet,getSer ...

  5. Druid学习之路 (一)Druid初识

    作者:Syn良子 出处:https://www.cnblogs.com/cssdongl/p/9588079.html 转载请注明出处 最近在学习和使用Druid.觉得一些章节有必要按照自己的理解翻译 ...

  6. iOS 截屏,openGL ES 截图,以及像素颜色判断

    代码整理了2种截图,类似.(没苹果自带那种截图彻底) 方法一: +(UIImage *)fullScreenshots{ UIWindow *screenWindow = [[UIApplicatio ...

  7. JS正则表达式从入门到入土(3)—— 范围类

    范围类 在使用正则表达式时,很多时候,我们会想要匹配a~z的所有字母,很多人想到,可以使用字符类[abcdefg...z],但是,这种方法需要输入所有需要匹配的字母.那么,有没有简单点的方法呢? 所幸 ...

  8. php 安装Memcache扩展

    转载地址:http://www.tuicool.com/articles/EB3imm 文章概述:由于当前机器安装的php,是用yum安装,现在需要使用到memadmin做一些监控, memadmin ...

  9. 20145329 《Java程序设计》实验一总结

    实验指导教师:娄嘉鹏老师 实验日期:2016.4.8 实验时间:16:30~18:30 实验序号:实验一 实验名称:Java开发环境的熟悉 实验目的与要求: 使用JDK编译.运行简单的Java程序. ...

  10. RabbitMQ脑裂

    在RabbitMQ3.4.x中会出现脑裂的现象,本文通过实验验证此脑裂现象,愿小伙伴们少走弯路. Preview 网上有两篇帖子(需要FQ) https://groups.google.com/for ...