码迷,mamicode.com
首页 > 其他好文 > 详细

ansible简单用法

时间:2018-01-17 20:22:30      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:不同   中文   running   不同的   amp   href   交集   双引号   复制   

  • 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配置文件

        [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简单用法

    标签:不同   中文   running   不同的   amp   href   交集   双引号   复制   

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

    (0)
    (0)
       
    举报
    评论 一句话评论(0
    登录后才能评论!
    © 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
    迷上了代码!