ansible

简介

ansible是自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。github地址为https://github.com/ansible/ansible

ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。

框架组成部分

ansible框架主要包括:

  1. 连接插件connection plugins:负责和被监控端实现通信;
  2. host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
  3. 各种模块核心模块、command模块、自定义模块;
  4. 借助于插件完成记录日志邮件等功能;
  5. playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

    特性

  6. no agents:不需要在被管控主机上安装任何客户端;
  7. no server:无服务器端,使用时直接运行命令即可;
  8. modules in any languages:基于模块工作,可使用任意语言开发模块;
  9. yaml,not code:使用yaml语言定制剧本playbook;
  10. ssh by default:基于SSH工作;
  11. strong multi-tier solution:可实现多级指挥。

    优点

  12. 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
  13. 批量任务执行可以写成脚本,而且不用分发到远程就可以执行;
  14. 使用python编写,维护更简单,ruby语法过于复杂;
  15. 支持sudo。

    安装

    ansible安装比较简单,配置epel源,然后直接通过yum即可安装。
    1
    2
    yum install -y epel-release
    yum install -y ansible

当然,也可以通过pip方式安装,pip install ansible
需要注意的是此时的安装的ansible文件位于/usr/local/python/bin目录下。

配置文件

ansible.cfg文件

ansible读取配置文件的顺序如下

  1. ansible.cfg(位于当前位置)
  2. ANSIBLE_CONFIG 一个环境变量
  3. .ansible.cfg 位于家目录下
  4. /etc/ansible/ansible.cfg

一般情况下使用配置文件为/etc/ansible/ansible.cfg
配置文件中主要参数如下

1
2
3
4
inventory = /etc/ansible/hosts #指定inventory配置文件
forks = 5 #子进程数量,推荐设置为cpu核心数
sudo_user = root #sudo用户
remote_port = 22 #远程端口

hosts文件

ansible默认配置文件路径为/etc/ansible/hosts,也可以自定义配置文件路径。

  1. 常用配置如下
    中括号nginx代表nginx主机组,nginx_127、nginx_219代表主机,属于nginx主机组
    1
    2
    3
    [nginx]
    nginx_127 ansible_ssh_port=22 ansible_ssh_host=127.0.0.1 ansible_ssh_pass='password'
    nginx_219 ansible_ssh_port=22 ansible_ssh_host=192.168.145.219 ansible_ssh_pass='password'

注意:需要安装sshpass这个软件才能使用密码去操作服务器,安装方式yum install -y sshpass

  1. 简化配置
    如果使用密钥实现了无密码登录,可以使用下面简化配置
    1
    2
    3
    [nginx]
    nginx_127 ansible_ssh_port=22 ansible_ssh_host=127.0.0.1
    nginx_219 ansible_ssh_port=22 ansible_ssh_host=192.168.145.219

或者使用更简单的

1
2
3
[nginx]
127.0.0.1
192.168.145.219

模块

ansible使用比较简单,其中-i可以指定配置文件的路径,不指定默认为/etc/ansible/hosts。
ansible -i /etc/ansible/hosts 指定主机组或者主机 -m 指定模块 -a 指定模块的参数

ping模块

ping模块用来查看服务器是否连接正常,ping模块不需要-a指定参数。

1
ansible all -m ping

主机和主机组注意事项:
all 代表所有主机

1
2
ansible -i /etc/ansible/hosts 192.168.145.219:127.0.0.1 -m ping #自己指定多台主机去操作
ansible -i /etc/ansible/hosts all:\!127.0.0.1 -m ping #不操作127.0.0.1的主机,!需要转义

command模块

command模块不支持使用管道,不建议使用

1
2
3
ansible all -m command -a "pwd"
ansible all -m command -a "df -h|grep sda1"
ansible all -m command -a "df -h >>/tmp/xiaohuihu"

shell模块

shell模块支持管道

1
2
3
ansible all -m shell -a "df -h|grep sda1"    #支持管道
ansible all -m shell -a "df -h >>/tmp/xiaohuihui" #支持重定向
ansible all -m shell -a "cat /etc/passwd|awk -F':' '{print \$1}'" #得进行转义

raw模块

raw模块使用原始的ssh方式运行命令

1
2
ansible all -m raw -a "yum install python-simplejson -y"
ansible all -m raw -a "yum install libselinux-python -y"

copy模块

copy模块使用格式为ansible 主机组 -m copy -a ''
可用参数如下

  • src: 指定源文件或目录
  • dest: 指定目标服务器的文件或目录
  • backup: 是否要备份
  • owner: 拷贝到目标服务器后,文件或目录的所属用户
  • group: 拷贝到目标服务器后,文件或目录的所属群组
  • mode: 文件或目录的权限

下发文件

1
ansible all -m copy -a "src=/tmp/xiaohuihui/xiaohuihui.txt dest=/usr/local/src/"

下发文件夹

1
2
ansible all -m copy -a "src=/tmp/xiaohuihui/ dest=/usr/local/src/" #xiaohuihui目录不会拷贝
ansible all -m copy -a "src=/tmp/xiaohuihui dest=/usr/local/src/" #xiaohuihui目录会拷贝

自动备份,备份文件位于dest目录下

1
ansible all -m copy -a "src=/tmp/xiaohuihui/xiaohuihui.txt dest=/usr/local/src/ backup=yes"

控制所属的用户和指定权限

1
ansible all -m copy -a "src=/tmp/xiaohuihui/xiaohuihui.txt dest=/usr/local/src/ backup=yes owner=oracle group=oinstall mode=0640"

script模块

script模块能够实现远程服务器批量运行本地的shell脚本

1
ansible all -m script -a "/usr/local/src/script"

相当于scp+shell命令的组合。
当然,ansible还包括其他一些模块,更多的可以通过帮助问题查看。
使用方式

1
2
3
/usr/local/python/bin/ansible-doc -l    #查看总帮助
/usr/local/python/bin/ansible-doc -s shell #查看shell模块的帮助
/usr/local/python/bin/ansible-doc -s raw

Recommended Posts