zoukankan      html  css  js  c++  java
  • 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目录,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   替换
    

     

  • 相关阅读:
    级数求和
    c++版a+b问题的各种无聊做法
    2017 Multi-University Training Contest
    2017 Multi-University Training Contest
    [DP] UVA-1626 Brackets sequence
    Codeforces Round #426 (Div. 2) [A、B、C]
    一只弱菜的博客之旅
    关于数据库保存的二进制图片无法在colorbox插件中显示的解决办法
    windows+caffe+vs2013+cuda6.5配置记录
    Ubuntu14.04+cuda6.5+opencv2.4.9+MATLAB2013a+caffe配置记录(五)——安装Caffe
  • 原文地址:https://www.cnblogs.com/wangtaobiu/p/10691689.html
Copyright © 2011-2022 走看看