Hi,大家好。今天跟大家聊一聊Ansible。
什么是Ansible?
Ansible是一个批量部署远程主机的工具。远程的主机可以是远程虚拟机,远程物理机,也可以是本地虚拟机, 本地主机。
Ansible能做什么?
Ansible通过SSH协议实现远程节点和管理节点之间的通信。理论上说,只要可以通过SSH登录到的主机上能做的操作,Ansible都可以做到。
类似的软件有哪些?
1.Saltstack
基于python开发,采用c/s架构(服务端和客户端),配置语法用的是YMAL。
2. Ansible
基于python开发,分布式,无需客户端,超轻量级,配置语法也用的是YMAL,使用SSH来管理客户端
Ansible的工作原理
Ansible 在管理节点将 Ansible 模块通过 SSH 协议推送到被管理端执行,执行完之后自动删除,可以使用 SVN 等来管理自定义模块及编排。
我们要用Ansible做什么?
应对交易系统分布式多模块多终端的部署问题,我们现在来尝试使用Ansible加快部署以及快速配置。
安装Ansible
这里以RedHat/CentOS系Linux为例,其他系统请参考ansible的官网。
管理员的电脑上:
安裝Ansible软件
$> # Redhat/CentOS Linux上,Ansible目前放在的epel源中
$> # epel源中包含ansible,直接安装包既可
$> sudo yum install epel-release
$> sudo yum install ansible -y
配置Ansible管理节点和主机的连接
其实就是配置从管理节点到远程主机之间基于key(无密码的方式)的SSH连接:
$> # 生成ssh key
$> ssh-keygen
$> # 拷贝ssh key到远程主机,ssh的时候就不需要输入密码了
$>ssh-copy-id remoteuser@remoteserver
$> # ssh的时候不会提示是否保存key
$>ssh-keyscan remote_servers >> ~/.ssh/known_hosts
验证SSH配置: 在管理节点执行下面的ssh命令,既不需要输入密码,也不会提醒你存储key,那就成功啦。
$> ssh remoteuser@remoteserver
被管理的远程主机:
不需要安装特殊的包,只需要python>2.4,RedHat/CentOS Linux一般安装方式都是默认安装的。
配置Ansible
打开Ansible配置文件/etc/ansible/hosts
$> vim /etc/ansible/hosts
添加被控制组
[webhosts]
192.168.1.10 ansible_ssh_user=root ansible_ssh_pass=passwd
[tg_group]
192.168.2.10 ansible_ssh_user=root
192.168.2.11 ansible_ssh_user=root
[te_group]
192.168.3.11 ansible_ssh_user=root
解释
#ansible_ssh_user=root 是ssh登陆用户
#ansible_ssh_pass=passwd 是ssh登陆密码,如果设置免密钥登陆则可不填
测试各个模块
注意每个模块的用法可以使用 ansible-doc MOD 来查看例如ansible-doc copy
现在ping 你的所有节点
$> ansible all -m ping
192.168.1.10 SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.2.10 SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.2.11 SUCCESS => {
"changed": false,
"ping": "pong"
}
192.168.2.10 SUCCESS => {
"changed": false,
"ping": "pong"
}
哈,至此你已经可以与所有的节点通信啦。
下面我们试一试发布文件到某个结点
$> ansible te_group -m copy -a "src=/run.sh dest=/"
将服务端的run.sh拷贝至被控端的根目录下
192.168.3.11 success >> {
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/run.sh",
"gid": 0,
"group": "root","md5sum":"d41d8cd98f00b204e9800998ecf8427e",
"mode": "0644",
"owner": "root",
"secontext": "system_u:object_r:etc_runtime_t:s0",
"size": 0,
"src": "/root/.ansible/tmp/ansible-tmp1426517500.45-83590373054645/source",
"state": "file",
"uid": 0
}
现在我们要执行他
$> ansible te_group -m copy -a "src=/run.sh dest=/"
192.168.3.11 success >> {
"changed": true,
"rc": 0,
"stderr": "",
"stdout": ""
}
怎么执行命令呢
$> ansible tg_group -m command -a "date"
192.168.2.10 success rc=0 >>
2017年 12月 16日 星期六 15:26:32 DST
192.168.2.11 success rc=0 >>
2017年 12月 16日 星期六 15:26:32 DST
至此我们已经可以简单应用Ansible了。下面我们来使用playbook。
什么是playbook
playbook 字面意思,即剧本,现实中由演员按照剧本表演,在Ansible中,计算机按照剧本表演安装,部署应用,提供对外服务,以及组织计算机处理等各种各样的事情。Ansible可以做的事情都可以用playbook写剧本。
playbook格式
playbook由YMAL语言编写。
YMAL格式是类似于JSON的文件格式,便于人理解和阅读,同时便于书写。
YMAL语法请参考ansible的官网
一个playbook的实例
- hosts: webhosts
sudo: yes
tasks:
- name: 安装Apache
yum: name={{ item }} state=present
with_items:
- httpd
- httpd-devel
- name: 复制配置文件
copy:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
owner: root
group: root
mode: 0644
with_items:
- {
src: "/tmp/httpd.conf",
dest: "/etc/httpd/conf/httpd.conf"
}
- {
src: "/tmp/httpd-vhosts.conf",
dest: "/etc/httpd/conf/httpd-vhosts.conf"
}
- name: 检查Apache运行状态,并设置开机启动
service: name=httpd state=started enabled=yes
执行一下
$> ansible-book temp.yml
好了,现在我们就可以进行平台的自动化部署啦。
领取专属 10元无门槛券
私享最新 技术干货