ansible的两种命令执行方式 : ad-hoc / playbook以及通过setup模块获取系统参数
一.什么是ad-hoc和playbook
ad-hoc : 如果我们敲入一些命令去快速的完成一些操作,而不需要将这些执行过的命令刻意保存下来,这样的命令就叫做as-hoc命令,这里不做过多赘述.
playbook : 简单的说,playbook是一种简单的配置管理系统与多机器部署系统的基础.与现有的其它系统有不同之处,且非常适用于复杂的应用部署.playbook可适用于声明配置,更强大的地方在于playbook中可以编排有序的执行过程,甚至于做到在多组机器间来回有序的执行特别指定的步骤,并且可以同步或异步的发起任务,playbook的文件通常以.yaml或.yml结尾,文件中的数据以字典(key:value)或数组([ ]或-)的形式存在.
二.playbook的命令格式及主要参数
anshible-playbook -h
Usage: ansible-playbook [options] playbook.yml [playbook2 ...] -C, --check # 检查但是不会真的执行
-f FORKS, --forks=FORKS # 并发,默认是5个
--list-hosts #列出匹配的主机
--syntax-check # 检查语法
三.playbook中的关键字
hosts
tasks
name
register
handlers 正常情况下不会被执行
when 条件判断
with_items 循环执行,不管多少循环,都是item
notify 触发handlers 定义的任务
tags 标签
vars 参数
示例 : 将本机上/etc/fstab文件复制到web组中所有主机的/tmp/fs目录下
- hosts: web #指定目标组(在hosts文件中定义的分组)
remote_user: root #在目标主机上执行时的用户身份
tasks:
- name: copyfile #为操作命名
copy: src=/etc/fstab dest=/tmp/fs #指定使用的模块,对应要进行的操作
四.playbook的特性
1.playbook是支持多任务的,但这些任务会按顺序执行,即第一个任务所有机器都执行完,才会执行第二个任务.
示例 :
- hosts: web
remote_user: root
tasks:
- name: copyfile #任务一
copy: src=/etc/fstab dest=/tmp/fs
- name: createuser #任务二
user: name=alex11
执行结果:
PLAY [web] *********************************************************************************************************** TASK [Gathering Facts] *********************************************************************************************** #收集信息
ok: [192.168.169.131]
ok: [192.168.169.136] TASK [copyfile] ****************************************************************************************************** #先依次执行copyfile任务
changed: [192.168.169.136]
changed: [192.168.169.131] TASK [createuser] **************************************************************************************************** #再执行createuser任务
changed: [192.168.169.136]
changed: [192.168.169.131] PLAY RECAP *********************************************************************************************************** #所有变动
192.168.169.131 : ok=3 changed=2 unreachable=0 failed=0
192.168.169.136 : ok=3 changed=2 unreachable=0 failed=0
2.幂等性,即不管执行多少次,等到的结果永远是一样的.
幂等性参考 : https://www.jianshu.com/p/ccfd13191cf0
五.playbook的五种传参方式
1.通过-e向.yaml文件中传入参数
-e EXTRA_VARS, --extra-vars=EXTRA_VARS
set additional variables as key=value or YAML/JSON, if filename prepend with @
- hosts: web
tasks:
- name: create{{user}} #基于jinja2的引用方式,用双大括号
user: name={{user}}
ansible-playbook -e user=xiaohua 1.yml #执行时使用-e传入参数
2.在hosts文件中ip地址后边写入参数,唯一一种可以设置不同参数的方式
10.0.0.[132:133] user=xiaohua
10.0.0.135 user=xiaohua2
ansible-playbook p1.yml #执行方式
3.在host文件里面写[web:vars]
[web:vars]
user=xiaohua
ansible-playbook p1.yml #执行方式
4.在playbook文件里面写vars
- hosts: web
vars: #指定user
- user: xiaohua
tasks:
- name: create{{user}}
user: name={{user}}
5.register 取值
- hosts: web
tasks:
- name: yumbc
yum: name=bc
- name: sum #定义一个新的任务
shell: echo 8+9|bc #得到一个数字
register: user #注册并命名为user
- name: echo
shell: echo {{user}} >/tmp/sum.txt #查看user的结构
- name: createuser{{user.stdout}} #通过点方法取出想要的内容
user: name=xiaohua{{user.stdout}}
*传参方式优先级 : -e传参 > playbook中的vars > hosts文件
六.通过setup模块获取系统参数
执行命令 : ansible all -m setup|more #获取所有hosts中所有绑定过的主机信息
ansible localhost -m setup|more #获取本地主机的系统参数
ansible_all_ipv4_addresses # 所有的ipv4地址
ansible_all_ipv6_addresses # 所有的ipv6的地址
ansible_bios_version # 主板bios的版本
ansible_architecture # 架构信息
ansible_date_time # 系统的时间
ansible_default_ipv4 # IPv4默认地址
address #ip地址
alias #网卡名称
broadcast #广播地址
gateway # 网关
macaddress #mac地址
netmask #子网掩码
network #网段
ansible_distribution #系统的版本
ansible_distribution_file_variety # 系统的基于对象
ansible_distribution_major_version # 系统的主版本
ansible_distribution_version #系统的版本
ansible_domain #系统的域
ansible_dns #系统的dns
ansible_env #系统的环境变量
ansible_hostname #系统的主机名
ansible_fqdn #系统的完整主机名
ansible_machine #系统的架构
ansible_memory_mb #系统的内存信息
ansible_os_family #系统的家族
ansible_pkg_mgr #系统的包管理工具
ansible_processor_cores #cpu的核数
ansible_processor_count #每颗cpu上的颗数
ansible_processor_vcpus #cpu的总核数=cpu的颗数*每颗cpu上的核数
ansible_python #系统的python版本
可以通过ansible 10.0.0.132 -m setup -a "filter='*关键字*'" 类似的命令进行搜索.
补充 : grep "^\(.*\):.*\1$" /etc/passwd \1表示前边分组中的信息,前后一致
grep -E "^(.*):.*\1$" /etc/passwd -E表示扩展匹配
grep匹配 : https://www.cnblogs.com/tian880820/p/5985056.html
七.通过定义tags执行指定任务
如果在playbook中有多条任务,现在只想执行某个任务,可以在任务中定义tags,在执行操作时指定-t即可单独执行此任务.
示例 :
- hosts: web
tasks:
- name: install
yum: name=redis
- name: copyfile
copy: dest=/etc/redis.conf src=/etc/redis.conf
tags: copyfile #在copyfile任务中定义tags(后边名字什么的无所谓)
- name: start
service: name=redis state=started
ansible-playbook -t copyfile p2.yml #操作时通过-t指定copyfile单独执行
八.playbook中handlers的用法
handlers 用法如下,表示当 tasks 执行成功之后再执行 handlers,相当于 shell 中的 && 用法,如果 tasks 执行失败是不会执行 handlers 语句的.
- hosts: web
tasks:
- name: install
yum: name=redis
- name: copyfile
copy: dest=/etc/redis.conf src=/etc/redis.conf
tags: copy
notify: restart #通过定义notify,在copyfile成功执行后才会执行restart
- name: start
service: name=redis state=started
handlers:
- name: restart
service: name=redis state=restarted
注意 : 如果handlers依赖的任务没有完成,则不会执行handlers中的任务.copy任务中如果目标地址中该文件已经存在,并且源文件没有发生变化,copy任务不会执行(幂等性原则),会导致handlers不执行.
九.template模块的使用
在playbook中如果想使用相对路径,则需要在本地目录下创建templates目录,templates模块指向动态文件.
- name: copyfile
template: dest=/etc/redis.conf src=redis.conf #源文件采用相对路径
十.playbook中when的使用
此处的when相当于python中的if条件语句,判断条件执行任务.
- hosts: web
tasks:
- name: file
copy: content="大弦嘈嘈如急雨" dest=/opt/file
when: ansible_distribution_major_version=="7" #引用setup中的参数,centos7
- name: file
copy: content="小弦切切如私语" dest=/opt/file
when: ansible_distribution_major_version=="6" #centos6
十一.with_items实现循环执行任务
当需要执行多个相同的任务时可以采用循环执行的操作.
- hosts: web
tasks:
- name: file
user: name={{item}} #使用大括号接收参数,item是固定写法
with_items: #固定格式
- xiaohua1
- xiaohua2
通过执行多个循环实现循环嵌套.
- hosts: web
tasks:
- name: creategroup
group: name={{item}}
with_items: #循环创建分组
- xiaohua1
- xiaohua2
- name: file
user: name={{item.name}} group={{item.group}}
with_items: #循环创建用户并指定用户的属组,完成嵌套
- {"name":xiaoming1,"group":xiaohua1}
- {"name":xiaoming2,"group":xiaohua2}
十二.linux命令补充
u 撤销
p 粘贴
#yy 复制#行
d$ 从当前位置删除
o 当前位置下面增加空白行,并切换到编辑模式
r 替换
ansible的两种命令执行方式 : ad-hoc / playbook以及通过setup模块获取系统参数的更多相关文章
- day17跨文件夹导入模块,模块的两种被执行方式,包,直接使用包中模块,包的管理
复习 ''' 1.模块 -- 一系列功能的集合体,用文件来管理一系列有联系的功能,该文件我们称之为模块,文件名就是模块名 -- import | from...import 来导入模块,从而使用模块中 ...
- redis笔记之两种持久化备份方式(RDB & AOF)
Redis支持的两种持久化备份方式(RDB & AOF) redis支持两种持久化方式,一种是RDB,一种是AOF. RDB是根据指定的规则定时将内存中的数据备份到硬盘上,AOF是在每次执行命 ...
- Oracle数据库的两种授权收费方式介绍!
首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...
- Linux共享库两种加载方式简述
Linux共享库两种加载方式简述 动态库技术通常能减少程序的大小,节省空间,提高效率,具有很高的灵活性,对于升级软件版本也更加容易.与静态库不同,动态库里面的函数不是执行程序本身 的一部分,而是 ...
- Form表单中method=post/get两种数据传输的方式的区别
Form提供了两种数据传输的方式——get和post.虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可能会对数据产生严重的影响.虽然为了方便的得到变量值,Web容器已经屏蔽了二者的一 ...
- mybatis中两种取值方式?谈谈Spring框架理解?
1.mybatis中两种取值方式? 回答:Mybatis中取值方式有几种?各自区别是什么? Mybatis取值方式就是说在Mapper文件中获取service传过来的值的方法,总共有两种方式,通过 $ ...
- Nginx使用的php-fpm的两种进程管理方式及优化
PS:前段时间配置php-fpm的时候,无意中发现原来它还有两种进程管理方式.与Apache类似,它的进程数也是可以根据设置分为动态和静态的. php-fpm目前主要又两个分支,分别对应于php-5. ...
- (总结)Nginx使用的php-fpm的两种进程管理方式及优化
PS:前段时间配置php-fpm的时候,无意中发现原来它还有两种进程管理方式.与Apache类似,它的进程数也是可以根据设置分为动态和静态的. php-fpm目前主要又两个分支,分别对应于php-5. ...
- 关于VAD的两种内存隐藏方式
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 技术学习来源:火哥(QQ:471194425) 内存在0环的两种内 ...
随机推荐
- 学习笔记:oracle学习一:oracle11g体系结构之体系结构概述和逻辑存储结构
目录 1.oracle 11g体系结构概述 1.1 三个重要概念 1.2 oracle数据库存储结构 2 逻辑存储结构 2.1 数据块(Data Blocks) 2.2 数据区(Extent) 2.3 ...
- Vue.js与React的全面对比
Vue与React的对比 Vue.js与React.js从某些反面来说很相似,通过两个框架的学习,有时候对一些用法会有一点思考,为加深学习的思索,特翻阅了两个文档,从以下各方面进行了对比,加深了对这两 ...
- HTML札记
HTML 指的是 超文本标记语言 (Hyper Text Markup Language) 文档后缀名: 当您保存 HTML 文件时,既可以使用 .htm 也可以使用 .html 扩展名.两者没有区别 ...
- 十二、使用PWM调整LCD背光亮度
和手机一样,开发板中也带有调整背光亮度的功能. 调整背光亮度依赖于PWM,它通过调节脉冲宽度来控制背光亮度,此方式需要使用PWM驱动.本章将对其进行讲解. 一.用户空间调整背光亮度 一般应用程序可以通 ...
- Ubuntu截图工具Flameshot
今天来介绍一款Ubuntu下的截图工具,名叫Flameshot. 安装 Flameshot的安装很简单. 命令行安装 sudo apt-get install flameshot 一条命令搞定! 软件 ...
- MySQL部分2
- 【BFS】斗地主
斗地主 题目描述 众所周知,小 X 是一个身材极好.英俊潇洒.十分贪玩成绩却依然很好的奆老.这不,他又找了他的几个好基友去他家里玩斗地主了……身为奆老的小 X 一向认为身边人和自己一样的厉害,他坚信你 ...
- css 小图标 & iconfont 字体图标
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! iconfont 字体图标 我们的需求中,很多时候会看到一些小的图形,或者叫图标,比如天猫网站中: ...
- (八)二进制文件在webservice中的处理(以byte[]字节数组方式)
一.介绍 二进制文件在webservice中的处理. A:通过byte[]字节数组的方式来传递.比较适合小文件,字节数组不能太大的情况.(本章所用) B:通过DataHander的方式来进行传递. 1 ...
- Android 自定义控件之 日期选择控件
效果如下: 调用的代码: @OnClick(R.id.btn0) public void btn0() { final AlertDialog dialog = new AlertDialog.Bui ...