ansible简单用法

  • Ansible简介:

    • ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

    • Ansible主要组成部分:

      • USER,普通用户,即SYSTEM ADMINISTRATOR
      • CMDB(资产管理系统) API 调用
      • PUBLIC/PRIVATE CLOUD API调用
      • USER-> Ansible Playbook -> Ansibile
      • 利用ansible实现管理的方式:
        • Ad-Hoc 即ansible命令,主要用于临时命令使用场景
        • Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前提的规划

    • Ansible配置文件

      /etc/ansible/ansible.cfg    主配置文件,配置ansible工作特性
      /etc/ansible/hosts       主机清单
      /etc/ansible/roles/       存放角色的目录


    • Ansible程序

      /usr/bin/ansible       主程序,临时命令执行工具
      /usr/bin/ansible-doc      查看配置文档,模块功能查看工具
      /usr/bin/ansible-galaxy     下载/上传优秀代码或Roles模块的官网平台
      /usr/bin/ansible-playbook    定制自动化任务,编排剧本工具
      /usr/bin/ansible-pull       远程执行命令的工具
      /usr/bin/ansible-vault     文件加密工具
      /usr/bin/ansible-console     基于Console界面与用户交互的执行工具


    • Ansible配置文件

    • Ansible 配置文件/etc/ansible/ansible.cfg (一般保持默认)
    • Ansible主机清单inventory

      • /etc/ansible/hosts文件格式
      • inventory文件遵循INI文件风格,中括号中的字符为组名。
      • 可以将同一个主机同时归并到多个不同的组中;此外,当如若目标主机使用了非默认的SSH端口,还可以在主机名称之后使用冒号加端口号来标明
      • 例:

    • Ansible系列命令

      ansible                                  #主程序命令,临时执行命令用
      ansible-doc                           #显示模块帮助
      ansible-playbook                  #将一系列的任务写在一起,称为:剧本
      ansible-vault              #管理加密、解密yml文件
      ansible-console                   #2.0+版本新增,可交互执行命令,支持tab
      ansible-galaxy        #连接 https://galaxy.ansible.com 下载相应的roles
      ansible-pull                          #推送命令至远程,效率无限提升,对运维要求较高
      • ansible
      • ansible-doc
      • ansible-vault
      • ansible-console

    • Ansible常用模块

      • Command:在远程主机执行命令,默认模块,可忽略-m选项
        ansible srvs -m command -a ‘service vsftpd start‘
        ansible srvs -m command -a ‘echo bigboss | passwd --stdin wang‘ #执行失败
        #此模块不支持 $VARNAME < > | ; & 等,用shell模块实现
      • Shell:和command相似,用shell执行命令
        (1)ansible srv -m shell -a ‘echo bigboss |passwd –stdin wang‘
        (2)调用bash执行命令
        #类似 cat /tmp/stanley.md | awk -F‘|‘ ‘{print $1,$2}‘ &> /tmp/example.txt
        #这些复杂命令,即使使用shell也可能会失败,解决办法:写到脚本时,copy到远程,执行,再把需要的结果拉回执行命令的机器
      • Script:运行脚本
        ansible all -script -a "/PATH/TO/SCRIPT_FILE"
        ansible all -m script -a test.sh
      • Copy:从服务器复制文件到客户端
        ansible srv -m copy -a ‘src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600 backup=yes‘
        #如目标存在,默认覆盖,backup=yes 指定先备份
        ansible srv -m copy -a "content=‘test content\n‘ dest=/tmp/f1.txt"
        #利用内容,直接生成目标文件
      • Cron:计划任务
        #支持时间:minute,hour,day,month,weekday
        ansible srv -m cron -a "minute=*/5 job=‘/usr/sbin/ntpdate 172.16.0.1 &>/dev/null‘ name=Synctime" #创建任务
        ansible srv -m cron -a ‘state=absent name=Synctime‘ #删除任务
      • Fetch:从客户端取文件至服务器端,copy相反,拉取目录可先tar打包
        ansible srv -m fetch -a ‘src=/root/a.sh dest=/data/scripts‘
      • File:文件管理
        ansible all -m file -a ‘name=/app/a.txt state=touch‘
        ansible srv -m file -a "path=/root/a.sh owner=wang mode=755"
        ansible web -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link‘
      • Hostname:管理主机名
        ansible all -m hostname -a "name=websrv"
      • Yum:管理包
        ansible srv -m yum -a ‘name=httpd state=latest‘ #安装
        ansible srv -m yum -a ‘name=httpd state=absent‘ #删除
      • Service:管理服务
        ansible srv -m service -a ‘name=httpd state=stopped‘ #停止
        ansible srv -m service -a ‘name=httpd state=started‘ #启动
        ansible srv –m service –a ‘name=httpd state=reloaded‘ #重读配置文件
        ansible srv -m service -a ‘name=httpd state=restarted‘ #重启
      • User:管理用户
        ansible srv -m user -a ‘name=user1 comment="test user" uid=2048 home=/app/user1 group=root‘
        ansible srv -m user -a ‘name=sysuser1 system=yes home=/app/sysuser1 ‘
        ansible srv -m user -a ‘name=user1 state=absent remove=yes‘
        #删除用户及家目录等数据
      • Group:管理组
        ansible srv -m group -a "name=testgroup system=yes"
        ansible srv -m group -a "name=testgroup state=absent"
      • Setup: 远程主机信息变量

    • Ansible的playbook

      • playbook是由一个或多个"play"组成的列表
      • play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。
      • 从根本上来讲,所谓task无非是调用ansible的一个module。
      • 将多个play组织在一个playbook中,即可以让它们联同起来按事先编排的机制同唱一台大戏
      • Playbook采用YAML语言编写
      • 运行playbook
                  ansible-playbook &lt;filename.yml&gt; ... [options]
                  选项:
                          --check         只检测可能会发生的改变,但不真正执行操作
                          --list-hosts    列出运行任务的主机
                          --limit         主机列表 只针对主机列表中的主机执行
                          -v,-vv,-vvv     显示过程,更详细
                  例:
                          ansible-playbook file.yml --check   #只检测不运行
                          ansible-playbook file.yml
                          ansible-playbook file.yml --limit websrvs   
      • YAML语法简介

        • (1)在单一档案中,可用连续三个连字号(——)区分多个档案。另外,还有选择性的连续三个点号( ... )用来表示档案结尾
        • (2)次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
        • (3)使用#号注释代码
        • (4)缩进必须是统一的,不能空格和tab混用
        • (5)缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
        • (6)YAML文件内容和Linux系统大小写判断方式保持一致,是区别大小写的,k/v的值均需大小写敏感
        • (7)k/v的值可同行写也可换行写。同行使用:分隔
        • (8)v可是个字符串,也可是另一个列表
        • (9)一个完整的代码块功能需最少元素需包括 name: task
        • (10)一个name只能包括一个task
        • (11)YAML文件扩展名通常为yml或yaml **
      • Playbook核心元素

        • Hosts    #执行的远程主机列表
        • Tasks     #任务集
        • Varniables  #内置变量或自定义变量在playbook中调用
        • Templates   #模板,可替换模板文件中的变量并实现一些简单逻辑的文件
        • Handlers   #和notity结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
        • tags     #标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断
      • Hosts
      • playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。
      • hosts用于指定要执行指定任务的主机,须事先定义在主机清单中
      • 可以是如下形式:
          www.bigboss.com
          www.bigboss1.com:www.bigboss2.com
          192.168.1.2
          192.168.1.*
          web:db      #两个组的交集
          web:&db     #两个组的并集
          web:!db     #在web组但不在db组中
          例:
                  - host: web:db
      • remote_user:
      • 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务
      • 此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户
          - hosts: websrvs
              remote_user: root
              tasks:
                  - name: test connection
                      ping:
                      remote_user: bigboss
                      sudo: yes                             #默认sudo为root
                      sudo_user:wang                #sudo为wang
      • tasks:任务列表
      • 格式:
        • (1) action: module arguments
        • (2) module: arguments 建议使用
      • 注意:shell和command模块后面跟命令,而非key=value
      • 某任务的状态在运行后为changed时,可通过"notify"通知给相应的handlers
      • 任务可以通过"tags"打标签,而后可在ansible-playbook命令上使用-t指定进行调用
    • 例:
        tasks:
             - name: disable selinux
               command: /sbin/setenforce 0
        #如果命令或脚本的退出码不为零,可以使用如下方式替代
        tasks:
            - name: run this command and ignore the result
              shell: /usr/bin/somecommand || /bin/true
        #或者使用ignore_errors来忽略错误信息:
        tasks:
          - name: run this command and ignore the result
            shell: /usr/bin/somecommand
            ignore_errors: True
    • handlers和notify结合使用触发条件:
        - hosts: websrvs
             remote_user: root
             tasks:
               - name: Install httpd
                   yum: name=httpd state=present
               - name: Install configure file
                   copy: src=files/httpd.conf dest=/etc/httpd/conf/
                   notify: restart httpd            #当copy动作实现时,就会执行handlers的动作
               - name: ensure apache is running
                service: name=httpd state=started enabled=yes
      
            handlers:
               - name: restart httpd
                 service: name=httpd status=restarted
    • tags使用:
        http.yml
        - hosts: web
          remote_user: root
          task:
            - name: Install httpd
               yum: name=httpd 
      
        - name: copy configure file
              copy: src=file/httpd.conf dest=/etc/httpd/conf/
              tags: conf       #设置tags名为conf
      
            - name: start httpd
              tags:service
              service: name=httpd state=started enabled=yes
      
        ansible-playbook -t conf httpd.yml    #调用名为conf的tags

    • 模板Templates

      文本文件,嵌套有脚本(使用模板编程语言编写)
      Jinja2语言,使用字面量,有下面形式
       字符串:使用单引号或双引号
       数字:整数,浮点数
       列表:[item1, item2, ...]
       元组:(item1, item2, ...)
       字典:{key1:value1, key2:value2, ...}
       布尔型:true/false
      算术运算:+, -, *, /, //, %, **
      比较操作:==, !=, >, >=, <, <=
      逻辑运算:and, or, not
      流表达式:For If When

    • templates功能:根据模块文件动态生成对应的配置文件
      • templates文件必须存放于templates目录下,且命名为 .j2 结尾
      • yaml/yml 文件需和templates目录平级,目录结构如下:
      • 例:利用templates 同步nginx配置文件

        [[email protected] ~]# cat nginx.conf.j2
        user nginx;
        worker_processes {{ ansible_processor_vcpus*2 }};
        #setup模块中ansible_processor_vcpus变量为CPU核心数,

        [[email protected] ~]# vim temnginx.yml

        - hosts: web
          remote_user: root
        
          tasks:
            - name: template config to hosts
              template: src=nginx.conf.j2  dest=/etc/nginx/nginx.conf 

        ansible-playbook temnginx.yml

    • when: 条件测试
      • 如果需要根据变量、facts或此前任务的执行结果来做为某task执行与否的前提时要用到条件测试,通过when语句实现,在task中使用,jinja2的语法格式在task后添加when子句即可使用条件测试;when语句支持Jinja2表达式语法
      • 例:

        #当setup模块中ansible_os_family等于RedHat时执行关机
        tasks:

        • name: shutdown redhat system
          command: /sbin/shutdown -h now
          when: ansible_os_family == ‘RedHat‘

          #根据系统版本来安装软件
          tasks:

        • name: install nginx to centos7
          yum: name=nginx
          when: ansible_distribution_major_version == ‘7‘
        • name: install httpd to centos6
          yum: name=httpd
          when: ansible_distribution_major_version == ‘6‘
    • 迭代:with_items
      • 迭代:当有需要重复性执行的任务时,可以使用迭代机制
      • 对迭代项的引用,固定变量名为”item“
      • 要在task中使用with_items给定要迭代的元素列表
      • 列表格式:
      • 字符串
      • 字典
      • 例:
    • 迭代嵌套子变量:

    原文地址:http://blog.51cto.com/bigboss/2062180

    时间: 2024-08-01 17:54:42

    ansible简单用法的相关文章

    iOS block-base 动画简单用法+关键帧动画设置线性变化速度的问题

    本文转载至 http://www.tuicool.com/articles/aANBF3m 时间 2014-12-07 20:13:37  segmentfault-博客原文  http://segmentfault.com/blog/alan/1190000002411296 iOS的各种动画相漂亮,相信这是吸引很多人买iPhone的原因之一.不仅如此,这还是吸引我做iOS开发的一大原因,因为在iOS上给界面实现一些像样的动画实在是太轻松了! 这里就介绍一下iOS的block-based an

    Android WIFI 简单用法

    随着Wifi的普及,在开发App的时候对wifi的考虑越来越多了.例如程序的升级在wifi下可以省很多流量,在通信软件中的视频通话.可以实现高画质的传输等等,Android提供了WifiManager类来帮助开发者们管理Wifi.下面就简单来说一下WifiManager的简单用法把. 权限: 为了使用WfiManager 我们需要在Androidmanifest.xml 加入权限: //本例中使用了前两个.具体请按照需要添加权限. <uses-permission android:name=&quo

    Android中资源文件中的字符串数组string-array简单用法

    在Android中,用string-array是一种简单的提取XML资源文件数据的方法. 例子如下: 把相应的数据放到values文件夹的strings.xml文件里,或是其他自定义的xml中都可以,以下操作方法相同. <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="sports"> <item>足球<

    expect简单用法

    1 #!/usr/expect/bin/expect -f 2 3 4 set loginuser [lrange $argv 0 0] 5 set loginpass [lrange $argv 1 1] 6 set ipaddr [lrange $argv 2 2] 7 set port [lrange $argv 3 3] 8 set timeout [lrange $argv 4 4] 9 set from [lrange $argv 5 5] 10 set to [lrange $ar

    Tcpdump 的简单用法

    Tcpdump 的简单用法 tcpdump是Linux命令行下使用最广泛的网络分析工具,运行的时候会将网卡运行在混杂模式下,需要root权限才能执行 下面是几个比较常见的参数: -w  保持到指定的文件 -i  指定监听的网卡,缺省显示第一块网卡 -nn 以IP方式显示host -v  显示详细信息 -s  指定数据包大小,缺省是65535 -t  不显示时间 ,缺省是显示时间戳 -c  获取数据包数量,缺省不限制,需要用Ctrl+c来终止 下面是关于命令关键字的说明 1.主要包括host,ne

    C++ double转string类型以及MFC控件简单用法

    这两天项目需要,测试c++库里面内容.生成jar再给Android调用.我没有学过C++,现在开始记录C++简单用法.测试时候一般都是使用mfc程序来测试,要输入值,显示结果吗.我用的编译环境vs2008. 一.double 转string #include <string> CString strResultx; strResultx.Format(_T("x:%.4f\n"), 89.7887878); 转换结果还是放在strResultx 2.两个字符串相连 CStr

    vB SendMessage API 简单用法

    vB SendMessage API 简单用法 1. 在Windows编程中,向文本框控件.列表控件.按钮控件等是我们最常接触的控件了.但是在VB中这些控件有时无法实现我们的需要.在这时,我们只要简单的利用Windows API函数就可以扩充这些控件的功能了.顾名思义,SendMessage函数就是向窗口(这里的窗口指的是向按钮.列表框.编辑框等具有hWnd属性的控件)发送消息的函数,该函数的定义如下:Declare Function SendMessage Lib "user32"

    java中Object.equals()简单用法

    /* equals()方法默认的比较两个对象的引用! */ class Child { int num; public Child(int x){ num = x; } //人文的抛出运行时异常的好处是:可以自定义错误信息! /*public boolean equals(Object o) throws ClassCastException{ if(!(o instanceof Child)) throw new ClassCastException("中文提示:类型错误"); Ch

    UIDatePicker的简单用法

    // 初始化UIDatePickerUIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 200, 320, 216)];// 设置时区[datePicker setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];// 设置当前显示时间[datePicker setDate:tempDate animated:YES];// 设置显示最大时间