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

Posted wangtaobiu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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   
View Code

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

 

以上是关于ansible的两种命令执行方式 : ad-hoc / playbook以及通过setup模块获取系统参数的主要内容,如果未能解决你的问题,请参考以下文章

003.Ansible基础使用

大话Ansible Ad-Hoc命令

自动化运维工具ansible实战第二章(初识编排神器playbook)

Ansible之Ad-Hoc

自动化运维工具Ansible常用模块

(初识编排神器playbook)