随笔-ansible-4
触发器:

一个任务同时调用多个触发器:

为远程主机上的用户设置环境变量:

保存前一步命令的输出结果,并保存到foo中:

添加环境变量的另一种方式:

注意:lineinfile模块只适用于修改少量环境变量的情况。如果要修改大量的环境变量,请使用copy模块和模板。

如果任务量变多,或者环境变量变多,则需要在playbook中的var区块定义环境变量。


playbook中的变量:
ansible-playbook example.yml --extra-vars "foo=bar"
ansible-playbook example.yml --extra-vars "@even_more_vars.json"
ansible-playbook example.yml --extra-vars "@even_more_vars.yml"
vars.yml的格式如下:

顶格写。
ansible的内置环境变量,可以通过setup模块查看到。
使用场景:根据ansible的内置环境变量来判断如何执行。
为CentOS系统定义一个变量配置文件:apache_CentOS.yml,内容为apache: httpd
为Debian系统定义一个变量配置文件:apache_default.yml,内容为apache: apache2

在inventory文件中定义变量:【不建议这么做】


在group_vars目录下,按照组名创建文件,然后填写变量。
在host_vars目录下,按照主机名创建文件,然后填写变量。
注意:组名和主机名是根据/etc/ansible/hosts文件中的内容来的。
假如给app1.example.com这台主机设置一组变量,则需要先创建/etc/ansible/host_vars/app1.example.com文件,
然后将变量填写到里面即可。
在app1.example.com文件中填写内容如下:

假如给shanghai这组主机设置一组变量,则需要先创建/etc/ansible/group_vars/shanghai文件,然后将变量填写到里面即可。

注册变量:将操作的结果,包括标准输出和标准错误输出,保存到变量中,然后再根据这个变量的内容来决定下一步的操作。

数组变量或列表变量:

取值时,用python语法:
foo_list[0]
foo_list[1]
foo_list[2]
用jinja语法:
foo_list|first
/etc/ansible/group_vars/all文件:给所有组设置变量。
/etc/ansible/host_vars/all文件:给所有主机设置变量。
Facts信息:
在运行任何一个playbook之前,ansible默认会先抓取playbook中所指定的所有主机的系统信息。这些信息称为Facts。
ansible all -m setup
查看所有主机的系统信息
ansible db -m setup
只查看db组中主机的系统信息

收集系统信息是耗费时间的,如果想节省这笔时间,可以关闭收集功能。

关闭之后就收集不到信息了。
实际使用中,用的比较多的Facts变量有ansible_os_family、ansible_hostname、ansible_memtotal_mb,这些变量通常
当做when的判定条件。
在远程主机自定义facts变量:
在远程主机上创建/etc/ansible/facts.d/settings.fact文件,内容为:

然后在ansible服务端上执行:

通过filter=ansible_local参数,就得到了自定义的变量。
注意:在任何远程主机的/etc/ansible/facts.d/目录下可以创建任意*.fact文件,文件格式可以是JSON格式、ini格式,或者是一个返回
JSON的可执行文件。这种动态的自定义变量只能用于临时需求,还是推荐将各种变量定义在ansible服务器端上。
变量优先级:
1、命令行中用--extra-vars或-e定义的变量。
2、inventory中定义的关于连接的变量(比如ansible_ssh_user)。
3、命令行转换、play中的变量、included中的变量、role中的变量。
4、inventory中定义的其他变量。
5、facts变量。
6、role默认变量。
变量定义原则:
1、role中定义的变量应尽量合理。因为它是最后的一层保护门。其他门被攻破了,才会来找它。
2、尽量不要在Playbook中定义变量,而是通过引用变量文件来使用变量。
3、只有与主机强关联的变量才定义在inventory文件中。
4、尽量避免在命令行上使用-e选项来定义变量,除非是做测试。
jinja2的语法示例:
1 in [1, 2, 3]
'see' in 'can you see me'
foo is defined
如果jinja2不能满足要求,就用python的内置方法来补充。

变量注册器:
大部分情况下,使用变量注册器来接收shell命令的返回结果。结果中包含标准输出和标准错误输出。

my_command_result.stdout 标准输出的内容
my_command_result.stderr 标准错误输出的内容
when条件判断:
很多任务只有在特定条件下才执行。

只有在when条件满足时才会执行yum。
when语句和注册变量的结合。
判断一个应用的运行状态,并判断返回的状态值,状态为ready后,再执行下一步操作。


最后一个例子中,如果远程主机不存在/etc/hosts文件,就从ansible服务器端复制一份到远程主机。
这里使用的是stat模块,用于判断文件的状态。
changed_when 什么时候返回changed,如果不用这个,那么ansible将永远返回changed。(不管三七二十一,全部返回changed,加了changed_when后,需要满足条件才会返回changed)
failed_when 什么时候返回failed,也就是满足一定条件后才会返回failed。

当执行命令后,返回的结果中如果含有Nothing to install or update,说明已经有了,此时不会有危险。因为安装过了,所以不再变化,
因此返回的changed为false。
如果在里面,说明已经有了,暂时不用再管了。
如果不在里面,说明可以安装。安装之后,说明可以返回changed了。也就是说有条件地返回changed。

当import.stderr有内容时,且already exists不存在于其中,才算失败failed。
可以在相关任务中添加ignore_errors: true来屏蔽错误信息,以免不太重要的错误影响全局大业。但尽量少用,我们不能放任错误信息,
而应该解决问题。
任务委托:
比如给某台服务器发送通知或向监控服务器中添加被监控服务器。
使用delegate_to关键字便可以配置任务在指定的机器上执行,其他任务依旧按照hosts的规定。

如果想让一个任务在ansible服务器本地运行,可以委托给127.0.0.1,也可以用local_action来完成。


每隔10s检查一次主机webserver1上面的80端口是否开启,如果超过300s,80端口仍未开启,将返回失败信息。
这里使用的是wait_for模块。这里相当于是一个校验确保的措施,保证服务确实开启了,才去执行后面的步骤。
交互式提示
虽然有些值可以存储在文件中,但是有些用户的需求不一样,所以需要用户自己来填写。

给playbook中的部分任务打上标签,这样我们在执行时,可以有选择性地进行执行,而不是一股脑的全部执行。

只执行Notify on completion任务。(我们根据标签来)
ansible-playbook tags.yml --tags "say"
我们这里是根据标签来挑选的。
跳过某些任务(也是根据标签名来跳过)
ansible-playbook tags.yml --skip-tags "notifications"
为每个任务添加合适的标签,在执行时就可以有选择性地执行,而不是全部执行。

在任务比较多时,可以适当添加标签,对于任务比较少的playbook,就不要添加较多的标签。
block块

根据when中的条件来决定使用哪个block。block将一组相关的任务组成一个块,这样就可以给它们统一设置参数了。
同时,不用给每个任务都单独设置when条件了。
块功能非常适用于多个任务共用一套任务参数的情况。
随笔-ansible-4的更多相关文章
- Ansible随笔8
自定义模块的开发模式 1.决定自定义模块的存放路径 编辑/etc/ansible/ansible.cfg文件,修改library = /usr/share/ansible/. 这样就告诉ansible ...
- Ansible playbook API 开发 调用测试
Ansible是Agentless的轻量级批量配置管理工具,由于出现的比较晚(13年)基于Ansible进行开发的相关文档较少,因此,这里通过一些小的实验,结合现有资料以及源码,探索一下Ansible ...
- ansible学习
声明:本博客内容是根据惨绿少年内容实践随笔,地址:http://www.cnblogs.com/clsn/p/7743792.html#comment_form 1.ansible介绍 Ansible ...
- Ansible 利用playbook批量部署mariadb
环境说一下 192.168.30.21 ansible 192.168.30.25 client1 192.168.30.26 client2 这里我的ansible环境已经部 ...
- Ansible实现zabbix服务器agent端批量部署
项目需求:由于搭建zabbix,需要每台服务器都需要安装监控端(agent)正常的的操作是一台一台去安装,这样确实有点浪费时间,这里为大家准备了一款开源 的自动化运维工具Ansible,相信大家也很熟 ...
- 利用ansible书写playbook搭建HAProxy+Keepalived+PXC负载均衡和高可用的PXC环境续
ansible.playbook.haproxy.keepalived.PXC haproxy+keepalived双主模式调度pxc集群 HAProxy介绍 反向代理服务器,支持双机热备支持虚拟主机 ...
- 如何利用ansible callback插件对执行结果进行解析
最近在写一个批量巡检工具,利用ansible将脚本推到各个机器上执行,然后将执行的结果以json格式返回来. 如下所示: # ansible node2 -m script -a /root/pyth ...
- AI人工智能系列随笔
初探 AI人工智能系列随笔:syntaxnet 初探(1)
- 【置顶】CoreCLR系列随笔
CoreCLR配置系列 在Windows上编译和调试CoreCLR GC探索系列 C++随笔:.NET CoreCLR之GC探索(1) C++随笔:.NET CoreCLR之GC探索(2) C++随笔 ...
- C++随笔:.NET CoreCLR之GC探索(4)
今天继续来 带大家讲解CoreCLR之GC,首先我们继续看这个GCSample,这篇文章是上一篇文章的继续,如果有不清楚的,还请翻到我写的上一篇随笔.下面我们继续: // Initialize fre ...
随机推荐
- 关于“Unknown or unsupported command 'install'”问题解决的小结
经常需要在COMMAND命令中安装第三方库,有时会碰到“Unknown or unsupported command 'install'”这种报错. 刚开始时,以为是环境变量里面没有配置:PYTHON ...
- 实现Comparator接口和Comparable接口,以及Map按value排序 ,map遍历
继承Comparator接口,重写compare()方法 import java.util.ArrayList; import java.util.Arrays; import java.util.C ...
- 2019 牛客多校第六场 D Move
题目链接:https://ac.nowcoder.com/acm/contest/886/D 题解摘自官方题解 题目大意 有 K 个体积相同的箱子,有 N 个体积相同或相异的物品,现要按照如下策略装箱 ...
- error C3867: “std::basic_string<char,std::char_traits<char>,std::allocator<char>>::c_str”: 函数调用缺少参数列表;请使用“&std::basic_string<char,std::char_traits<char>,std::allocator<char>>::c_str”创建指向成员的指针
这个问题找了很多没有找到满意的答案.仔细看了一下,是使用了c_str的问题. 我直接把使用string.c_str的地方使用char*代替即解决问题.
- ThinkPHP5验证码不显示的原因及解决方法
其实很久之前刚学习tp5框架的时候就遇到了这个问题,解决完后一直没再出过问题,今天用以前的框架做新项目时又碰到了这个问题,这里记录一下 问题原因: 1.TP5本就存在这个bug 2.数据库连接不正常( ...
- ajax中的onload和readychange区别
先补个知识点: readyState 状态码: 0:请求未初始化 1:服务器连接已建立 2:请求已接受 3:请求处理中 4:请求已完成,且响应已就绪 HTTP 状态码: 200 - 服务器成功返回网页 ...
- php的生命周期的概述
1. PHP是随着WEB服务器(apache)的启动而运行的: 2. PHP通过mod_php5.so()模块和服务器(apache)相连 3. PHP总共有三个模块:内核.Zend引擎.以及扩展层: ...
- Python学习笔记(八)——正则表达式
正则表达式 \d表示匹配一个数字 例如,1\d\d可以匹配以1开头的三位数字 \w可以匹配一个字母或者数字 例如,\d\w可以匹配12,1A等 .可以匹配任意字符 例如,py.表示pyc.pya等 * ...
- java zxing 生成条形码和二维吗
依赖 <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</art ...
- JUC 一 ReentrantLock 可重入锁
java.util.concurrent.locks ReentrantLock即可重入锁,实现了Lock和Serializable接口 ReentrantLock和synchronized都是可重入 ...