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目录.

  - 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   替换

 

原文地址:https://www.cnblogs.com/wangtaobiu/p/10691689.html

时间: 2024-10-13 14:40:57

ansible的两种命令执行方式 : ad-hoc / playbook以及通过setup模块获取系统参数的相关文章

Linux中两种脚本执行方式的区别:. xx 和 ./xx

今天继续在看Building Linux Embedded Systems一书,进入第四章,有一些实际的操作,其中在介绍了良好的组织架构(文件夹)后,建议些一个script可以进行不同的开发环境.里面很简单,包括一个export和cd的命令,这个脚本假设为 export PROJECT=/home/aaa/project1 cd $PROJECT 并取名字为 test 我执行$ ./test,发现没有效果,然后在里面增加两个跟踪语句,如下 export PROJECT=/home/aaa/pro

SQL server(MSSQL)客户端工具登录数据库的两种命令行登录方式

我们安装了sqlserver服务器和sqlserver客户端工具之后,可以使用两种命令行方式登录数据库: >sqlwb -S servername或IP -E     #使用当前windows系统的账户登录sqlserver服务器 如下图: >sqlwb -S servername或IP -U username -P password     #使用数据库账户和密码登录sqlserver服务器 如下图: PS:安装好sqlserver数据库之后,默认sa账户无法登录,需要调整数据库服务配置才可

RHEL7、CentOS7提供三种命令行方式方式来设置和显示日期

RHEL7.CentOS7提供三种命令行方式方式来设置和显示日期.时间.timedatectl是在RHEL7及CentOS7中新增的systemd的一部分,date是传统的日期时间设置命令,hwclock单元访问的是硬件时钟. 一.timedatectl [root@Geeklp-Administrator ~]# timedatectl Local time: 六 2017-12-16 19:49:53 CST Universal time: 六 2017-12-16 11:49:53 UTC

Linux驱动的两种加载方式过程分析

一.概念简述 在Linux下可以通过两种方式加载驱动程序:静态加载和动态加载. 静态加载就是把驱动程序直接编译进内核,系统启动后可以直接调用.静态加载的缺点是调试起来比较麻烦,每次修改一个地方都要重新编译和下载内核,效率较低.若采用静态加载的驱动较多,会导致内核容量很大,浪费存储空间. 动态加载利用了Linux的module特性,可以在系统启动后用insmod命令添加模块(.ko),在不需要的时候用rmmod命令卸载模块,采用这种动态加载的方式便于驱动程序的调试,同时可以针对产品的功能需求,进行

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

Form提供了两种数据传输的方式—get和post,Form中的get和post方法,在数据传输过程中分别对应了HTTP协议中的GET和POST方法,感兴趣的朋友可以了解下,或许对你学习get/post有所帮助 Form提供了两种数据传输的方式——get和post.虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可能会对数据产生严重的影响.虽然为了方便的得到变量值,Web容器已经屏蔽了二者的一些差异,但是了解二者的差异在以后的编程也会很有帮助的. Form中的get和post方法

Hibernate两种获得sessionFactory方式的区别

Hibernate 可以通过sessionFactory.openSession()和sessionFactory.getCurrentSession()来获得session,下面来浅说一下两者区别. [sessionFactory.openSession()]     通过session工厂sessionFactory.openSession()方法来获得一个session,每次都创建一个新的session出来,并且每次Hibernate都会打开数据库和应用程序的连接. [sessionFac

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

PS:前段时间配置php-fpm的时候,无意中发现原来它还有两种进程管理方式.与Apache类似,它的进程数也是可以根据设置分为动态和静态的. php-fpm目前主要又两个分支,分别对应于php-5.2.x的版本和php-5.3.x的版本.在5.2.x的版本中,php-fpm.conf使用的是xml格式,而在新的5.3.x版本中,则是和php.ini一样的配置风格. 在5.2.x版本中,php-fpm.conf中对于进程管理号称是有两种风格,一种是静态(static)的,一种是类似于apache

CPNtools协议建模-----门卫过滤两种帧存储方式

1.门卫过滤作用 两种帧格式定义方式的过滤 ,第一种方式  数据存储定义格什为 colset frame=product  MAC *MAC*DATA      第二种数据帧存储格式定义为 colset frame=record dst:MAC*addr:MAC*d:DATA; 第一种使用门卫过滤方式 [#1 f=addr]        对应的第二种过滤方式    [ #dst f=ad ] 2.对应于变迁的输出代码片段的的过滤这里不再重复,查阅之前的博客 原文地址:https://www.c

UIImage的两种加载方式

UIImage的两种加载方式 1.有缓存:读取后放入缓存中下次可直接读取,适用于图片较少且频繁使用. [UIImage imageNamed:@"文件名"]: 在缓存中由系统管理,当收到memoryWarning时会释放这些内存资源. 2.无缓存:用完就释放掉,参数传的是全路径,适用于图片较多较大的情况下. NSString *path = [[NSBundlemainBundle] pathForResource: @"1.png"ofType: nil]; [U