写博客主要是为了自己方便看,在这个过程中顺便把看到的一些技术点记录下来,加强自己的记忆。
Ansible基本知识
简介
高度模块化,调用特定的模块,完成特定的任务,基于Yaml,来完成批量任务的模板化,来支持playbook。基于Python语言实现,主要使用Paramiko、PyYAML和JinJa2三个关键模块,部署简单(agentless),主从模式,支持自定义模块,支持playbook,幂等性:允许重复执行N次,没有变化时,只会执行第一次。
基本组
主要由模块、插件、主机群、以及剧本的组成,各部分含义如下:
1.核心模块(core modules):Ansible 自带的模块。
2.自定义模块(custom Modules):如果核心模块不足以完成某种功能,可以自行添加自定义模块(支持市面上大部分的编程语言)。
3.插件(Plugins):支持使用插件的方式对ansible本身的功能进行扩展。模块是用来实现任务的,增强ansible平台自己的功能就需要使用插件(loggin插件记录日志,email插件发送邮件)
- 其中最常用是:连接插件(Connectior Plugins) :ansibile基于连接插件连接到各个主机上,虽然默认情况下ansible使用ssh连接到各个主机上,但它还支持其他的连接方法(mq)。
4.主机群(Host Inventory): 主机清单,定义ansible管理的主机,还可以存放一下针对不同主机的变量,也可以写入主机的用户名和密码
5.剧本(playbooks):ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行
运行原理:把命令翻译成shell命令,拷贝到目标主机(/root/.ansible/tmp/下),再执行,执行完毕后删除tmp文件。ansible底层给予Python,以简单著称,配置文件格式也以INI和yaml为主。
下载方式
CentOs系列主机:
apt-get install -y ansible
RedHat系列主机:
yum install -y ansible
Mac下载:
brew install ansible
//也可以使用python的安装命令pip安装:
pip install ansible
Ansible配置文件解析
Inventory用于定于Ansible的主机列表配置,Ansible的自身配置文件只有一个,即ansible.cfg,Ansible安装好之后默认存放在/etc/ansible/目录下。
ansible 查找 Ansible.cfg 文件遵循以下顺序:
1、ANSIBLE_CONFIG环境变量指定的配置文件
2、当前目录下的ansible.cfg文件
3、当前用户home目录下的.ansible.cfg文件
4、Ansible默认的/etc/ansible/ansible.cfg文件
ansible.cfg中常用的配置
- inventory:指定inventory文件的路径
- remote_user:SSH连接时使用的用户名
- remote_port:SSH连接时使用的端口号
- private_key_file:SSH连接时使用的私钥文件
- roles_path:查找roles的路径,可以指定多个查找路径,多个路径之间用冒号分隔
- log_path:Ansible的日志文件路径
- host_key_checking:类似于ssh命令中的StrictHostKeyChecking选项,当等于False时,不检查远程主机是否存在于Konw_hosts文件中
- forks:并行进程的数量
- gathering:控制收集Facts变量的策略
ssh相关
- ssh_args:可以通过这个参数控制Ansible的ssh连接
- pipelining: 多个task之间共享SSH连接,开启pipelining能够有效提升Ansible的执行速度
- control_path:保存ControlPath socket的路径
权限相关
- become:是否进行权限提升
- become_method:权限提升的方式,默认为sudo
- become_user:提升为哪个用户的权限,默认为root
- become_ask_pass:默认为False,表示权限提升时不需要密码(设置为true时,手动输入密码,或者配置ansible_become_pass变量)
Inventory文件配置的变量及参数:
[nginx]
127.0.0.1 ansible_ssh_user=root ansible_ssh_host=web1 # 更细致的配置
- ansible_ssh_user : 用于指定管理远程主机的帐号
- ansible_ssh_host : 用于指定被管理的主机
- ansible_ssh_port :用于指定ssh的端口
- ansible_ssh_private_key_file :指定key文件
- host_key_checking=False :当第一次连接主机时,会提示yes/no,跳过此次环节
[test] # 用于定义主机组,all表示所有主机,所以尽量避免使用all作为组名
127.0.0.1 # 该组的主机列表,可以是主机名(dns解析)或者IP地址,或者用符号来表示连续的主机
192.168.1.[80:88] # 表示 192.168.1.80 - 192.168.1.88<br><br>[web:children] # 表示子组<br>nginx # nginx组<br>test # test组
Ansible命令用法
Ansible命令行的执行方式有Ad-Hoc、Ansible-playbook两种方式,Web化执行方式官方提供了付费产品Tower(10台内免费),个人的化可以基于其提供的API开发类似的Web化产品。这里我们详细说命令后执行的两种方式。
Ad-Hoc主要用于临时命令的执行,Ansible可以理解为Ad-Hoc的集合,通过一定的规则编排在一起。
ansible Ad-Hoc命令主要参数信息
-v, --verbose:输出更详细的执行过程信息,-vvv可以得到执行过程所有信息。
-u : remote user,默认使用root用户登陆
-i : Inventory,指定主机,默认是/etc/ansible/hosts
-m :指定模块的名称(不指定-m,那么默认是command模块)
-a : 模块的参数(比如使用command模块,那么-a参数就是要执行的命令)
-k : 用来提示输入远程主机的密码(基于用户密码登录)
-f : 一次执行几个进程(并发数量),默认为5个
--sudo : 执行命令时使用 sudo 权限(需要用户具有sudo权限)
--key-file: 建立SSH链接的私钥文件
--list-hosts: 列出匹配到的服务器列表
# 基于主机清单:
ansible -i /etc/ansible/hosts test -u root -m command -a 'ls /home' -k (ansible 依赖 sshpass)
|
--> ansible test -a 'ls /home' -k #ansible不指定-m参数,会默认使用command模块
# 上面两条命令默认状态下效果相同
# 我们知道ansible通过ssh的方式来远程管理多台主机,所以我们需要使用ssh key的方式来进行ssh认证,当然你也可以使用ansible的时候加上-k,来通过交互式输入密码。当有了ssh key以后,那么我们就可以直接使用ansbile来执行任务了,比如:ansible all -m ping
# 基于主机:
ansible 127.0.0.1 -m ping
Ansible系列命令用法详解及使用场景介绍
在终端输入ansible后连续按两次Tab键,会补全所以ansible字母开头的命令,主要有下列命令:
- absible
- ansible-galaxy
- ansible-pull
- ansible-doc
- ansible-playbook
- ansible-vault
- ansible-console
我们主要说ansible、ansible-playbook两个命令,其余的后续再讲解。
Ansible
ansible命令是日常工作中使用率非常高的命令之一,主要在一下场景中使用:
- 非固化需求
- 临时一次性操作
- 二次开发调用接口
那么什么是非固化需求和临时一次性操作呢?简单来讲,工作中临时想查看某一组服务器是否存活,或者想临时复制本地的文件到服务器组上做测试,类如这些没有规律的、临时需要做的任务,我们称为非固化需求、临时一次性操作。
//检查服务器存活
ansible web -m ping
//复制文件到远程服务器
ansible web -m copy -a "src=/etc/fstab dest=/tmp/fstab ower=root group=root mode=644 backup=yes"
ansible-playbook
ansible-playbook是日常应用中使用频率最高的命令,其工作机制是:通过读取预先编写好的playbook文件实现批量管理。实现的功能与命令ansible一样,可以理解为按照一定条件组成的ansible任务集。
ansible-play命令使用方式如下:
//执行playbook.yml这个playbook中定义的所以任务集
ansible-playbook playbook.yml