ansible simple tutorial

ANSIBLE

Simple, agentless and powerful open source IT automation.

ansible是一个轻量级的自动化运维工具,学习门槛低,安装简单,执行方便,它基于ssh,远程服务器上不需要安装客户端agent,利用推送方式对客户系统加以配置,这样所有工作都可在主服务器端完成,不需要维护远程服务器上的客户端agent。

ansible中的概念

  1. 任务task:多个task顺序执行,在每个task执行结束可以通知hanlder触发新操作。
  2. 变量variable:用户定义的变量。
  3. 环境facts:facts从每台服务器上收集得到,可以用作变量。
  4. 模块module:比如shellpingaptgitcopy,默认的command等等。
  5. 操作hanlder:任务执行后的回调任务,通过task中的notify配置关联handler,不管有多少个通知,handler在所有任务运行后,按照配置的先后顺序只运行一次。

使用前提

ansible基于ssh操作远程服务器,所以要求远程服务器提供:

  1. remote_user能够通过ssh公钥无密码登录到所管理的远程服务器。
  2. remote_user执行sudo的时候不需要密码,配置如下说明。
 sudo chmod +w /etc/sudoers visudo

或者是用vim直接编辑此文件:

 sudo vim /etc/sudoers

找到root ALL=(ALL:ALL) ALL,在下面添加一行,username为ssh远程登陆用户的用户名:

username    ALL=(ALL:ALL) NOPASSWD:ALL

保存退出,然后恢复为只读。

 sudo chmod -w /etc/sudoers

Mac OS上安装ansible

使用homebrew安装最方便:

 brew install ansible

或者是使用pip安装:

 sudo easy_install pip sudo pip install ansible

配置

ansible配置文件设置.ansible.cfg,ansible执行的时候会按照以下顺序查找配置文件:

  • ANSIBLE_CONFIG (环境变量)
  • ansible.cfg (当前目录)
  • ~/.ansible.cfg (用户目录)
  • /etc/ansible/ansible.cfg (默认位置)

在当前用户目录新建一份空文件:

 touch ~/.ansible.cfg

Ping command test

编辑/etc/ansible/hosts文件,加入以下远程服务地址,并且在这些远程服务器的~/.ssh/authorized_keys文件中加入了登录用户的ssh公钥,使得用户可以通过ssh无密码登录:

192.168.1.50[local]127.0.0.1[mail]mail.example.com ansible_ssh_user=username[webservers]www.example.com[dbservers]db[a:f].example.com

这是一份需要维护的远程服务器的inventory目录文件,更详细的说明可查看Inventory官方文档。

使用ping模块检查以上配置中的所有服务器状态:

 ansible all -m ping

前面公钥设置正确的情况下,会得到如下类似的输出:

127.0.0.1 | success >> {

"changed": false,

"ping": "pong"

}

mail.example.com | success >> {

"changed": false,

"ping": "pong"

}

Echo command test

 ansible all -a "/bin/echo hello"

127.0.0.1 | success | rc=0 >>

hello

mail.example.com | success | rc=0 >>

hello

如果要执行远程服务器操作的用户与当前操作用户不同时,可以通过/etc/ansible/hosts文件配置ansible_ssh_user,或者是在运行命令时加上-u参数覆盖配置文件中的设置。

 ansible all -a "/bin/echo hello" -u bruce

这是一条ansible ad-hoc命令,ad-hoc命令是指临时的,在ansible中是指需要快速执行,并且不需要保存的命令。ansible提供两种方式去完成任务,一是ad-hoc命令,一是写playbook,前者可以解决一些简单的任务,后者解决较复杂的任务.

指定ansible hosts配置文件运行ad-hoc命令

 ansible -i ~/hosts all -a 'who'

以上命令参数说明:

  1. -i表示hosts文件的位置,默认是/etc/ansible/hosts
  2. -a后面是module的参数,这边没有指定module,即默认的module,是command module
  3. all代表host所有服务器。

这条命令就是对用户指定配置文件~/hosts中所有的host执行who命令。

修改ansible默认hosts文件位置

修改默认hosts文件位置,编辑用户目录下的~/.ansible.cnf文件:

 mkdir ~/ansible cp /etc/ansible/hosts ~/ansible/hosts vim .ansible.cfg

加入以下内容:

[defaults]hostfile=~/ansible/hosts

playbook.yml配置

前面已经提到playbook是ansible保存的一份配置文件,用于执行复杂的任务和需要重复执行的任务。

以下是官方示例中的一份playbook配置文件,这份配置只有一个play,一份配置可以添加多个play。在这个配置中定义了3个task和1个handler,使用yum安装apache,添加apache配置文件并通知hanlder执行apache重启,检查当前是否正在运行apache服务,最后由handler重启apache服务。

---- hosts: webservers  vars:    http_port: 80    max_clients: 200  remote_user: root  tasks:  - name: ensure apache is at the latest version    yum:      sudo: yes      name: 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

playbook简单示例

设置一个简单的任务,登陆远程服务器将登录用户名写入whoami.rst文件中,保存以下内容到~/ansible/playbook.yml

# playbook.yml---- hosts: webservers # hosts中指定  remote_user: username # 如果和当前用户一样,则无需指定  tasks:    - name: whoami      shell: 'whoami > whoami.rst'

playbook的结构

一个playbook文件由一个或多个play组成,在play中首先需要定义在哪个主机上执行,即

hosts: webservers

每个play定义了在一个或多个远程主机上执行的一系列的task,下面就是一个task:

- name: whoami  shell: 'whoami > whoami.rst'

其中每个task一般就是调用一个ansible的模块,如调用copy模块复制文件到远程主机或调用shell模块执行命令。tasks中的各任务按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个任务后再开始第二个,如果中途发生错误所有已执行任务都将回滚因此在更正playbook后重新执行一次即可。

运行以上配置文件:

 ansible-playbook -i ~/ansible/hosts ~/ansible/playbook.yml

输出内容如下:

PLAY [webservers] *******************************************************************

GATHERING FACTS ***************************************************************

ok: [www.example.com]

TASK: [whoami] ****************************************************************

changed: [www.example.com]

PLAY RECAP ********************************************************************

www.example.com : ok=2 changed=1 unreachable=0 failed=0

关于playbook,还可以查看官方提供的playbook示例项目:

 git clone git@github.com:ansible/ansible-examples.git

References

  1. Getting Started
  2. Ansible入门
  3. Ansible 快速入门
  4. 轻量级自动化部署工具 Ansible
  5. Ansible first book download
  6. 自动化运维工具ansible详细介绍
  7. 自动化工具--ansible中文指南