巧用ansible提高效率

叁叁肆2018-09-19 13:47

本文来自网易云社区

作者:司徒诚颢


ansible是一个自动化的运维工具,可以批量ssh到远程机器进行操作。

而且还不需要在远程机器上安装任何的agent,因为它使用纯python实现了ssh协议。

最常用的就是同时在多个机器上执行某个命令了,只要带上合适的参数使用playbook调用这个脚本就可以批量在远程机器上运行命令了。

---
- hosts: '{{ hosts }}'
  serial: '{{ batch_serial|default(50)|int }}'
  tasks:
    - name: shell
      shell: '{{ cmd }}'
      register: out
    - debug: msg="{{ out.stdout.split('\n') }}"

各个配置的含义如下

hosts:通过参数传入,可以预先在ansible的hosts文件里配置各个集群

serial:指定每批次在几个机器上执行,默认为50,可通过参数传入

shell:这个可以是任意的shell命令

redister:存储指定命令的输出结果到out变量

debug:显示远程命令的输出也会在当前终端中显示。

比如当我们申请了一批新机器的时候,要确认一下云硬盘是否都挂载了,就可以使用

ansible-playbook tasks/batch_shell.yml -e "hosts=test cmd='df -h | grep nbs'"

会得到如下输出,就能看很方便的看出是否有机器尚未挂载硬盘了。

ok: [hzayq-photo21] => {
    "msg": [
        "/dev/vdc1        79G  184M   75G   1% /srv/nbs/0"
    ]
}
ok: [hzayq-photo23] => {
    "msg": [
        "/dev/vdc1        79G  184M   75G   1% /srv/nbs/0"
    ]
}

脚本更常用的使用场景就是搜索应用日志了,无非是替换一下cmd的参数而已。

再结合fetch模块,可以很方便抓取一个集群中所有机器的特定日志了。

ansible还支持在脚本里sudo,只要在刚才的脚本里加上以下两行,就可以在磁盘空间不够的时候批量清理了:

become: true 
become_user: '{{ user }}'

become_user:通过参数传入需要sudo的用户即可

在使用sudo的基础上,按批次发布应用也可以使用ansible的脚本实现

---
- hosts: '{{ hosts }}'
  become: true 
  become_user: '{{ user }}'
  serial: '{{ serial|default(1)|int }}' 
  tasks:
    - name: restart-tomcat
      environment:
       LANG: 'zh_CN.GBK'
       LC_ALL: 'zh_CN.GBK'
      command: '{{ tomcat_path }}/tomcat6 restart'
      async: 300
      poll: 0
      register: tomcat_sleeper
    - name: pause
      pause: seconds='{{ restart_pause|default(60)|int }}'
    - name: check tomcat
      async_status: jid={{ tomcat_sleeper.ansible_job_id }}
      register: job_result
    - debug: msg="{{job_result.stdout.split('\n')}}"

总之ansible是个上手简单、功能强大的自动化运维工具,合理使用可以大大提供日常工作的效率。

之前博客、相册和lofter几百台应用服务器的迁移都是通过ansible来完成初始化和配置的,大大减少了迁移的时间。



网易云免费体验馆0成本体验20+款云产品!

更多网易研发、产品、运营经验分享请访问网易云社区