自动化工具--Ansible使用

什么是 Ansible

Ansible 是一款自动化管理,官网https://www.ansible.com/

官网说他是”Ansible is Simple IT Automation”–简单的自动化 IT 工具,他主要是让我们自动化部署应用,自动化管理配置项,自动化的持续交付,自动化的云服务管理。

比如说你有一个任务,需要在1000台线上服务器配置缓存系统 ats,那么你不可能一台 一台的ssh 登陆服务器去安装配置,这样的效率估计也只能看着公司倒闭了。所以,需要借助一些自动化工具批量化的部署实现安装、更新等操作。类似于 cobbler 自动 PEX 安装机器。

如何安装

安装 ansible 你可以通过 GitHub 的源码编译安装,也可以通过 pip 去安装,因为 ansible 是用 python 写的。此外,ansible 被 redhat 收购,所以如果是 redhat7 或者 Fedora 系统的话,可以直接:

yum -y install ansible

如果是 Ubuntu

sudo apt-get install ansible

或者

pip install ansible

如何学习

一般学习一个新工具,通常是去看官网的文档,当然国内也有一些机构翻译了中文文档比如马哥团队翻译的 Ansible 中文权威指南

如何使用

基本的使用,可以参考此前写的ansible 使用,看 这里

Playbooks

Playbooks 是 Ansible的配置,部署,编排语言.他们可以被描述为一个需要希望远程主机执行命令的方案,或者一组IT程序运行的命令集合.

如果 Ansible 模块你是工作室中的工具,那么 playbooks 就是你设置的方案计划.

在基础层面, playbooks 可以被用来管理用于部署到远程主机的配置文件.在更高的层面上,playbooks 可以依次对多层式架构上的服务器执行上线包括滚动更新在内的操作并可以将操作委托给其他主机包括在此过程中发生的与监视服务器,负载均衡服务器的交互操作在内.

虽然这里讲发很多,但是不需要立刻一次性全部学完.你可以从小功能开始,当你需要的时候再来这里找对应的功能即可.

执行playbook

ansible-playbook deploy.yml

语法

最基本的playbook脚本分为三个部分:
1.在什么机器上以什么身份执行

  • hosts
  • users

2.执行的任务是都有什么

  • tasks

3.善后的任务都有什么

  • handlers

deploy.yml文件

---
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running
    service: name=httpd state=started
  handlers:
    - name: restart apache
      service: name=httpd state=restarted

主机和用户

key 含义
hosts 为主机的IP,或者主机组名,或者关键字all
user 在远程以哪个用户身份执行。
become 切换成其它用户身份执行,值为yes或者no
become_method 与became一起用,指可以为‘sudo’/’su’/’pbrun’/’pfexec’/’doas’
become_user 与bacome_user一起用,可以是root或者其它用户名

脚本里用became的时候,执行的playbook的时候可以加参数–ask-become-pass,则会在执行后提示输入sudo密码。

ansible-playbook deploy.yml --ask-become-pass

Tasks任务列表

  • tasks是从上到下顺序执行,如果中间发生错误,那么整个playbook会中止。你可以改修文件后,再重新执行。
  • 每一个task的对module的一次调用。使用不同的参数和变量而已。
  • 每一个task最好有name属性,这个是供人读的,没有实际的操作。然后会在命令行里面输出,提示用户执行情况。

语法

task的基本写法:

tasks:
  - name: make sure apache is running
service: name=httpd state=running

其中name是可选的,也可以简写成下面的例子。

tasks:
  - service: name=httpd state=running
  - 

写name的task在playbook执行时,会显示对应的名字,信息更友好、丰富。写name是个好习惯!

TASK: [make sure apache is running] *************************************************************
changed: [yourhost]

没有写name的task在playbook执行时,直接显示对应的task语法。在调用同样的module多次后,不同意分辨执行到哪步了。

TASK: [service name=httpd state=running] **************************************
changed: [yourhost]

参数的不同写法

最上的代码展示了最基本的传入module的参数的方法 key=value

tasks:
  - name: make sure apache is running
    service: name=httpd state=running

当需要传入参数列表太长时,可以分隔到多行:

tasks:
 - name: Copy ansible inventory file to client
   copy: src=/etc/ansible/hosts dest=/etc/ansible/hosts
           owner=root group=root mode=0644

或者用yml的字典传入参数

tasks:
 - name: Copy ansible inventory file to client
   copy:
     src: /etc/ansible/hosts
     dest: /etc/ansible/hosts
     owner: root
     group: root
     mode: 0644

TASK的执行状态

task中每个action会调用一个module,在module中会去检查当前系统状态是否需要重新执行。
如果本次执行了,那么action会得到返回值changed;
如果不需要执行,那么action得到返回值ok
module的执行状态的具体判断规则由各个module自己决定和实现的。例如,”copy” module的判断方法是比较文件的checksum,代码如下:
https://github.com/ansible/ansible-modules-core/blob/devel/files/copy.py

状态示例

以一个copy文件的task为例子:

tasks:
- name: Copy the /etc/hosts
  copy: src=/etc/hosts dest=/etc/hosts

第一次执行,它的结果是这个样子的:
TASK的状态是changed

第二次执行是下面这个样子的:
TASK的状态是ok,由于第一次执行copy_hosts.yml的时候,已经拷贝过文件,那么ansible目标文件的状态避免重复执行.

下面我更改vm-rhel7-1的/etc/hosts, 再次执行看看:

变量

参考https://ansible-book.gitbooks.io/ansible-first-book/content/advance/playbook/bian_liang.html