所在位置:

ansible的安装和基本用法

如果你使用过 fabric 或者 paramiko 这些自动化工具,对于机器很少的时候,还是很方便的,但对于上百台以上机器来说,这些工具已经力不从心了,特别是对于机器的批量系统配置、批量程序部署、批量运行命令等等功能。这时就可以选择 ansiblepuppetchefsalt 这些工具,下面来说一下 ansible 的一些原理及安装使用:

准备工作

  • 控制主机 mac 10.13.3, ansible 安装的版本 2.4.1.0,python 的版本 Python 2.7.10

  • 被管节点两台 Centos 7,第一台的 ip 为 11.11.11.11,第二台的 ip 为 22.22.22.22

Ansible、Puppet、Salt、Chef的区别

ChefPuppet 是使用代理模式的,它们默认基于拉( pull )方式。被管节点上安装代理后,代理服务将周期性检查中心控制主机的服务,并从控制主机上取来配置信息,SaltAnsible 默认是基于推(push) 方式的,Ansible 可以不用在被管节点上安装代理,Salt 则可以安装或者不用安装被管节点代理。这四个工具都具有各自的优缺点,而 Ansible 则是后起之秀,集其它几家的优点,并有自己的特点,如果想了解更多它们,可以点击 这里

原理

Ansible 管理系统由 控制主机一组被管节点 组成。控制主机直接通过 SSH 控制被管节点,被管节点通过 Ansible 的资源清单(inventory)来进行分组管理,Ansible 采用paramiko 协议库,通过 SSH 或者 ZeroMQ 等连接主机

Ansible 在控制主机将 Ansible模块 通过 SSH 协议推送到被管节点执行,执行完之后自动删除, 控制主机与被管节点之间支持 localSSHZeroMQ 三种连接方式,默认 使用基于SSH 的连接

安装

Centos 7
sudo yum install epel-release
sudo yum install ansible
Ubuntu 14.04
sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible

sudo apt-get update
sudo apt-get install ansible
Mac 10.13.3

用 brew 安装

brew update
brew install Ansible

用 pip 安装

sudo easy_install pip
sudo pip install ansible

源码安装

  • 下载 ansible-2.4.1.0-1 的 源码

  • 解压 tar -zxvf v2.4.1.0-1

  • cd ansible-2.4.1.0-1

  • sudo python setup.py install

遇到的问题

build/temp.macosx-10.13-intel-2.7/_openssl.c:493:10: fatal error: 'openssl/opensslv.h' file not found
#include <openssl/opensslv.h>
         ^~~~~~~~~~~~~~~~~~~~
1 error generated.
error: Setup script exited with error: command 'cc' failed with exit status 1

这是上网找到的解决方案,在命令行上运行:

sudo brew install openssl
sudo env LDFLAGS="-L$(brew --prefix openssl)/lib" CFLAGS="-I$(brew --prefix openssl)/include" pip install cryptography
sudo pip install --upgrade pip

ansible.cfg 的简单配置

ansible 的配置将从下面这四个地方依次地去搜索:

  • ANSIBLE_CONFIG:首先,Ansible命令会检查环境变量,及这个环境变量将指向的配置文件

  • ./ansible.cfg:其次,将会检查当前目录下的ansible.cfg配置文件

  • ~/.ansible.cfg:再次,将会检查当前用户home目录下的.ansible.cfg配置文件

  • /etc/ansible/ansible.cfg:最后,将会检查在用软件包管理工具安装Ansible时自动产生的配置文件

下面说一下几个常用的配置:

  • inventory = /etc/ansible/hosts # 资源清单inventory文件的位置,也可以指向一个目录

  • forks = 5 # 设置多少个进程同时工作

  • sudo_user = root # 设置默认执行命令的用户

  • remote_port = 22 # 连接被管节点的管理端口

  • host_key_checking = False #这是设置是否检查SSH主机的密钥

  • roles_path = /etc/ansible/roles # 角色的文件搜索路径

  • log_path = /var/log/ansible.log # 日志文件

  • timeout = 10 # 设置SSH连接的超时间隔

  • private_key_file=~/.ssh/id.rsa # 设置 ssh 的私钥

说明: 如果是用源码安装的,可以在源码的 example 目录找到 ansible.cfghosts 等等配置,可以把 ansible.cfg 复制到上面四个路径的其中一个

资源清单inventory

几个常用的参数:

  • ansible_ssh_host # 代表 ssh 的地址

  • ansible_ssh_user # 代表 ssh 的认证用户

  • ansible_ssh_pass # 代表 ssh 的认证密码

  • ansible_sudo # 代表 ssh sudo 的用户

  • ansible_sudo_pass # 代表 ssh sudo 的密码

  • ansible_ssh_private_key_file # 代表 ssh 私钥

/etc/ansible/hosts 的简单例子:

常用参数

[test_group]
11.11.11.11 ansible_ssh_user=user1 ansible_ssh_pass=password
22.22.22.22

定义别名和常用参数

[test_group]
test ansible_ssh_host=11.11.11.11 ansible_ssh_user=user1 ansible_ssh_pass=password
22.22.22.22

分组包含分组

[test_group1]
11.11.11.11 ansible_ssh_user=user1 ansible_ssh_pass=password

[test_group2]
22.22.22.22

[dbserver:children]
test_group1
test_group2

说明: 如果使用 ansible_ssh_pass ,要安装 sshpass

测试能否显示上面两台被管节点的home目录的文件

复制 ansible 源码下 example 目录的 ansible.cfg 文件 到 /etc/ansible
cp ansible.cfg /etc/ansible/
修改 /etc/ansible/ansible.cfg 文件的内容,把下面内容前面的 # 去掉
inventory      = /etc/ansible/hosts
forks          = 5
remote_port    = 22
timeout = 10
/etc/ansible/ 目录添加 hosts 文件,内容如下:
[webserver]
11.11.11.11
22.22.22.22
显示被管节点的 home 目录的文件
ansible -m shell -a "ls /home" webserver -u test

说明: -m 代表模块,-a 代表模块参数,webserver 代表资源清单的一个组,-u 代表用哪个用户登录,我这里是使用密钥无密码登录的方式,我们也可以使用 -i 来指定资源清单的路径

【上一篇】sed进阶

【下一篇】ansible的ad-hoc模式