如果做过运维或者网站开发的朋友,一定接触过服务部署,那么一般的服务部署流程是什么呢?找一台Linux机器,安装好运行环境所需要的软件,然后把服务部署上去。一台机器可以这么做,如果是集群呢?每一台都要这么做。假如我们管理了几百台机器,突然有一天公司要求在所有机器上都安装某一款软件,那么手动显然是不行的,这个时候就必须要借助自动化脚本来完成这项任务了。
自动化执行的方式有很多种,最原始的就是shell脚本,但是显然它不能满足我们的需求。常见自动化配置管理工具有很多种,slatstack和ansible是比较流行的两种,而且它们都是用python开发的,但是相对来讲ansible的优势更加明显,主要是因为它拥有大量的模块和插件,而且你在GitHub和gitee上也可以找到很多别人写好的编排剧本,基本拿过来就可以使用了。
Ansible简介
尽管我认为当你看这篇文章的时候,可能对ansible有了至少一丁丁了解,但是简单的介绍还是要说一下的。Ansible是一个开源配置管理工具,可以使用它来自动化任务,部署应用程序实现IT基础架构。Ansible可以用来自动化日常任务,比如,服务器的初始化配置、安全基线配置、更新和打补丁系统,安装软件包等。
Ansible安装
- Centos
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repowget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repoyum clean allyum makecacheyum install -y ansible
- Ubuntu
apt-get install software-properties-commonapt-add-repository ppa:ansible/ansibleapt-get updateapt-get install ansible
- pip安装
pip install ansible
pip这种方式是最方便的,毕竟我们一般都安装了Python,但是可能会有一个问题,安装完以后,我们找不到配置文件,使用ansible --version查看发现config file是none,导致我们没法正常使用,这是为什么呢?因为ansible加载配置文件的路径是有顺序的。
ansible.cfg文件加载顺序
ansible.cfg文件作为配置文件,ansible会在多个路径下进行读取,读取的顺序如下:
- ANSIBLE_CONFIG:环境变量
- ansible.cfg:当前执行目录下
- .ansible.cfg:~/.ansible.cfg
- /etc/ansible/ansible.cfg
所以推荐使用方式是创建一个工程目录,将所有的配置文件都放置在此目录下,这样更方便移植。在ansible.cfg中有如下内容:
[defaults]inventory = ./hostshost_key_checking = False
所以我们使用pip安装后,在主机上通过find命令查找到ansible.cfg,默认会安装到python目录下,将其复制到当前执行目录即可。
配置文件有三个:
- ansible.cfg --ansible的配置文件,一般我们都使用默认配置,只需要改增加一个host_key_checking=False,不使用指纹验证。指纹验证就是当我们在一台Linux机器上ssh登录另一台Linux时,第一次连接会让我们输入Yes/No
- hosts --主机文件清单
- roles --一个配置角色的文件夹,默认里面是空的
配置Ansible主机清单
清单配置中文文档
主机清单通常用来定义要管理的主机信息,包括IP、用户、密码以及SSH key配置。可以分组配置,组与组之间可以配置包含关系,使我们可以按组分配操作主机。配置文件的路径为:/etc/ansible/hosts
基于密码的方式连接
vim /etc/ansible/hosts
# 方式一[web]192.168.133.111 ansible_ssh_user=root ansible_ssh_pass=123456192.168.133.112 ansible_ssh_user=root ansible_ssh_pass=123456192.168.133.123 ansible_ssh_user=root ansible_ssh_pass=123456# 方式二[web]192.168.133.111192.168.133.112192.168.133.123[web:vars]ansible_ssh_user=root ansible_ssh_pass=123456# 方式三[web]192.168.133.111192.168.133.112192.168.133.123# 在/etc/ansible目录下创建目录group_vars,然后再创建文件web.yml,以组名命名的yml文件vim /etc/ansible/group_vars/web.yml# 内容如下ansible_ssh_user: rootansible_ssh_pass: 123456
测试命令
ansible web -a 'ls /'
基于SSH key方式连接
以下命令均在ansible主机执行,无需到被管理机器操作
# 生成ssh key,一路回车,默认生成在/root/.ssh目录下id_rsa和id_rsa.pubssh-keygen# 将公钥拷贝到目标主机ssh-copy-id root@192.168.143.132# 执行以上语句,并输入密码,会在目标主机生成一个文件/root/.ssh/authorized_keys# 之后再连接目标主机就不需要密码了
ad-hoc命令
ad-hoc是临时命令,就像我们执行的shell命令一样,执行完即结束,ad-hoc模式的命令格式如下:
ansible web -m command -a 'df -h'
命令解释:
- ansible:命令
- web:主机名/IP/分组
- -m:指定模块(默认是command,所以可以把-m command这个去掉)
- command:模块名称
- -a:模块参数
- 'df -h':参数值
执行命令返回的结果颜色代表的含义:
绿色:被管理端没有被修改
黄色:被管理端发生变更
红色:执行出现故障
常用模块介绍
ansible官方存在大量的模块,我们使用ansible主要使用的也是因为它有大量的模块和插件,虽然模块很多,但是我们常用的模块就那么几种,下面介绍以下常用模块:
yum命令
示例:
# 安装最新版的Apacheansible web -m yum -a "name=httpd state=latest"# congepel仓库安装罪行的Apacheansible web -m yum -a "name=httpd state=latest enablerepo=epel"# 删除Apache软件包ansible web -m yum -a "name=httpd state=absent"
copy命令
示例:
# 拷贝apache配置文件到目标机器ansible web -m copy -a "src=httpd.conf dest=/etc/httpd/conf/httpd.conf owner=root group=root mode=644"# 拷贝apache配置文件到目标机器,并备份目标文件ansible web -m copy -a