Ansible的安装及使用

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

ansible简介

ansible是一种自动化运维工具,基于paramiko开发的,并且基于模块化工作,Ansible是一种集成IT系统的配置管理、应用部署、执行特定任务的开源平台。

它是基于python语言,由Paramiko和PyYAML两个关键模块构建。集合了众多运维工具的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

ansible是基于模块工作的,本身没有批量部署的能力,真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架.ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。
ansible被定义为配置管理工具,配置管理工具通常具有以下功能:

自动化运维工具的对比

项目PuppetSaltStackAnsible
开发语言RubyPythonPython
是否有客户端
是否支持二次开发不支持支持支持
服务器与远程机器是否相互验证
服务器与远程机器的通信是否加密是,标准的SSL协议是,使用AES加密是,使用OpenSSH
平台支持AIX , BSD, HP-UX, Linux , Mac OSX , Solaris, WindowsBSD, Linux , Mac OS X , Solaris, WindowsAIX , BSD , HP-UX , Linux , Mac OS X , Solaris
是否提供Web UI提供提供提供,但是是商业版本
配置文件格式Ruby 语法格式YAMLYAML
命令行执行不支持,大师可以通过配置模块实现支持支持

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配置文件参数详解

1.配置文件的分类与优先级

/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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老骥又出发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值