Ansible 介绍和基本使用
基本概述
Ansible 是一款好用的 IT 开源自动化工具,基于 Python Paramiko 模块开发,分布式,不需要客户端,只需在服务端进行操作,使用 SSH 来和节点进行通信。
官方文档:
https://docs.ansible.com/ansible/latest/user_guide/become.html
应用场景
批量执行和分发任务,如:
- 同时在 1000 台服务器上安装 Apache 服务,并在安装后启动服务。
- 将某一个文件一次性拷贝到 1000 台服务器上。
特点
- 部署简单,只需要在 Ansible 控制端部署
- 默认使用 SSH 协议进行管理
- 主从集中化管理
- 配置简单,扩展性强
- 支持 API 及自定义模块,可通过 Python 扩展
- 通过 Playbooks 剧本来定制强大的配置
架构图:
安装
1. 设置 EPEL 仓库(Ansible 仓库默认不在 yum 仓库中,所以要启用 EPEL 仓库):
yum install epel-release -y
2. 使用 yum 进行安装:
yum install ansible -y
3. 查看版本:
ansible --version
Ansible 语法
ansible [-i:主机文件] [-f:批次] [组名] [-m 模块名称] [-a:模块参数]
Ansible 常用参数:
-v,–verbose # 详细模式,如果命令执行成功,输出详细的结果 (-vv –vvv -vvvv)
-i PATH, -inventory=PATH # 指定 host 文件的路径,默认是在 /etc/ansible/hosts
inventory [ˈɪnvəntri] 库存
-f NUM,-forks=NUM # NUM 是指定一个整数,默认是 5 ,指定 fork 开启同步进程的个数。
-m NAME,-module-name=NAM # 指定使用的 module 名称,默认使用 command 模块
-a,MODULE_ARGS #指定 module 模块的参数
-k,-ask-pass #提示输入 ssh 的密码,而不是使用基于 ssh 的密钥认证
-sudo # 指定使用 sudo 获得 root 权限
-K,-ask-sudo-pass #提示输入 sudo 密码,与 -sudo 一起使用
-u USERNAME,-user=USERNAME # 指定移动端的执行用户
-C,–check #测试此命令执行会改变什么内容,不会真正地去执行
使用 ansible-doc:查看各种模块的帮助。
命令格式:
ansible-doc -l #列出所有的模块列表
ansible-doc -s 模块名 #查看指定模块的参数
ansible-doc 模块名 #查看指定模块的详细参数
示例:
ansible-doc copy #查看 copy 模块的帮助
ansible-doc yum #查看 yum 模块的帮助
查看 yum 帮助信息:
EXAMPLES:
- name: install the latest version of Apache
yum:
name: httpd
state: latest
- name: ensure a list of packages installed
yum:
name: "{{ packages }}"
vars:
packages:
- httpd
- httpd-tools
- name: remove the Apache package
yum:
name: httpd
state: absent
基本使用
定义主机清单(有两种方式:一种基于端口,用户名密码,一种基于 SSH 密钥)
1. 基于端口、用户名、密码定义清单
格式:
- ansible_ssh_port:指定 SSH 端口
- ansible_ssh_user:指定用户
- ansible_ssh_pass:指定密码
- ssh_sudo_pass:指明 sudo 时候的密码
2. 基于 SSH 密钥来访问定义清单
在 ansible 服务端生成秘钥,并且复制公钥到节点中
ssh-keygen 一直回车,
#一键生成
ssh-keygen -f ~/.ssh/id_rsa -P '' -q
使用 ssh-copy-id 命令复制 Ansible 公钥到节点:
ssh-copy-id root@192.168.186.142
使用 sshpass 批量分发密钥到服务器
[root@game scripts]# cat scp_isa.sh
#!/bin/bash
ip=(130 131 132 133)
for i in ${ip[@]}
do
sshpass -p"Skills39" ssh-copy-id -i /root/.ssh/id_rsa.pub "-o StrictHostKeyChecking=no" root@192.168.228.$i
done
服务端查看效果:
[root@game ~]# cat /root/.ssh/known_hosts
192.168.228.130 ecdsa-sha2-nistp256 AAAAE2VjZHNhL.....AuHi+n9iVPC0Of9D/MKK8lWuGHg=
192.168.228.131 ecdsa-sha2-nistp256 AAAAE2VjZHNh...d8FX4mqoYCp43E2knM9t8YAZGg/k08=
192.168.228.132 ecdsa-sha2-nistp256 AAAAE2VjZHNhL....y6U2tCs+SU/Sg+rGR8E76lqC316Q=
192.168.228.133 ecdsa-sha2-nistp256 AAAAE2....iTuiJ+0VNOYrhh2gqW36XJVlW1+p6pj2dbo=
服务端测试面密钥登录
ssh 192.168.228.130
配置清单书写:
#/etc/ansible/hosts
[db-server]
192.168.186.142
192.168.186.135
#网段范围写法
[all]
192.168.228.[130:133]
#如果写主机名,需要在 /etc/hosts 里面写
[a]
k8s-master
#/etc/hosts
[root@game ~]# cat /etc/hosts
192.168.228.130 k8s-master
Ansible 常用模块的使用
提示:在传送命令下载的时候如果此前有操作过,那些会显示执行成功,但是会显示绿色。
传送显示颜色信息说明:
- 黄色:对远程节点进行相应修改
- 绿色:对远程节点不进行相应修改
- 红色:操作执行有问题
- 紫色:表示对命令执行发出警告信息(可能存在问题)
常见模块概览:
#常用模块 示例
command #ansible k8s-node -m command -a 'uptime'
shell #ansible k8s-node -m shell -a "free -m"
scripts #ansible k8s-node -m script -a "/etc/ansible/init.sh"
copy #ansible k8s-node -m copy -a "src=/etc/hosts dest=/tmp owner=root group=root mode=0755"
yum #ansible k8s-node -m yum -a "name=httpd state=latest"
yum_repository #添加 yum 仓库,用法可 ansible-doc yum_repository 查看帮助
group #ansible k8s-node -m group -a "name=www gid=666"
user #ansible k8s-node -m user -a "name=user1 state=present"
service #ansible k8s-node -m service -a "name=httpd state=restarted"
file #ansible k8s-node -m file -a "path=/data state=directory owner=www group=www recurese=yes"
recurese(递归授权) state=touch(创建文件)
sysctl #ansible k8s-node -m sysctl -a "name=net.ipv4.ip_forward value=1 reload=yes"
stat #ansible k8s-node -m stat -a "path=/tmp/hosts"
get url #ansible k8s-node -m get_url -a "url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm dest=/tmp/ mode=0440 force=yes"
cron #ansible k8s-node -m cron -a "name=list minute=*/30 job='ls tmp'"
setup
mount
#参数解释:-m:指定模块名,-a:命令参数
command 模块
为默认的模块,不指定 -m
参数时,就是使用 command 模块。
有些命令不能执行,如:<
、|
、>
、&
等。缺点:不支持管道,无法批量执行命令。
示例:检查 Ansible 节点的内核版本。
[root@k8s-master ~]# ansible k8s-node -a 'uname -r'
192.168.86.132 | CHANGED | rc=0 >>
3.10.0-1062.el7.x86_64
192.168.86.133 | CHANGED | rc=0 >>
3.10.0-1062.el7.x86_64
#提示:不指定 hosts 文件,默认使用/etc/ansible/hosts
shell 模块
#在远程命令通过/bin/sh 执行,支持各种命令
[root@k8s-master ~]# ansible k8s-node -m shell -a "free -m"
#提示:
#-a:是指定模块需要执行的命令
#-m:指定模块名
192.168.86.133 | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 1819 190 1391 9 237 1479
Swap: 2047 0 2047
192.168.86.132 | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 1819 194 1366 9 258 1473
Swap: 2047 0 2047
scripts 模块
使用 scripts 模块可以在本地写一个脚本,在远程服务器上执行。
示例:
[root@k8s-master ansible]# cat /etc/ansible/init.sh
#!/bin/bash
date
hostname
#执行
[root@k8s-master ansible]# ansible k8s-node -m script -a "/etc/ansible/init.sh"
192.168.86.133 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.86.133 closed.\r\n",
"stderr_lines": [
"Shared connection to 192.168.86.133 closed."
],
"stdout": "Sun Apr 26 23:50:48 EDT 2022\r\nnode2\r\n",
"stdout_lines": [
"Sun Apr 26 23:50:48 EDT 2022",
"node2"
]
}
192.168.86.132 | CHANGED => {
.....
}
copy 模块
功能:实现主控制端向目标主机拷贝文件,类似 scp 功能。
例如:将 Ansible 主机上的 /etc/hosts 文件复制到主机组中的 /tmp 目录下。
[root@k8s-master ~]# ansible k8s-node -m copy -a "src=/etc/hosts dest=/tmp owner=root group=root mode=0755"
192.168.86.133 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa",
"dest": "/tmp/hosts",
"gid": 0,
"group": "root",
"md5sum": "54fb6627dbaa37721048e4549db3224d",
"mode": "0755",
"owner": "root",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 158,
"src": "/root/.ansible/tmp/ansible-tmp-1590378818.52-2470-232195177895701/source",
"state": "file",
"uid": 0
}
#参数解释:
src: 指定源文件
dest: 指定目标文件
owner: 所属主
group: 所属组
mode: 权限
#查看效果
[root@node1 ~]# cd /tmp/
[root@node1 tmp]# ls -l
total 4
-rwxr-xr-x. 1 root root 158 Apr 26 23:53 hosts
yum 模块
yum 模块可以提供的 status 状态:latest、present、installed,更多信息使用 ansible-doc 查看帮助。
例子:安装 httpd。
[root@k8s-master ~]# ansible k8s-node -m yum -a "name=httpd state=latest"
#提示:name=包名
移除
tasks:
- name: install httpd Packages
yum: name=httpd state=removed
yum_repository 添加仓库模块
[root@game project]# cat task_2.yml
- hosts: all
tasks:
- name: Add Nginx Repo
yum_repository:
name:
CentOS-nginx
description:
EPEL Nginx repo
baseurl:
http://nginx.org/packages/centos/7/$basearch/
gpgcheck:
no
enabled:
yes
#更多参数可参考 ansible-doc yum_repository
service 模块
远程主机系统服务管理
service 常用参数:
- name 参数:用户指定需要操作的服务名称,如:nginx
- state 参数:指定服务的状态,启动服务为 started,停止位 stopped,重启为 restarted
- enabled 参数:设置为开启启动,yes 为开机启动,no 不开机启动
例子:重启 httpd 服务。
[root@k8s-master ~]# ansible k8s-node -m service -a "name=httpd state=restarted"
user 用户模块
例如:添加用户
[root@k8s-master ~]# ansible k8s-node -m user -a "name=user1 state=present"
#提示:更多命令查看帮助 ansible-doc user
cron 定时任务模块
设定定时任务:远程主机 crontab 配置。
例子:增加每 30 分钟执行 ls /tmp
。
[root@k8s-master ~]# ansible k8s-node -m cron -a "name=list minute=*/30 job='ls tmp'"
192.168.86.133 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": [
"list"
]
}
192.168.86.132 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": [
"list"
]
}
查看效果
[root@node1 ~]# crontab -l
#Ansible: list
*/30 * * * * ls tmp
setup 模块
setup 模块主要用于收集远程主机的基本信息,可以作为变量来获取。
相关参数:
ansible_all_ipv4_addresses # ipv4 的所有地址
ansible_all_ipv6_addresses # ipv6 的所有地址
ansible_date_time # 获取到控制节点时间
ansible_default_ipv4 # 默认的 ipv4 地址
ansible_distribution # 系统
ansible_distribution_major_version # 系统的大版本
ansible_distribution_version # 系统的版本号
ansible_domain #系统所在的域
ansible_env #系统的环境变量
ansible_hostname #系统的主机名
ansible_fqdn #系统的全名
ansible_machine #系统的架构
ansible_memory_mb #系统的内存信息
ansible_os_family # 系统的家族
ansible_pkg_mgr # 系统的包管理工具
ansible_processor_cores #系统的 cpu 的核数(每颗)
ansible_processor_count #系统 cpu 的颗数
ansible_processor_vcpus #系统 cpu 的总个数=cpu 的颗数*CPU 的核数
ansible_python # 系统上的 python
ansible cache -m setup -a 'filter=*processor*' # 用来搜索
Ansible-Playbook 介绍和使用
Playbook 简单介绍
Playbook 翻译过来就是剧本,以 yml/yaml 为后缀结尾的一个文本文件。
Playbook 组成:分为两部分 play(定义主机的角色)和 task(具体执行什么任务)。
- play(找谁)如
- hosts: update()
- tasks(干什么)如:安装软件包括文件
Playbook 命令帮助:
[root@k8s-master ~]# man ansible-playbook
[root@k8s-master ~]# ansible-playbook -h
#语法格式:ansible-playbook [option] playbook.yml [playbook2 ….]
常用参数:
-C, --check #检查,运行但是不做任何的操作
-f FORKS, --forks=FORKS #用来做并发
--list-hosts #列出主机列表
--syntax-check #进行语法检查
Playbook 书写格式: