• 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简单用法_第1张图片

  • Ansible主机清单inventory

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

  • 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简单用法_第2张图片
    • ansible-doc
      ansible简单用法_第3张图片

    • ansible-vault
      ansible简单用法_第4张图片
    • ansible-console
      ansible简单用法_第5张图片

  • 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语言编写
      • YAML是一个可读性高的用来表达资料序列的格式
      • http://www.yaml.org
    • 运行playbook

                ansible-playbook <filename.yml> ... [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目录平级,目录结构如下:
      ansible简单用法

    • 例:利用templates 同步nginx配置文件

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

      [root@centos7 ~]# 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给定要迭代的元素列表
    • 列表格式:
    • 字符串
    • 字典
    • 例:
      ansible简单用法_第6张图片
  • 迭代嵌套子变量:
    ansible简单用法_第7张图片

  • 想要深入了解请点击→Ansible中文权威指南