1. 什么是ansible
Ansible是一个用来批量部署远程主机上服务的工具。
这里“远程主机(Remote Host)”是指任何可以通过SSH登录的主机,所以它既可以是远程虚拟机或物理机,也可以是本地主机。
Ansible通过SSH协议实现管理节点与远程节点之间的通信。理论上来说,只要能通过SSH登录到远程主机来完成的操作,都可以通过Ansible实现批量自动化操作。
涉及管理操作:复制文件、安装服务、服务启动停止管理、配置管理等等
2.Ansible特点
Ansible基于Python语言实现,由Paramiko和PyYAML两个关键模块构建。
1)安装部署过程特别简单,学习曲线很平
2)不需要单独安装客户端,只是利用现有的SSHD服务(协议)即可。
3)不需要服务端(no servers)。
4)ansible playbook,采用yaml配置,提前编排自动化任务。
5)ansible功能模块较多,对于自动化的场景支持丰富。
官网: http://docs.ansible.com/ansible/intro_installation.html
3. Ansible原理
1、连接插件connectior plugins用于连接主机 用来连接被管理端
2、核心模块 core modules 连接主机实现操作, 它依赖于具体的模块来做具体的事情
3、自定义模块 custom modules,根据自己的需求编写具体的模块
4、插件 plugins,完成模块功能的补充
5、剧本 playbooks,ansible的配置文件,将多个任务定义在剧本中,由ansible自动执行
6、主机清单 inventor,定义ansible需要操作主机的范围
最重要的一点是 ansible是模块化的 它所有的操作都依赖于模块
(懂Python可以二次开发)
4. 安装Ansible
管理机安装
yum install epel-release -y
yum install ansible -y
其他所有机器:
如果有libselinux-python就不执行下面的命令了。
rpm -qa |grep libselinux-python
yum install libselinux-python -y
5. ansible配置文件
Ansible配置文件:/etc/ansible/ansible.cfg (一般保持默认)
[defaults]
inventory =/etc/ansible/hosts #主机列表配置文件
library =/usr/share/my-modules/#库文件存放目录
remote-tmp=SHOME/.ansible/tmp #临时py命令文件存放在远程主机目录 localtmp =SHOME/.ansible/tmp #本机的临时命令执行目录
forks =5 #默认并发数
sudo_user =root #默认sudo用户
ask-sudo_pass =True #每次执行ansible命令是否询问ssh密码
ask_pass =True
remote_port =22
hostkey-checking = Falser 检查对应服务器的host-key ,建议取消注释
log path=/var/log/ansible.log 日志文件,建议开启
[root@m01 ~]# tree /etc/ansible/
/etc/ansible/
├── ansible.cfg
├── hosts
└── roles
1 directory, 2 files
6. ansible配置文件读取顺序
- ANSIBLE_CONFIG (如果设置了环境变量)
- ansible.cfg (在当前目录中)
- ~/.ansible.cfg (在家目录中)
- /etc/ansible/ansible.cfg
7. 密钥配置
配置密钥
rm -f ~/.ssh/*
#yum install sshpass -y
ssh-keygen -f ~/.ssh/id_rsa -P '' -q
for ip in 7 61 # ip号,为了循环下面的$ip
do
sshpass -p123456 ssh-copy-id -f -i ~/.ssh/id_rsa.pub "-o StrictHostKeyChecking=no" 172.16.1.$ip
done
或者关闭主机密钥检查(不建议)
如果希望禁用此行为,则可以通过编辑`/etc/ansible/ansible.cfg`或`~/.ansible.cfg`:
host_key_checking = False
或者,这可以写入环境变量中:
export ANSIBLE_HOST_KEY_CHECKING=False
8. 普通用户管理
1、管理机与所有被管理机都创建普通用户并sudo授权
vim /etc/sudoers
test ALL=(ALL) NOPASSWD: ALL
添加普通用户 授权all
2、管理机普通用户创建密钥对并分发公钥(上文7中讲过)
3、ansible配置
/etc/ansible/ansible.cfg
...
sudo_user = test
deprecation_warnings = False
private_key_file = /home/test/.ssh/id_rsa
4、测试
ansible web -m copy -a "src=/etc/hosts dest=/root/" -s
ansible-playbook test.yml -s
9. 提示信息颜色
ansible软件颜色信息
绿色: 表示查看信息,对远程主机未做改动的命令
红色: 批量管理产生错误信息
黄色: 对远程主机做了相应改动
粉色: 对操作提出建议或忠告
10. 补充
ansible提供了一下命令用于检测playbook语法 --syntax-check
ansible-playbook test.yml --syntax-check
设置facts缓存
gather_facts: false
优化 Ansible 运行速度,最简单的莫过于设置 facts 缓存了。
设置 facts 缓存
我们可以设置 gather_facts: no 来禁止 Ansible 收集 facts 信息,但是有时候又需要使用 facts 中的内容,这时候可以设置 facts 的缓存。
例如,我们可以在空闲的时候收集 facts,缓存下来,在需要的时候直接读取缓存进行引用。
Ansible 1.8 版本开始,引入了 facts 缓存功能。
Ansible 的配置文件中可以修改 gathering 的值为 smart、implicit 或者 explicit。
smart 表示默认收集 facts,但 facts 已有的情况下不会收集,即使用缓存 facts;
implicit 表示默认收集 facts,要禁止收集,必须使用 gather_facts: False;
explicit 则表示默认不收集,要显式收集,必须使用 gather_facts: Ture。
在使用 facts 缓存时(即设置为 smart),Ansible 支持两种 facts 缓存:redis 和 jsonfile
常见主机信息:
ansible_all_ipv4_addresses: 仅显示ipv4的信息。
ansible_devices: 仅显示磁盘设备信息。
ansible_distribution: 显示是什么系统,例:centos,suse等。
ansible_distribution_major_version: 显示是系统主版本。
ansible_distribution_version: 仅显示系统版本。
ansible_machine: 显示系统类型,例:32位,还是64位。
ansible_eth0: 仅显示eth0的信息。
ansible_hostname: 仅显示主机名。
ansible_kernel: 仅显示内核版本。
ansible_lvm: 显示lvm相关信息。
ansible_memtotal_mb: 显示系统总内存。
ansible_memfree_mb: 显示可用系统内存。
ansible_memory_mb: 详细显示内存情况。
ansible_swaptotal_mb: 显示总的swap内存。
ansible_swapfree_mb: 显示swap内存的可用内存。
ansible_mounts: 显示系统磁盘挂载情况。
ansible_processor: 显示cpu个数(具体显示每个cpu的型号)。
ansible_processor_vcpus: 显示cpu个数(只显示总的个数)。
ansible 常用参数
-m:要执行的模块,默认为command
-a:指定模块的参数
-u:ssh连接的用户名,默认用root,ansible.cfg中可以配置
-b,--become:变成那个用户身份,不提示密码
-k:提示输入ssh登录密码,当使用密码验证的时候用
-s:sudo运行
-U:sudo到哪个用户,默认为root
-K:提示输入sudo密码,当不是NOPASSWD模式时使用
-C:只是测试一下会改变什么内容,不会真正去执行
-c:连接类型(default=smart)
-f:fork多少进程并发处理,默认为5个
-i:指定hosts文件路径,默认default=/etc/ansible/hosts
-I:指定pattern,对已匹配的主机中再过滤一次
-list-host:只打印有哪些主机会执行这个命令,不会实际执行
-M:要执行的模块路径,默认为/usr/share/ansible
-o:压缩输出,摘要输出
--private-key:私钥路径
-T:ssh连接超时时间,默认是10秒
-t:日志输出到该目录,日志文件名以主机命名
-v:显示详细日志