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环的两种内 ...
随机推荐
- 深入理解 Css3 的 clip-path
clip-path CSS 属性可以创建一个只有元素的部分区域可以显示的剪切区域.区域内的部分显示,区域外的隐藏.clip-path属性代替了现在已经弃用的剪切 clip属性.clip-path的属性 ...
- sql query skill
https://www.w3resource.com/sqlite/sqlite-select-query-statement.php /* SELECT ChipID FROM "tb_X ...
- 【洛谷】P3980 [NOI2008]志愿者招募
[洛谷]P3980 [NOI2008]志愿者招募 我居然现在才会用费用流解线性规划-- 当然这里解决的一类问题比较特殊 以式子作为点,变量作为边,然后要求就是变量在不同的式子里出现了两次,系数一次为+ ...
- ARTS 第十周打卡
Algorithm : 做一个 leetcode 的算法题 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: [&quo ...
- django_视图相关
使用通用视图(返回静态页面) from django.conf.urls.defaults import * from django.views.generic.simple import direc ...
- asp.net mvc抓取微信文章里面所有的图片
/// <summary> /// 下载指定URL下的所有图片 /// </summary> public class WebPageImage { /// <summa ...
- SCALA基础知识学习
注:本文只说和Java不同的地方. 总结自: Scala详细教程 Scala教程 scala基础语法 Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ";" 是 ...
- hdu 1285 拓扑
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- (六)Struts的简单异常处理
一.异常的分类 1.1 struts中的异常概念 Struts的声明式异常: 不处理异常,将异常交给struts框架来处理. 1.2 局部异常 局部异常:异常定义在Action里,异常处理只在这个Ac ...
- JAVA的转义字符
一.常见的转义字符 转移字符对应的英文是escape character , 转义字符串(Escape Sequence) 字母前面加上捺斜线"\"来表示常见的那些不能显示的AS ...