一.什么是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模块获取系统参数的更多相关文章

  1. day17跨文件夹导入模块,模块的两种被执行方式,包,直接使用包中模块,包的管理

    复习 ''' 1.模块 -- 一系列功能的集合体,用文件来管理一系列有联系的功能,该文件我们称之为模块,文件名就是模块名 -- import | from...import 来导入模块,从而使用模块中 ...

  2. redis笔记之两种持久化备份方式(RDB & AOF)

    Redis支持的两种持久化备份方式(RDB & AOF) redis支持两种持久化方式,一种是RDB,一种是AOF. RDB是根据指定的规则定时将内存中的数据备份到硬盘上,AOF是在每次执行命 ...

  3. Oracle数据库的两种授权收费方式介绍!

    首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...

  4. Linux共享库两种加载方式简述

      Linux共享库两种加载方式简述  动态库技术通常能减少程序的大小,节省空间,提高效率,具有很高的灵活性,对于升级软件版本也更加容易.与静态库不同,动态库里面的函数不是执行程序本身 的一部分,而是 ...

  5. Form表单中method=post/get两种数据传输的方式的区别

    Form提供了两种数据传输的方式——get和post.虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可能会对数据产生严重的影响.虽然为了方便的得到变量值,Web容器已经屏蔽了二者的一 ...

  6. mybatis中两种取值方式?谈谈Spring框架理解?

    1.mybatis中两种取值方式? 回答:Mybatis中取值方式有几种?各自区别是什么? Mybatis取值方式就是说在Mapper文件中获取service传过来的值的方法,总共有两种方式,通过 $ ...

  7. Nginx使用的php-fpm的两种进程管理方式及优化

    PS:前段时间配置php-fpm的时候,无意中发现原来它还有两种进程管理方式.与Apache类似,它的进程数也是可以根据设置分为动态和静态的. php-fpm目前主要又两个分支,分别对应于php-5. ...

  8. (总结)Nginx使用的php-fpm的两种进程管理方式及优化

    PS:前段时间配置php-fpm的时候,无意中发现原来它还有两种进程管理方式.与Apache类似,它的进程数也是可以根据设置分为动态和静态的. php-fpm目前主要又两个分支,分别对应于php-5. ...

  9. 关于VAD的两种内存隐藏方式

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 技术学习来源:火哥(QQ:471194425) 内存在0环的两种内 ...

随机推荐

  1. python while循环 - python基础入门(9)

    经过昨天的学习,相信大家已经对 python的条件判断表达式if/else 有一定的了解了,那么我们今天配合昨天的课程讲解一个新概念 – while循环 . 都说程序源于生活,假如有这样一个场景:老师 ...

  2. 微信公众号对接JS-SDK接口 调用微信内置地图

    微信js-sdk开发文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html 1.页面配置 引用微信js- ...

  3. 什么是H5?

    总听到很多人说H5,现在H5很火,到底H5是什么,以下发表个人对H5的理解. HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准. HTML 的上一个版本诞生于 1999 年. ...

  4. SASS摘要

    SASS提高了代码的重复利用率,提高了效率.不用去记或者查找复杂或者繁琐的参数和书写规则. 这里简单整理了实际业务中常常用到的几个功能. 1. 父元素引用 & a { &:hover ...

  5. PHP trait介绍

    Trait 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait. Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制.Trait 为了减少单继承语言的限制, ...

  6. hdu 5672 尺取还是挺好用的

    先简单介绍下尺取法 http://blog.chinaunix.net/uid-24922718-id-4848418.html 尺取法就是在卡给定条件的时候 不断的改变下标 起点 终点 #inclu ...

  7. Tomcat server.xml port server context 配置

  8. less学习大纲总结

    1.注释的区别 /**/ //2.变量的命名 @+变量名 如:@f_width 引用的时候也要带上@ 符号3.混合 可带参数 默认带值4.匹配模式 相当于js里的if,但不完全是 用于符号条件的匹配 ...

  9. vue语法概要二

    函数 用途 类别 v-html 用于输出html格式的数据 输出 v-bing 用于输出值 输出 v-model 双向绑定 输入和输出 v-if 逻辑判断 分支语句 v-else 同上 分支语句 v- ...

  10. Android Parcelable 序列化复杂数据结构

    参考博文 http://blog.csdn.net/yangzl2008/article/details/7593226 由于项目需要,Activity之间要传递一个特别复杂的数据结构对象,由于以前序 ...