ansible简介
ansible是一种自动化运维工具,基于paramiko开发的,并且基于模块化工作,Ansible是一种集成IT系统的配置管理、应用部署、执行特定任务的开源平台。
它是基于python语言,由Paramiko和PyYAML两个关键模块构建。集合了众多运维工具的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身没有批量部署的能力,真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架.ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。
ansible被定义为配置管理工具,配置管理工具通常具有以下功能:
自动化运维工具的对比
| 项目 | Puppet | SaltStack | Ansible |
|---|---|---|---|
| 开发语言 | Ruby | Python | Python |
| 是否有客户端 | 有 | 有 | 无 |
| 是否支持二次开发 | 不支持 | 支持 | 支持 |
| 服务器与远程机器是否相互验证 | 是 | 是 | 是 |
| 服务器与远程机器的通信是否加密 | 是,标准的SSL协议 | 是,使用AES加密 | 是,使用OpenSSH |
| 平台支持 | AIX , BSD, HP-UX, Linux , Mac OSX , Solaris, Windows | BSD, Linux , Mac OS X , Solaris, Windows | AIX , BSD , HP-UX , Linux , Mac OS X , Solaris |
| 是否提供Web UI | 提供 | 提供 | 提供,但是是商业版本 |
| 配置文件格式 | Ruby 语法格式 | YAML | YAML |
| 命令行执行 | 不支持,大师可以通过配置模块实现 | 支持 | 支持 |
ansible基本架构
ansible系统由控制主机和被管理主机组成,控制主机不支持windows平台
组成部分
核心:ansible
核心模块(Core Modules):这些都是ansible自带的模块
扩展模块(Custom Modules):如果核心模块不足以完成某种功能,可以添加扩展模块
插件(Plugins):完成模块功能的补充
剧本(Playbooks):ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行
连接插件(Connectior Plugins):ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件
主机群(Host Inventory):定义ansible管理的主机
ansible特点
部署简单, 只需要在控制主机上部署ansible环境,被控制端上只要求安装ssh和python 2.5以上版本,这个对于类unix系统来说相当与无需配置.
no angents: 被管控节点无需安装agent
no server: 无服务端,使用是直接调用命名
modules in any languages: 基于模块工作, 可以使用任意语言开发模块
易读的语法: 基于yaml语法编写playbook
基于推送模式: 不同于puppet的拉取模式,直接由调用者控制变更在服务器上发生的时间
模块是幂等性的:定义的任务已存在则不会做任何事情,意味着在同一台服务器上多次执行同一个playbook是安全的
模块化:调用特定的模块,完成特定的任务–>(1000个模块)
有paramiko(Python开发出来基于SSH服务的远程通讯模块), pyYAML(playbook基于此模块实现的), jinja2(模板语言)三个关键模块
支持自定义模块
基于Python语言实现
部署简单,基于Python和SSH默认Linux系统已安装),agentless(无代理/无客户端)
安全,基于openssh
支持playbook编排任务(类似于编写脚本)
幂等性:一个任务执行一遍和执行N遍效果是一样的,不重复执行带来意外情况
无需代理不依赖PKI(无需SSL)
可使用任何编程语言写模块
YAML格式,编排任务,支持丰富的数据结构
较强大的多层解决方案(“角色”)
ansible注意事项
执行ansible的主机一般称为主控端,中控,master或堡垒机
主控端Python版本需要2.6或以上
被控端Python版本小于2.4需要安装python-simplejson
被控端如开启SELinux需要安装libselinux-python
windows不能做为主控端
ansible工作原理
ansible主要组成部分功能说明
PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件
INVENTORY:Ansible管理主机的清单/etc/anaible/hosts
MODULES:Ansible执行命令的功能模块,多数为内置的核心模块,也可自定义,ansible-doc –l 可查看模块
PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
API: 供第三方程序调用的应用程序编程接口
ANSIBLE:组合INVENTORY、 API、 MODULES、PLUGINS的绿框,可以理解为是ansible命令工具,其为核心执行工具

ansible执行流程:

Ansible的安装
我们在centos7下要先安装epel库一般yum能够安装ansible
yum -y install epel-release && yum -y install ansible
....
Installed:
ansible.noarch 0:2.9.15-1.el7
Dependency Installed:
python-babel.noarch 0:0.9.6-8.el7 python-cffi.x86_64 0:1.6.0-5.el7 python-enum34.noarch 0:1.0.4-1.el7
python-idna.noarch 0:2.4-1.el7 python-jinja2.noarch 0:2.7.2-4.el7 python-markupsafe.x86_64 0:0.11-10.el7
python-paramiko.noarch 0:2.1.1-9.el7 python-ply.noarch 0:3.4-11.el7 python-pycparser.noarch 0:2.14-1.el7
python2-cryptography.x86_64 0:1.7.2-2.el7 python2-httplib2.noarch 0:0.18.1-3.el7 python2-jmespath.noarch 0:0.9.4-2.el7
python2-pyasn1.noarch 0:0.1.9-7.el7 sshpass.x86_64 0:1.06-2.el7
Complete!
安装完毕查看版本,此时系统中的python 2.7也已经安装完成。
[root@localhost ~]# ansible --version
ansible 2.9.15
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Nov 16 2020, 22:23:17) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
我们编辑ansible的hosts文件以便分组。
cat <<EOF >>/etc/ansible/hosts
[local]
192.168.10.[171:181]
[dbserver]
192.168.10.180
192.168.10.181
EOF
生成key文件以便免密使用
[root@localhost ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:xtKGG5+qDev4DZspYSf3zrbxLprCtC/nTlyQNhNPDg0 root@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
| Eo. |
| B. |
| * o |
| . + + |
| = S |
| =.o. B . |
| + *=.o o |
| *o.%++ |
| .@#=B+o |
+----[SHA256]-----+
使用下列shell脚本拷贝公钥对对应的机器
[root@localhost ~]# tee copykey <<EOF
> for i in `seq -s ' ' 171 181 `
> do
> ssh-copy-id 192.168.10.$i
> done
> EOF
for i in 171 172 173 174 175 176 177 178 179 180 181
do
ssh-copy-id 192.168.10.$i
done
[root@localhost ~]# chmod 755 copykey
执行命令
[root@localhost ~]# ./copykey
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.10.171 (192.168.10.171)' can't be established.
ECDSA key fingerprint is SHA256:fkX8o6EXozFcCnC9L65UG3yXymibmCFDSlO0E92abBY.
ECDSA key fingerprint is MD5:11:4e:71:06:2d:fa:0a:a9:e3:0f:93:f2:dc:fa:43:03.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.10.171's password:
Number of key(s) added: 1
测试免密(选择其中一个即可
[root@localhost ~]# ssh 192.168.10.181
Last login: Tue Dec 1 21:59:45 2020
[root@localhost ~]# exit
logout
Connection to 192.168.10.181 closed.
执行ansi简单代码:
-b --become-user=root 切换到root用户
-m shell 使用shell模块
-a shell模块的命令
[root@localhost ~]# ansible local -b --become-user=root -m shell -a ' yum install net-tools -y'
[WARNING]: Consider using the yum module rather than running 'yum'. If you need to use command because yum is insufficient you can add
'warn: false' to this command task or set 'command_warnings=False' in ansible.cfg to get rid of this message.
192.168.10.173 | CHANGED | rc=0 >>
Loaded plugins: fastestmirror
Determining fastest mirrors
* base: mirrors.ustc.edu.cn
* extras: mirrors.ustc.edu.cn
* updates: mirrors.ustc.edu.cn
Resolving Dependencies
--> Running transaction check
---> Package net-tools.x86_64 0:2.0-0.25.20131004git.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
net-tools x86_64 2.0-0.25.20131004git.el7 base 306 k
Transaction Summary
================================================================================
Install 1 Package
执行简单任务
执行简单任务,我们可以使用shell模块,-m参数,但是可以省略-m shell参数,直接使用-a即可运行
[root@localhost ~]# ansible anserver -a "python --version"
192.168.10.171 | CHANGED | rc=0 >>
Python 2.7.5
192.168.10.174 | CHANGED | rc=0 >>
Python 2.7.5
192.168.10.172 | CHANGED | rc=0 >>
Python 2.7.5
192.168.10.169 | CHANGED | rc=0 >>
Python 2.7.5
[root@localhost ~]# ansible anserver -a " setenforce 0 "
192.168.10.172 | CHANGED | rc=0 >>
192.168.10.171 | CHANGED | rc=0 >>
192.168.10.169 | CHANGED | rc=0 >>
192.168.10.174 | CHANGED | rc=0 >>
执行一个安装nginx任务
tee play.yml <<EOF
- hosts: local
become: yes
become_user: root
tasks:
- name: Install Nginx
yum:
name: nginx
state: installed
update_cache: true
EOF
执行
[root@localhost ~]# ansible-playbook play.yml
PLAY [local] ****************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************
ok: [192.168.10.174]
ok: [192.168.10.175]
ok: [192.168.10.173]
ok: [192.168.10.172]
ok: [192.168.10.171]
ok: [192.168.10.177]
ok: [192.168.10.176]
ok: [192.168.10.180]
ok: [192.168.10.179]
ok: [192.168.10.178]
ok: [192.168.10.181]
TASK [Install Nginx] ********************************************************************************************************************
changed: [192.168.10.175]
ok: [192.168.10.171]
ok: [192.168.10.172]
ok: [192.168.10.174]
ok: [192.168.10.176]
ok: [192.168.10.173]
ok: [192.168.10.180]
ok: [192.168.10.178]
ok: [192.168.10.177]
ok: [192.168.10.179]
ok: [192.168.10.181]
PLAY RECAP ******************************************************************************************************************************
192.168.10.171 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.10.172 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.10.173 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.10.174 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.10.175 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.10.176 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.10.177 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.10.178 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.10.179 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.10.180 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.10.181 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
安装成功
Ansible配置文件参数详解
| /etc/ansible/ansible.cfg | 基本配置文件,找不到其他配置文件此文件生效 |
|---|---|
| ~/.ansible.cfg | 用户当前目录中没有ansible.cfg此文件生效 |
| ./ansible.cfg | 优先级最高 |
2.常用配置参数
| #[default] | 基本信息设定 |
|---|---|
| inventory= | 指定清单路径 |
| remote_user= | 在受管主机上登陆的用户名称,未指定使用当前用户 |
| ask_pass= | 是否提示输入SSH密码,如果公钥登陆设定为false |
| library= | 库文件存放目录 |
| local_tmp= | 本机临时命令执行目录 |
| remote_tmp= | 远程主机临时py命令文件存放目录 |
| forks= | 默认并发数量 |
| host_key_checking= | 第一次连接受管主机时是否要输入yes建立host_key |
| sudo_user= | 默认sudo用户 |
| ask_sudo_pass= | 每次在受控主机执行ansible命令时是否询问sudo密码 |
| module_name= | 默认模块,默认使用command,可以修改为shell |
| log_path= | 日志文件路径 |
| [privilege_escalation] | 身份信息设定 |
|---|---|
| become= | 连接后是否自动切换用户 |
| become_method= | 设定切换用户的方式,通常用sudo |
| become_user= | 在受管主机中切换到的用户,通常为root |
| become_ask_pass | 是否需要为become_method提示输入密码,默认为false |

本文介绍了自动化运维工具Ansible,它基于Python语言,由Paramiko和PyYAML构建,可实现批量系统配置等功能。文中阐述了其基本架构、工作原理,还介绍了在CentOS 7下的安装过程,包括安装epel库、编辑hosts文件等,最后对配置文件参数进行了详解。

1530

被折叠的 条评论
为什么被折叠?



