一、Ansible 功能
- 批量执行远程命令,可以对远程的多台主机同时进行命令的执行
- 批量安装和配置软件服务,可以对远程的多台主机进行自动化的方式配置和管理各种服务
- 编排高级的企业级复杂的IT架构任务, Ansible的Playbook和role可以轻松实现大型的IT复杂架构
- 提供自动化运维工具的开发API, 有很多运维工具,如jumpserver(堡垒机)就是基于 ansible 实现自动化管理功能
二、Ansible 特性
- 模块化:调用特定的模块完成特定任务,支持自定义模块,可使用任何编程语言写模块(账号,软件等)
- Paramiko(python对ssh的实现),PyYAML,Jinja2(模板语言)三个关键模块
- 基于Python语言实现
- 部署简单,基于python和SSH(默认已安装),agentless,无需代理不依赖PKI(无需ssl)
- 安全,基于OpenSSH
- 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况,此特性非绝对
- 支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构 剧本演员要按照 系统按照你规定的方式去执行命令
- 较强大的多层解决方案 role
三、Ansible 安装和入门
########yum源安装###############
vim CentOS-Base.repo
#加入 epel源
[epel]
name=gn
baseurl=https://mirrors.aliyun.com/epel/$releasever/x86_64
https://mirrors.cloud.tencent.com/epel/$releasever/x86_64
https://mirrors.huaweicloud.com/epel/$releasever/x86_64
https://mirrors.tuna.tsinghua.edu.cn/epel/$releasever/x86_64
gpgcheck=0
yum info ansible
yum install ansible -y
四、ansible相关文件
-
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性,也可以在项目的目录中创建此文件,当前目录下如果也有ansible.cfg,则此文件优先生效,建议每个项目目录下,创建独有的ansible.cfg文 件
-
/etc/ansible/hosts 主机清单
-
/etc/ansible/roles/ 存放角色的目录
1.hosts 主机清单文件
ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory 主机清单文件中将其分组组织
默认的inventory file 位置在:
/etc/ansible/hosts
例子:
[local]
192.168.91.100 ansible_connection=local
[web]
192.168.91.101
192.168.91.102
[accp]
192.168.91.103
192.168.91.105
[webserver]
192.168.91.[101:103]
192.168.91.105
#192.168.91.[101:103]:这是一个IP范围表达式,
#表示包含 192.168.91.101、192.168.91.102 和 192.168.91.103 这三个主机。
#192.168.91.105:这是另一个单独的主机IP地址。
[web:children]
web
accp
#web 和 accp:这两个组被包含在 web:children 组中。
#这意味着 web:children 组的所有主机就是 web 组和 accp 组的所有主机的总和。
ansible 192.168.91.105 -m ping
用这个命令可以测试和远程管理的机子是否能通
注:需要设置ssh免密登录
五、ansible命令
执行临时任务一次性任务
1.用法
ansible <host-pattern> [-m module_name] [-a args]
命令 主机或者清单中的组 -m 指定模块 -a 执行的任务
2.选项
--version #显示版本
-m module #指定模块,默认为command
-v #详细过程 -vv -vvv更详细
--list-hosts #显示主机列表,可简写 --list
-C, --check #检查,并不执行
-T, --timeout=TIMEOUT #执行命令的超时时间,默认10s
-k, --ask-pass #提示输入ssh连接密码,默认Key验证
-u, --user=REMOTE_USER #执行远程执行的用户,默认root
-b, --become #代替旧版的sudo 切换
--become-user=USERNAME #指定sudo的runas用户,默认为root vim /etc/sudoers 用户权限
-K, --ask-become-pass #提示输入sudo时的口令
-f FORKS, --forks FORKS #指定并发同时执行ansible任务的主机数
-a #指定执行的命令
例:以root的用户连接用户,并利用root用户执行whoami命令
ansible cc -m shell -a 'whoami' -u root -b -k --become-user=root
六、ansible模块
ansible常用的模块也就2,30个而已,针对特定业务只用10几个模块。
1.Command 模块
功能:在远程主机执行命令,此为默认模块,可忽略 -m 选项
注意:此命令不支持 $VARNAME < > | ; & 等,可能用shell模块实现
注意:此模块不具有幂等性
2.shell模块
功能:和command相似,用shell执行命令,支持各种符号,比如:*,$, > ,
比起command模块shell模块支持复杂的shell命令、管道操作、重定向等,更灵活。
可以使用shell特有的功能和语法。
例子:
ansible cc -m shell -a "echo hello > /opt/hello.txt"
#使用shell模块,执行echo命令在远程管理的主机上新建一个hello.txt文件
3.Script模块
功能:在远程主机上运行ansible服务器上的脚本(无需执行权限)
注意:此模块不具有幂等性
例:
ansible web -m script -a '/root/test.sh'
4.copy模块
功能:从ansible服务器主控端复制文件到远程主机
注意: src=file 如果是没指明路径,则为当前目录或当前目录下的files目录下的file文件
关键字:
src 代表源文件路径
dest 代表文件落地路径
owner 属主
group 属组
mode 代表权限
backup 如果复制时有同名文件会先备份再复制
例子:
ansible web -m copy -a "src=/etc dest=/backup"
ansible web -m copy -a "src=/etc/ dest=/backup"
#etc 不加 / 连etc 一起复制
#etc 加 / 只复制etc下的文件
5.Get_url模块
功能: 用于将文件从http、https或ftp下载到被管理机节点上
例子:
ansible web -m get_url -a "url=https://nginx.org/download/nginx-1.18.0.tar.gz dest=/opt"
6.Fetch模块
功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录
例:
ansible web -m fetch -a 'src=/etc/passwd dest=/mnt'
7.File模块
功能:设置文件属性,创建软链接等
关键字
path 指定文件路径
state 文件状态 有:新建(touch) 删除(absent) 文件夹(directory) 连接文件(link)等
src 源文件
mode 权限
owner 属主
group 属组
recurse 递归
例子:
ansible web -m file -a 'path=/mnt/web.txt state=touch owner=zhangsan group=zhangsan mode=755'
#创建空文件
ansible web -m file -a 'path=/mnt/web state=directory'
#新建目录
ansible web -m file -a 'src=/mnt/web path=/opt/web-link state=link'
#新建软连接 path|dest|name 这三个选项都可以使用
ansible web -m file -a 'path=/opt/web-link state=absent'
#删除文件
8.stat模块
功能:检查文件或文件系统的状态
选项
path:文件/对象的完整路径(必须)
例子:
ansible web -m stat -a 'path=/mnt/test.txt'
#查看是否存在
192.168.91.102 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/opt/mysql",
"secontext": "unconfined_u:object_r:usr_t:s0",
"size": 18,
"state": "directory",
"uid": 0
}
9.unarchive模块
功能:解包解压缩
实现有两种用法:
1、将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes,此为默认值,可省略
2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no
选项
copy:默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,如果设置为copy=no,会在远程主机上寻找src源文件
remote_src:和copy功能一样且互斥,yes表示在远程主机,不在ansible主机,no表示文件在ansible主机上
src:源路径,可以是ansible主机上的路径,也可以是远程主机(被管理端或者第三方主机)上的路径,如果是远程主机上的路径,则需要设置copy=no
dest:远程主机上的目标路径
mode:设置解压缩后的文件权限
例子
ansible web -m unarchive -a 'src=/data/ky.tar.bz2 dest=/mnt'
ansible websrvs -m unarchive -a 'src=https://nginx.org/download/nginx-1.18.0.tar.gz dest=/usr/local/src/ copy=no'
# copy=no 代表压缩文件不是去本机上查找
10.Yum模块
功能:yum 管理软件包,只支持RHEL,CentOS,fedora,不支持Ubuntu其它版本apt 模块管理 Debian 相关版本的软件包
关键字
name 所安装的包的名称
state present--->安装, latest--->安装最新的, absent---> 卸载软件。
update_cache 强制更新yum的缓存
conf_file 指定远程yum安装时所依赖的配置文件(安装本地已有的包)。
disable_pgp_check 是否禁止GPG checking,只用于presentor latest。
disablerepo 临时禁止使用yum库。 只用于安装或更新时。
enablerepo 临时使用的yum库。只用于安装或更新时
例子:
ansible websrvs -m yum -a 'name=httpd state=present' #安装
ansible websrvs -m yum -a 'name=nginx state=present enablerepo=epel' #启用epel源
进行安装
ansible websrvs -m yum -a 'name=* state=lastest exclude=kernel*,foo*' #升级除
kernel和foo开头以外的所有包
ansible websrvs -m yum -a 'name=httpd state=absent' #删除
playbook文件中格式
- name: 安装httpd包
yum:
name: httpd
state: present
- name: 删除nginx包
yum:
name: nginx
state: absent
- name: 更新所有系统包
yum:
name: '*'
state: latest
11.Yum_repository
用途:用于管理YUM软件库的配置。
功能:可以添加、删除和配置YUM软件库。它主要用于设置和管理软件源仓库。
例子:
- name: 添加EPEL库
yum_repository:
name: epel
description: Extra Packages for Enterprise Linux
baseurl: https://download.fedoraproject.org/pub/epel/$releasever/Everything/$basearch
gpgcheck: yes
enabled: yes
- name: 删除自定义库
yum_repository:
name: custom-repo
state: absent
12.Service模块
功能:管理服务
关键字
name参数:
此参数用于指定需要操作的服务名称,比如 nginx。
state参数:
此参数用于指定服务的状态,比如,我们想要启动远程主机中的 nginx,则可以将 state 的值设置为 started;
如果想要停止远程主机中的服务,则可以将 state 的值设置为 stopped。此参数的可用值有 started、stopped、restarted、reloaded。
enabled参数:
此参数用于指定是否将服务设置为开机 启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动。
例子:
ansible all -m service -a 'name=httpd state=started enabled=yes'
ansible all -m service -a 'name=httpd state=stopped'
ansible all -m service -a 'name=httpd state=reloaded'
ansible all -m shell -a "sed -i 's/^Listen 80/Listen 8080/'
/etc/httpd/conf/httpd.conf"
ansible all -m service -a 'name=httpd state=restarted'
13.User模块
功能:管理用户
例子:
#创建用户
ansible all -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root‘
14.Group模块
功能:管理组
例子:
#创建组
ansible websrvs -m group -a 'name=nginx gid=88 system=yes'
#删除组
ansible websrvs -m group -a 'name=nginx state=absent'
15.reboot模块
功能:重启
ansible websrvs -m reboot
16.Lineinfile模块
ansible在使用sed进行替换时,经常会遇到需要转义的问题,而且ansible在遇到特殊符号进行替换时,存在问题,无法正常进行替换 。其实在ansible自身提供了两个模块:lineinfile模块和replace模块,可以方便的进行替换一般在ansible当中去修改某个文件的单行进行替换的时候需要使用lineinfile模块
regexp参数 :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。
如果想进行多行匹配进行替换需要使用replace模块
功能:相当于sed,可以修改文件内容
关键字
path 指定要操作的文件
regexp 使用正则表达式匹配对应的行
line 修改为新的内容
insertafter 将文本插入到“指定的行”之后
insertbefore 将文本插入到“指定的行”之前
state 删除对应的文本时,需要state=absent
backrefs 1.支持后向引用、2.当未匹配到内容则不操作文件
backup 是否在修改文件之前对文件进行备份
create 当要操作的文件并不存在时,是否创建对应的文件
例子:
ansible web -m lineinfile -a "path=/etc/httpd/conf/httpd.conf regexp='^Listen' line='Listen 80'"
ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled'"
ansible all -m lineinfile -a 'dest=/etc/fstab state=absent regexp="^#"'
17.replace模块
类似于sed命令,主要也是基于正则进行匹配和替换,建议使用
例子:
ansible all -m replace -a "path=/etc/fstab regexp='^(UUID.*)' replace='#\1'"
ansible all -m replace -a "path=/etc/fstab regexp='^#(UUID.*)' replace='\1'"
ansible web -m replace -a "path=/etc/httpd/conf/httpd.conf regexp='^Listen.*' line='Listen 80'"
18.setup模块
功能: setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用,但是如果主机较多,会影响执行速度
在每次运行 Playbook 时,Ansible 会自动运行 setup 模块,可以在 Playbook 的任务中直接使用这些变量,而不需要手动调用 setup 模块。
可以使用 gather_facts: no 来禁止 Ansible 收集 facts 信息
常用的 Ansible 变量列表
主机和操作系统信息
ansible_hostname:主机名
ansible_nodename:节点名称(主机名)
ansible_domain:域名
ansible_fqdn:完全限定域名
ansible_os_family:操作系统家族(如 Debian, RedHat)
ansible_distribution:操作系统发行版名称(如 Ubuntu, CentOS)
ansible_distribution_version:操作系统发行版版本
ansible_distribution_major_version:操作系统发行版主版本号
ansible_kernel:内核版本
ansible_architecture:系统架构(如 x86_64)
网络信息
ansible_all_ipv4_addresses:所有 IPv4 地址的列表
ansible_all_ipv6_addresses:所有 IPv6 地址的列表
ansible_default_ipv4:默认 IPv4 路由信息,包括 address(IP 地址)和 gateway(网关)
ansible_default_ipv6:默认 IPv6 路由信息
ansible_interfaces:所有网络接口的列表
ansible_eth0:特定接口(eth0)的详细信息,包括 IP 地址、子网掩码等
硬件信息
ansible_memtotal_mb:总内存大小(MB)
ansible_memfree_mb:可用内存大小(MB)
ansible_processor:处理器信息列表
ansible_processor_vcpus:虚拟 CPU 数量
ansible_processor_cores:每个处理器的核心数
ansible_processor_count:物理处理器数量
ansible_processor_threads_per_core:每个核心的线程数
存储信息
ansible_mounts:挂载点信息,包括挂载点、文件系统类型、大小等
ansible_devices:设备信息,包括磁盘大小、分区信息等
时间和区域信息
ansible_date_time:包含详细日期和时间信息的字典,包括 date(日期)、time(时间)、iso8601(ISO 8601 格式的时间)、tz(时区)等
用户和环境信息
ansible_user_id:当前用户 ID
ansible_user_shell:当前用户的 Shell
ansible_env:当前用户的环境变量
七、Playbook
建议修改vim配置
vim ~/.vimrc
set ai
set ts=2
检查yml文件语法
ansible-playbook --syntax-check 文件名
playbook特点
- playbook 剧本是由一个或多个"play"组成的列表
- play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作
- Playbook 文件是采用YAML语言编写的
playbook核心组件
一个playbook 中由多个组件组成,其中所用到的常见组件类型如下:
- Hosts 执行的远程主机列表
- Tasks 任务集,由多个task的元素组成的列表实现,每个task是一个字典,一个完整的代码块功能需最少元素需包括 name 和 task,一个name只能包括一个task
- Variables 内置变量或自定义变量在playbook中调用
- Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
- Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
- tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断
host组件和remote_user组件
Hosts: playbook 中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务,须事先定义在主机清单中
remote_user: 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务
例子:
- hosts: websrvs
- #选择websrvs组的主机
remote_user: root
#选择远程主机的root用户
task列表
play的主体部分是task list,task list中有一个或多个task,各个task 按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个task后,再开始第二个task
task两种格式:
action: module arguments
#示例: action: shell wall hello
module: arguments
#示例: shell: wall hello
playbook实例
1.发送广播
---
- hosts: web
remote_user: root
tasks:
- name: ping
ping:
- name: wall
shell: wall hello
---
# first yaml file
- hosts: web
remote_user: root
gather_facts: no #不收集系统信息,提高执行效率
tasks:
- name: test network connection
ping:
- name: excute command
command: wall "hello world!"
2.安装httpd,再启动服务
---
- hosts: cc
remote_user: root
tasks:
- name: install httpd
yum:
name: httpd
state: present
- name: start httpd
service:
name: httpd
state: started
enabled: yes
3.安装nginx并且启动
---
- hosts: cc
remote_user: root
tasks:
- name: add repository
yum_repository:
name: epel
description: EPEL YUM repo
baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/
gpgcheck: no
- name: install nginx
yum:
name: nginx
state: present
- name: config file
copy: src=/data/nginx.conf dest=/etc/nginx/nginx.conf
- name: web page
copy: src=/data/index.html dest=/usr/share/nginx/html/index.html
- name: start nginx
service:
name: nginx
state: started
enabled: yes