目录
一.ANSIBLE的简要介绍
Ansible 是一个开源的自动化工具,用于配置管理、应用部署、任务自动化以及 IT 编排。它由 Michael DeHaan 于 2012 年创建,并已成为 IT 运维和 DevOps 工具链中的重要组成部分。
1.功能介绍
1. 配置管理(Configuration Management)
Ansible 能够自动化配置文件的管理和系统设置,确保所有系统具有一致的配置。这包括安装软件包、管理文件和目录、配置网络设置等。
2. 应用部署(Application Deployment)
Ansible 可以自动化应用程序的部署过程,从代码库中获取代码、编译、打包到最终部署在服务器上。它支持多种语言和框架,可以与 CI/CD 工具集成,实现持续交付。
3. 编排(Orchestration)
Ansible 可以协调多个节点之间的复杂任务,并确保它们按正确的顺序执行。例如,在多层应用中,可以先部署数据库,再部署应用服务器,最后部署前端。
4. 任务自动化(Task Automation)
通过剧本(Playbooks),用户可以自动执行重复性的任务,如备份、日志清理、用户管理等。这些任务可以在指定的时间或事件触发时自动运行。
5. 云管理(Cloud Provisioning)
Ansible 支持多种云平台(如 AWS、Azure、Google Cloud Platform)的资源管理和配置。用户可以使用 Ansible 自动化创建和配置云资源,如虚拟机、存储、网络等。
6. 网络自动化(Network Automation)
Ansible 提供了专门的网络模块,用于自动化配置网络设备(如路由器、交换机、防火墙)的操作。它支持多种网络供应商和设备类型。
7. 安全合规(Security and Compliance)
Ansible 可以帮助实施和验证安全策略,确保系统符合企业或法规要求。它可以自动化补丁管理、安全设置和合规检查。
8. 多租户支持和访问控制(Multi-Tenancy and Access Control)
Ansible Tower(企业版)提供了角色和权限管理功能,支持多租户环境中的细粒度访问控制,确保不同团队或用户只访问他们有权限的资源。
9. 集成和扩展(Integration and Extensibility)
Ansible 提供了丰富的 API 和插件系统,允许与其他系统和工具集成。用户可以编写自定义模块和插件,以满足特定需求。
10. 高可用性和弹性(High Availability and Scalability)
Ansible Tower 提供了高可用性和扩展性特性,支持大规模分布式环境中的自动化任务管理。
11. 报告和审计(Reporting and Auditing)
Ansible Tower 提供了详细的执行报告和审计日志,帮助用户了解每个自动化任务的执行情况和结果,便于问题排查和合规管理。
12. 可移植性(Portability)
由于 Ansible 使用无代理架构,并通过 SSH 或 WinRM 与目标主机通信,它可以在多种操作系统和环境中工作,包括物理服务器、虚拟机、容器等。
2.ANSIBLE特性
-
简单性: Ansible 设计简单直观,使用 YAML 语法描述任务和配置,易于理解和学习。
-
无代理: Ansible 不需要在被管理的主机上安装代理,只需通过 SSH 或 PowerShell 远程管理即可,降低了部署和维护的复杂性。
-
基于模块: Ansible 使用模块化的方式管理系统,每个任务都是通过调用模块来实现的,支持丰富的模块库。
-
声明式语法: 使用 YAML 描述任务和配置的声明式语法,让用户可以清晰地定义系统状态和所需的配置。
-
可扩展性: Ansible 可以轻松扩展,支持自定义模块和插件,满足各种复杂环境和特定需求。
-
剧本(Playbooks): Ansible 使用 Playbooks 来组织和描述多个任务的执行顺序和条件,支持任务的并行执行和序列化执行。
-
强大的社区支持: Ansible 拥有活跃的社区,提供大量的模块和插件,同时有丰富的文档和示例供用户参考。
-
多平台支持: Ansible 可以管理多种操作系统和云平台,包括 Linux、Windows、VMware、AWS、Azure 等。
-
幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况,此特性非绝对
3.Ansible架构
-
库存 (Inventory):
- 库存文件定义了受控节点的信息,包括它们的分组和连接方式。
- 库存文件可以是简单的 INI 格式,也可以是复杂的 YAML 格式,还可以从动态库存脚本中生成。
-
模块 (Modules):
- 模块是完成特定任务的独立脚本,如安装软件包、管理服务和配置文件等。
- Ansible 在运行过程中将模块临时复制到受控节点并执行。
-
插件 (Plugins):
- 插件扩展了 Ansible 的功能,包括连接插件、回调插件、过滤插件等。
- 插件在 Ansible 的不同操作阶段提供额外的功能和灵活性。
- API:供第三方程序调用的应用程序编程接口
二.Ansible安装和入门
1.本地yum安装
########yum源安装###############
[root@node1 yum.repos.d]#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
[root@node1 yum.repos.d]#yum info ansible
已加载插件:fastestmirror, langpacks
base | 3.6 kB 00:00:00
epeel | 4.7 kB 00:00:00
extras | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
(1/3): epeel/7/group_gz | 96 kB 00:00:00
(2/3): epeel/7/updateinfo | 1.0 MB 00:00:00
(3/3): epeel/7/primary_db | 7.0 MB 00:00:04
Loading mirror speeds from cached hostfile
* base: mirrors.163.com
* epeel: mirrors.aliyun.com
* extras: mirrors.163.com
* updates: mirrors.163.com
可安装的软件包
名称 :ansible
架构 :noarch
版本 :2.9.25
发布 :1.el7
大小 :17 M
源 :epeel/7
简介 : SSH-based configuration management, deployment, and task execution system
网址 :http://ansible.com
协议 : GPLv3+
描述 : Ansible is a radically simple model-driven configuration management,
: multi-node deployment, and remote task execution system. Ansible works
: over SSH and does not require any software or daemons to be installed
: on remote nodes. Extension modules can be written in any language and
: are transferred to managed machines automatically.
[root@node1 yum.repos.d]#yum install ansible -y
yum install epel-release.noarch -y
yum install ansible -y
2.编译安装
#############编译安装#########################
yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
wget https://releases.ansible.com/ansible/ansible-1.5.4.tar.gz
tar xf ansible-1.5.4.tar.gz
cd ansible-1.5.4
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible
###############Git方式#######################
yum install git
git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup
3.查看基本信息
[root@localhost yum.repos.d]# ansible --version
4.相关文件
-
/etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性,也可以在项目的目录中创建此文件,当前目录下如果也有ansible.cfg,则此文件优先生效,建议每个项目目录下,创建独有的ansible.cfg文 件
-
/etc/ansible/hosts 主机清单
-
/etc/ansible/roles/ 存放角色的目录
5.ansible主配置文件
Ansible 的配置文件可以放在多个不同地方,优先级从高到低顺序如下
ANSIBLE_CONFIG #环境变量,注意此项用 ansible --version 看不到,但可以生效
./ansible.cfg #当前目录下的ansible.cfg
~/.ansible.cfg #当前用户家目录下的.ansible.cfg
/etc/ansible/ansible.cfg #系统默认配置文件
Ansible 的默认配置文件 /etc/ansible/ansible.cfg ,其中大部分的配置内容无需进行修改
[defaults]
#inventory = /etc/ansible/hosts #主机列表配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = $HOME/.ansible/tmp #临时py命令文件存放在远程主机目录
#local_tmp = $HOME/.ansible/tmp #本机的临时命令执行目录
#forks = 5 #默认并发数
#sudo_user = root #默认sudo 用户
#ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码
#ask_pass = True
#remote_port = 22
#host_key_checking = False #检查对应服务器的host_key,建议取消此行注释,实现第一次连接自动信任目标主机
#log_path=/var/log/ansible.log #日志文件,建议启用
#module_name = command 、mod #默认模块,可以修改为shell模块
[privilege_escalation] #普通用户提权配置
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False
5.inventory主机清单文件
ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory 主机清单文件中将其分组组织
官方文档:How to build your inventory — Ansible Community Documentation
默认的inventory file 位置在:
/etc/ansible/hosts
参数详细说明
ansible_ssh_host
#将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible_ssh_port
#ssh端口号.如果不是默认的端口号,通过此变量设置.这种可以使用 ip:端口
192.168.1.100:2222ansible_ssh_user
#默认的 ssh 用户名ansible_ssh_pass
#ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)ansible_sudo_pass
#sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)ansible_sudo_exe (new in version 1.8)
#sudo 命令路径(适用于1.8及以上版本)ansible_connection
#与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行.ansible_ssh_private_key_file
#ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.ansible_shell_type
#目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为'csh' 或 'fish'.ansible_python_interpreter
#目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 \*BSD, 或者 /usr/bin/python 不是 2.X 版本的Python.之所以不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26).与ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....
6.示例:
(1)配置远程主机清单
vim /etc/ansible/hosts
[web] #配置组名
192.168.240.12 #组中成员ip
192.168.240.13
(2)设置免密登录
免密登录脚本
#!/bin/bash
PASS=123
#设置网段最后的地址,4-255之间,越小扫描越快
END=254
IP=`ip a s ens33 | awk -F'[ /]+' 'NR==3{print $3}'`
NET=${IP%.*}.
rm -f /root/.ssh/id_rsa
[ -e ./SCANIP.log ] && rm -f SCANIP.log
for((i=3;i<="$END";i++));do
ping -c 1 -w 1 ${NET}$i &> /dev/null && echo "${NET}$i" >> SCANIP.log &
done
wait
ssh-keygen -P "" -f /root/.ssh/id_rsa
rpm -q sshpass || yum -y install sshpass
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $IP
AliveIP=(`cat SCANIP.log`)
for n in ${AliveIP[*]};do
sshpass -p $PASS scp -o StrictHostKeyChecking=no -r /root/.ssh root@${n}:
done
7.ansible相关工具
-
/usr/bin/ansible 主程序,临时命令执行工具
-
/usr/bin/ansible-doc 查看配置文档,模块功能查看工具,相当于man ansible-doc -l |grep 关键字 具体模块名字
-
/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具,相当于脚本
-
/usr/bin/ansible-pull 远程执行命令的工具
-
/usr/bin/ansible-vault 文件加密工具
-
/usr/bin/ansible-console 基于Console界面与用户交互的执行工具
-
/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
8.ansible格式和选项
格式:
ansible <host-pattern> [-m module_name] [-a args]
命令 主机或者清单中的组 -m 指定模块 -a 执行的任务
选项
选项 | 说明 |
--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任务的主机数 |
ansible-doc -l | #查看所有支持的模块 |
ansible-doc ping | #该模块的详细信息 |
ansible-doc file | #查看file模块的详细信息 |
示例:
在本地执行,指定模块ping
9.ansible命令执行过程
1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg
#[root@node1 ~]#ansible all -a "sleep 100" -f4
#cd /root/.ansible/tmp
2. 加载自己对应的模块文件,如:command
3. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
4. 给文件+x执行
5. 执行并返回结果
6. 删除临时py文件,退出$HOME 为当前用户的家目录
执行返回结果
-
绿色:执行成功并且不需要做改变的操作
-
黄色:执行成功并且对目标主机做变更
-
红色:执行失败
10.ansible-console
ansible-console
是 Ansible 提供的一种交互式命令行界面(CLI),允许用户在控制台中直接运行 Ansible 模块和命令。它类似于一个 REPL(Read-Eval-Print Loop)环境,方便用户即时执行和测试 Ansible 命令,而不需要编写和运行完整的 Ansible playbook。
三.Ansible模块
2015年底270多个模块,2016年达到540个,2018年01月12日有1378个模块,2018年07月15日1852个模块,2019年05月25日(ansible 2.7.10)时2080个模块,2020年03月02日有3387个模块虽然模块众多,但最常用的模块也就2,30个而已,针对特定业务只用10几个模块
常用模块帮助文档参考:
https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html https://docs.ansible.com/ansible/2.9/modules/list_of_all_modules.html https://docs.ansible.com/ansible/latest/modules/list_of_all_modules.html https://docs.ansible.com/ansible/latest/modules/modules_by_category.html
1.Command模块
功能:在远程主机执行命令,此为默认模块,可忽略 -m 选项
注意:此命令不支持 $VARNAME < > | ; & 等,可能用shell模块实现
注意:此模块不具有幂等性
注意:不支持一些重定向等功能
示例:
远程执行在12 ,13上创建ky36.txt文件和查看文件
2.shell 模块
功能:和command相似,用shell执行命令,支持各种符号,比如:*,$, >
注意:此模块不具有幂等性
示例:
[root@localhost ~]# ansible web -m shell -a "echo hello > /opt/hello.txt"
#如果没有明确指明文件生成的目录,会默认在家目录下生成
[root@localhost ~]# ansible web -m shell -a "cat /opt/hello.txt"
修改默认模块
vim /etc/ansible/ansible.cfg
3.Script 模块
功能:在远程主机上运行ansible服务器上的脚本(无需执行权限)
注意:此模块不具有幂等性
示例:
在ansible服务器的/data目录下创建脚本test.sh
远程执行ansible服务器上的脚本,注意路径为/data目录下,在主目录下应为/root
4.copy模块
功能:从ansible服务器主控端复制文件到远程主机
注意: src=file 如果是没指明路径,则为当前目录或当前目录下的files目录下的file文件
关键字
src 代表源文件路径
dest 代表文件落地路径
owner 属主
group 属组
mode 代表权限
backup 如果复制时有同名文件会先备份再复制
示例:
ansible web -m copy -a "src=/etc/passwd dest=/data/ owner=zhangsan mode=700"
#将ansible服务器主控端复制文件/etc/passwd到远程主机/data/下,属主为zhangsan 权限为700
etc 不加 / 连etc 一起复制
etc 加 / 只复制etc下的文件
5.Get_url 模块
功能: 用于将文件从http、https或ftp下载到被管理机节点上
url: 下载文件的URL,支持HTTP,HTTPS或FTP协议
dest:下载到目标路径(绝对路径),如果目标是一个目录,就用服务器上面文件的名称,如果目标设置了名称就用目标设置的名称
owner:指定属主
group:指定属组
mode:指定权限
force:如果yes,dest不是目录,将每次下载文件,如果内容改变,替换文件。如果否,则只有在目标不存在时才会下载该文件checksum:对目标文件在下载后计算摘要,以确保其完整性
url_username:用于HTTP基本认证的用户名。对于允许空密码的站点,此参数可以不使用`url_password'
url_password:用于HTTP基本认证的密码。如果未指定`url_username'参数,则不会使用`url_password'参数
validate_certs:如果“no”,SSL证书将不会被验证。适用于自签名证书在私有网站上使用
timeout: URL请求的超时时间,秒为单位
示例:
ansible web -m get_url -a "url=https://nginx.org/download/nginx-1.18.0.tar.gz dest=/opt"
6.Fetch模块
功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录
示例:
将远程主机上的/etc/passwd文件 提取到ansible的主控端/data/目录下
ansible web -m fetch -a "src=/etc/passwd dest=/data"
将远程主机上的/var/log/messages文件 提取到ansible的主控端/data/目录下
ansible服务器切换到目录/data/下,使用tree命令查看文件
7.File模块
功能:设置文件属性,创建软链接等
关键字:
path 指定文件路径
state 文件状态 有:新建(touch) 删除(absent) 文件夹(directory) 连接文件(link)等
src 源文件
mode 权限
owner 属主
group 属组
recurse 递归
示例:
(1)创建空文件
ansible web -m file -a 'path=/mnt/web.txt state=touch owner=zhangsan group=zhangsan mode=755'
(2)新建目录
ansible web -m file -a 'path=/mnt/web state=directory'
(3)新建软链接
ansible web -m file -a 'src=/mnt/web path=/opt/web-link state=link'
#新建软连接 path|dest|name 这三个选项都可以使用
(4)删除文件
ansible web -m file -a 'path=/opt/web-link state=absent'
8.stat 模块
功能:检查文件或文件系统的状态
注意:对于Windows目标,请改用win_stat模块
选项
path:文件/对象的完整路径(必须)
常用的返回值判断:
exists: 判断是否存在
isuid: 调用用户的ID与所有者ID是否匹配
示例:
ansible web -m stat -a 'path=/mnt/test.txt'
查看文件是否存在
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服务器/opt目录上的nginx安装包解压到远程主机上/opt目录下
ansible web -m unarchive -a "src=/opt/nginx-1.18.0.tar.gz dest=/opt"
10.Archive模块
功能:打包压缩保存在被管理节点
path:指定要创建存档的源路径。可以是文件或目录。
dest:指定存档文件的目标路径,包括文件名和扩展名。如果未指定格式(通过
format
参数),则根据扩展名自动推断格式。format:指定存档文件的格式。可选值包括
tar
、tar.gz
、tar.bz2
、tar.xz
、zip
等。如果未指定,Ansible会根据dest
的扩展名自动推断格式。force:如果为
yes
,强制重新创建存档文件(如果已存在)。默认为no
。
示例:
将远程主机的/var/log下日志文件打包到/data/下,文件格式为bz2,属主为root,权限为600
ansible web -m archive -a "path=/var/log dest=/data/log.tar.bz2 format=bz2 owner=root mode=600"
11.Hostname模块
功能:管理主机名
ansible web -m hostname -a 'name=node3 '
#一般不使用此模块,主机名会一致
12.Cron模块
功能:计划任务
支持时间:minute,hour,day,month,weekday
关键字:
name 会生成一行注释,标题
job 执行的命令
示例:
在远程主机上执行计划任务,每周一至周五的凌晨2:30执行test.sh脚本
删除计划任务
13.Yum和Apt模块
功能:yum 管理软件包,只支持RHEL,CentOS,fedora,不支持Ubuntu其它版本apt 模块管理 Debian 相关版本的软件包
name参数: 必须参数,用于指定需要管理的软件包
state参数: 用于指定软件包的状态 ,默认值为。present,表示确保软件包已经安装,除了。present,其他可用值有 installed, latest、absent、removed,其中 installed 与present 等效,latest 表示安装 yum 中最新的版本,absent 和 removed 等效,表示删除对应的软件包。
disable_gpg_check参数: 用于禁用对 rpm 包的公钥 gpg 验证。默认值为 no,表示不禁用验证,设置为 yes 表示禁用验证,即不验证包,直接安装。在 对应的 yum 源没有开启 gpg 验证的情况下,需要将此参数的值设置为 yes,否则会报错而无法进行安装。
enablerepo参数: 用于指定安装软件包时临时启用的 yum 源。假如你想要从A源中安装软件,但是你不确定A源是否启用了,你可以在安装软件包时 将此参数的值设置为 yes,即使A源的设置是未启用,也可以在安装软件包时临时启用A源。
disablerepo参数:用于指定安装软件包时临时禁用的 yum 源。某些场景下需要此参数,比如,当多个 yum 源中同时存在要安装的软件包时,你可以使用此参数临时禁用某个源,这样设置后,在安装软件包时则不会从对应的源中选择安装包。 enablerepo 参数和 disablerepo 参数可以同时使用
参数 | 说明 |
name | 所安装的包的名称 |
state | present--->安装, latest--->安装最新的, absent---> 卸载软件。 |
update_cache | 强制更新yum的缓存 |
conf_file | 指定远程yum安装时所依赖的配置文件(安装本地已有的包)。 |
disable_pgp_check | 是否禁止GPG checking,只用于presentor latest。 |
disablerepo | 临时禁止使用yum库。 只用于安装或更新时。 |
enablerepo | 临时使用的yum库。只用于安装或更新时 |
示例:
在远程主机上安装httpd服务
ansible web -m yum -a "name=httpd state=present"
14.yum_repository模块
功能:建立yum仓库模块
关键字:
name参数: 必须参数,用于指定要操作的唯一的仓库ID,也就是”.repo”配置文件中每个仓库对应的”中括号”内的仓库ID。
baseurl参数: 此参数用于设置 yum 仓库的 baseurl。
description参数: 此参数用于设置仓库的注释信息,也就是”.repo”配置文件中每个仓库对应的”name字段”对应的内容。
file参数: 此参数用于设置仓库的配置文件名称,即设置”.repo”配置文件的文件名前缀,在不使用此参数的情况下,默认以 name 参数的仓库ID作为”.repo”配置文件的文件名前缀,同一个”.repo” 配置文件中 可以存在多个 yum 源。
enabled参数: 此参数用于设置是否激活对应的 yum 源,此参数默认值为 yes,表示启用对应的 yum 源,设置为 no 表示不启用对应的 yum 源。
gpgcheck参数:此参数用于设置是否开启 rpm 包验证功能,默认值为 no,表示不启用包验证,设置为 yes 表示开启包验证功能。
gpgcakey参数: 当 gpgcheck 参数设置为 yes 时,需要使用此参数指定验证包所需的公钥。
state参数: 默认值为 present,当值设置为 absent 时,表示删除对应的 yum 源
示例:
在远程主机上建立本地yum仓库
ansible web -m yum_repository -a 'name=epel description=epel baseurl=https://download.fedoraproject.org/pub/epel/$releasever/$basearch/ gpgcheck=no file=epel'
15.Service模块
功能:管理服务
关键字:
name参数:此参数用于指定需要操作的服务名称,比如 nginx。
state参数:此参数用于指定服务的状态,比如,我们想要启动远程主机中的 nginx,则可以将 state 的值设置为 started;如果想要停止远程主机中的服务,则可以将 state 的值设置为 stopped。此参数的可用值有 started、stopped、restarted、reloaded。
enabled参数: 此参数用于指定是否将服务设置为开机 启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动。
示例:
将远程主机的httpd服务关闭,并设置为开机自启
ansible web -m service -a 'name=httpd state=stopped enabled=yes'
16.mount模块
功能: 挂载和卸载文件系统
常用参数 | 功能 |
---|---|
src | 指定要挂载的设备或分区路径。 |
path | 指定要挂载到的目标路径。 |
fstype | 指定要挂载的文件系统类型。 |
state | 指定挂载状态,可选值为 mounted 、unmounted 或 absent 。 |
opts | 指定挂载选项,例如挂载选项或参数。 |
示例:
将远程主机的光盘永久挂载到/mnt上,文件系统类型为iso9660
ansible web -m mount -a 'src=/dev/sr0 path=/mnt state=mounted fstype=iso9660'
17.User模块
功能:管理用户
comment 用户的描述信息
createhome 是否创建家目录
force 在使用state=absent时, 行为与userdel –force一致.
group 指定基本组
groups 指定附加组,如果指定为(groups=)表示删除所有组
home 指定用户家目录
move_home 如果设置为home=时, 试图将用户主目录移动到指定的目录
name 指定用户名
non_unique 该选项允许改变非唯一的用户ID值
password 指定用户密码,使用 SHA512 hash
remove 在使用state=absent时, 行为是与userdel –remove一致
shell 指定默认shell
state 设置帐号状态,不指定为创建,指定值为absent表示删除
system 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
uid 指定用户的uid
update_ password
always 如果password参数设置的值与用户当前的加密过的密码字符串不一致,则直接更新用户的密码,默认值即为always
on_create 如果password参数设置的值与用户当前的加密过的密码字符串不一致,则不会更新用户的密码字符串,保持之前的密码设定
示例:
在远程主机上创建用户
18.group模块
功能管理组
#创建组
ansible web -m group -a 'name=nginx gid=88 system=yes'
#删除组
ansible web -m group -a 'name=nginx state=absent'
19.reboot模块
功能:重启主机
20.Lineinfile模块
ansible在使用sed进行替换时,经常会遇到需要转义的问题,而且ansible在遇到特殊符号进行替换时,存在问题,无法正常进行替换 。其实在ansible自身提供了两个模块:lineinfile模块和replace模块,可以方便的进行替换一般在ansible当中去修改某个文件的单行进行替换的时候需要使用lineinfile模块
regexp参数 :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。
功能:相当于sed,可以修改文件内容
如匹配到多行默认替换最后一行
path 指定要操作的文件
regexp 使用正则表达式匹配对应的行
line 修改为新的内容
insertafter 将文本插入到“指定的行”之后
insertbefore 将文本插入到“指定的行”之前
state 删除对应的文本时,需要state=absent
backrefs 1.支持后向引用、2.当未匹配到内容则不操作文件
backup 是否在修改文件之前对文件进行备份
create 当要操作的文件并不存在时,是否创建对应的文件
示例:
匹配到远程主机的/etc/httpd/conf/httpd.conf文件中的以listen开头的行,替换为listen8080
匹配'^listen.*'
21.replace模块
该模块有点类似于sed命令,主要也是基于正则进行匹配和替换,建议使用
当匹配到多行时全部替换
示例:
匹配到远程主机的/etc/httpd/conf/httpd.conf文件中的以listen开头的行,替换为listen8080
22.setup模块
功能: setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用,但是如果主机较多,会影响执行速度
可以使用 gather_facts: no 来禁止 Ansible 收集 facts 信息
示例:
收集远程主机的主机名等信息
收集远程主机的ip地址信息
四.Playbook
Ansible Playbook 提供了一种声明性的方式来描述系统配置和应用程序部署,使得自动化任务管理变得更加简单和可维护。通过组织 Playbook,可以实现复杂的系统配置管理,同时保持配置的一致性和可重复性。
vim ~/.vimrc
set ai #相同缩进换行
set ts=2 #tab键转换为空格的数量
1.三种常见的数据格式
-
XML:Extensible Markup Language,可扩展标记语言,可用于数据交换和配置
-
JSON:JavaScript Object Notation, JavaScript 对象表记法,主要用来数据交换或配置,不支持注释
-
YAML:YAML Ain't Markup Language YAML 不是一种标记语言, 主要用来配置,大小写敏感,不支持tab
2.playbook特点
-
playbook 剧本是由一个或多个"play"组成的列表
-
play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作
-
Playbook 文件是采用YAML语言编写的
3.YUML语言介绍
YAML:YAML Ain't Markup Language,即YAML不是标记语言。不过,在开发的这种语言时,YAML的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)
YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者,目前很多最新的软件比较流行采用此格式的文件存放配置信息,如:ubuntu,anisble,docker,kubernetes等
YAML 官方网站:The Official YAML Web Site
ansible 官网: YAML Syntax — Ansible Community Documentation
YAML 语言特性
-
YAML的可读性好
-
YAML和脚本语言的交互性好
-
YAML使用实现语言的数据类型
-
YAML有一个一致的信息模型
-
YAML易于实现
-
YAML可以基于流来处理
-
YAML表达能力强,扩展性好
YAML语法简介
-
在单一文件第一行,用连续三个连字号"-" 开始,还有选择性的连续三个点号( ... )用来表示文件的结尾
-
次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
-
使用#号注释代码
-
缩进必须是统一的,不能空格和tab混用
-
缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
-
YAML文件内容是区别大小写的,key/value的值均需大小写敏感
-
多个key/value可同行写也可换行写,同行使用,分隔
-
key后面冒号要加一个空格 比如: key: value
-
value可是个字符串,也可是另一个列表
-
YAML文件扩展名通常为yml或yaml
支持的数据类型
-
YAML 支持以下常用几种数据类型:
-
标量:单个的、不可再分的值
-
对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
-
数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
4.playbook核心组件
一个playbook 中由多个组件组成,其中所用到的常见组件类型如下:
-
Hosts 执行的远程主机列表
-
Tasks 任务集,由多个task的元素组成的列表实现,每个task是一个字典,一个完整的代码块功能需最少元素需包括 name 和 task,一个name只能包括一个task
-
Variables 内置变量或自定义变量在playbook中调用
-
Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
-
Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
-
tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断
ansible-doc yum
#查看模块 用ansible-doc 加上 模块名 可以查看模块的使用方法和例子
4.1 host组件
Hosts: playbook 中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用 于指定要执行指定任务的主机,须事先定义在主机清单中
one.example.com one.example.com:two.example.com 192.168.1.50 192.168.1.*
Websrvs:dbsrvs #或者,两个组的并集W
ebsrvs:&dbsrvs #与,两个组的交集
webservers:!dbsrvs #在websrvs组,但不在dbsrvs组
4.2 remote_user组件
remote_user: 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户
4.3 task列表和action组件
play的主体部分是task list,task list中有一个或多个task,各个task 按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个task后,再开始第二个task
task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。 如果未提供name,则action的结果将用于输出。
task两种格式:
action: module arguments
#示例: action: shell wall hellomodule: arguments
#示例: shell: wall hello注意:shell和command模块后面跟命令,而非key=value
示例:
(1)在远程主机创建用户test
脚本配置
---
- hosts: web
remote_user: root
gather_facts: no
tasks:
- name: create user
user: name=test uid=2000 shell=/sbin/nologin system=yes create_home=no
远程主机查看
(2)安装httpd并启动
---
- hosts: web
remote_user: root
gather_facts: no
tasks:
- name: install httpd
yum: name=httpd
- name: start httpd
service: name=httpd state=started enabled=yes
4.4 handlers 和 notify
Handlers本质是task list ,类似于MySQL中的触发器触发的行为,其中的task与前述的task并没有本质上的不同,主要用于当关注的资源发生变化时,才会采取一定的操作。而Notify对应的action可用于在每个play的最后被触发,这样可避免多次有改变发生时每次都执行指定的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作
注意:
-
如果多个task通知了相同的handlers, 此handlers仅会在所有tasks结束后运行一 次。
-
只有notify对应的task发生改变了才会通知handlers, 没有改变则不会触发handlers
-
handlers 是在所有前面的tasks都成功执行才会执行,如果前面任何一个task失败,会导致handler跳过执行,可以使用force_handlers: yes 强制执行handler
---
- hosts: web
gather_facts: no
tasks:
- name: add group
group: name=nginx state=present
- name: add user
user: name=nginx state=present group=nginx
- name: web page
copy: src=/etc/yum.repos.d/epel.repo dest=/etc/yum.repos.d
- name: install nginx
yum: name=epel-release.noarch
yum: name=nginx state=present
- name: config file
copy: src=/data/nginx.conf dest=/etc/nginx/
notify:
- restart nginx
- name: web page
copy: src=/data/index.html dest=/usr/share/nginx/html
- name: start nginx
service: name=nginx state=started enabled=yes
handlers:
- name: restart nginx
service: name=nginx state=restarted
- name: stop nginx
service: name=nginx state=restarted
4.5 gather_facts
gather_facts: yes #收集信息(默认为收集信息)
gather_facts: no #表示不收集信息, 但是使用变量时需要收集
4.6 ignore_errors
如果一个task出错,默认将不会继续执行后续的其它task
利用 ignore_errors: yes 可以忽略此task的错误,继续向下执行playbook其它task
示例:
---
- hosts: web
tasks:
- name: error
command: /bin/false
ignore_errors: yes
- name: continue
command: wall continue
运行此脚本时前面出错并不会影响接下来的操作
5.playbook命令
--syntax-check #语法检查,可缩写成--syntax, 相当于bash -n
-C --check #模拟执行,只检测可能会发生的改变,但不真正执行操作,dry run
--list-hosts #列出运行任务的主机
--list-tags #列出tag
--list-tasks #列出task
--limit 主机列表 #只针对主机列表中的特定主机执行
-i INVENTORY #指定主机清单文件,通常一个项对应一个主机清单文件
--start-at-task START_AT_TASK #从指定task开始执行,而非从头开始,START_AT_TASK为任务的name
-v -vv -vvv #显示过程
示例:
检查语法,不执行真正的操作
6.ansible编译安装nginx脚本
在执行脚本前需要关闭防火墙,创建nginx用户
useradd -M -s /sbin/nologin nginx
在ansible服务器中向/usr/lib/systemd/system/nginx.service 写入文件
tee /usr/lib/systemd/system/nginx.service <<eof
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
ExecStart=/apps/nginx/sbin/nginx
ExecReload=/bin/kill -1 $MAINPID
ExecStop=/bin/kill -3 $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
eof
---
- hosts: web
gather_facts: no
tasks:
- name: install packages
yum:
name:
- gcc
- pcre-devel
- openssl-devel
- zlib-devel
- openssl
- openssl-devel
state: present
- name: unarchive
unarchive: src=/opt/nginx-1.18.0.tar.gz dest=/opt
- name: bianyi
command: ./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
args:
chdir: /opt/nginx-1.18.0
- name: make
command: make
args:
chdir: /opt/nginx-1.18.0
- name: make install
command: make install
args:
chdir: /opt/nginx-1.18.0
- name: cpoy service
copy: src=/usr/lib/systemd/system/nginx.service dest=/usr/lib/systemd/system/nginx.service
- name: reload
command: systemctl daemon-reload
- name: link
shell: ln -s /apps/nginx/sbin/nginx /usr/bin
- name: start nginx
service: name=nginx state=started enabled=yes
- name: web page
tags: page
copy: src=/data/index.html dest=/apps/nginx/html
7.tags 标签
在playbook文件中,可以利用tags组件,为特定 task 指定标签,当在执行playbook时,可以只执行特定tags的task,而非整个playbook文件
vim httpd.yml
---
# tags example
- hosts: websrvs
remote_user: root
gather_facts: no
tasks:
- name: Install httpd
yum: name=httpd state=present
- name: Install configure file
copy: src=files/httpd.conf dest=/etc/httpd/conf/
tags: conf
- name: start httpd service
tags: service
service: name=httpd state=started enabled=yes
[root@ansible ~]#ansible-playbook –t conf,service httpd.yml
8.playbook中使用变量
变量名:仅能由字母、数字和下划线组成,且只能以字母开头
vars: #自定义变量,只能在当前play有效
- 变量1: 值1 #格式为key: value
- 变量2: 值2
tasks: #在任务列表中引用变量
-name:
module: {{变量1}}
变量调用方式:
通过{{ variable_name }} 调用变量,且变量名前后建议加空格,有时用"{{ variable_name }}"才生效
变量来源:
-
ansible 的 setup facts 远程主机的所有变量都可直接调用
-
通过命令行指定变量,优先级最高
ansible-playbook -e varname=value test.yml
8.1 使用setup模块中变量
本模块自动在playbook调用,不要用ansible命令调用,生成的系统状态信息, 并存放在facts变量中
facts 包括的信息很多,如: 主机名,IP,CPU,内存,网卡等
facts 变量的实际使用场景案例
-
通过facts变量获取被控端CPU的个数信息,从而生成不同的Nginx配置文件
-
通过facts变量获取被控端内存大小信息,从而生成不同的memcached的配置文件
-
通过facts变量获取被控端主机名称信息,从而生成不同的Zabbix配置文件
[root@localhost data]#ansible localhost -m setup
#查看所有变量
8.2 在playbook 命令行中定义变量
使用 ansible-playbook -e 选项
示例:
在命令中使用变量
安装应用
vim test2.yml
---
- hosts: websrvs
remote_user: root
tasks:
- name: install package
yum: name={{ pkname }} state=present
ansible-playbook -e pkname=httpd
新建用户
---
- hosts: web
gather_facts: no
tasks:
- name: create user
user: name={{ myname }} system=yes create_home=no
- name: create user
user: name={{ myname1 }} system=yes create_home=no
ansible-playbook -e myname=cxk -e myname1=wyf playbook名字
8.3 定义变量文件
[root@localhost data]#vim var
# 定义变量 pkname1 pkname2
pkname1: tree
pkname2: telnet
vim test1.yml
---
- hosts: web
gather_facts: no
tasks:
- name: install {{pkname1}}
yum: name={{pkname1}} state=present
- name: install {{pkname2}}
yum: name={{pkname2}} state=present
[root@localhost data]#ansible-playbook -e "@var" test1.yml
# @代表文件 var 即是文件名
8.4直接在playbook文件中建立变量
使用vars组件
---
- hosts: web
vars:
username: test1
groupname: group1
tasks:
- name: create group
group: name={{ groupname }} state=present
- name: create user
user: name={{ username }} state=present
8.5使用独立的变量文件
可以在一个独立的playbook文件中定义变量,在另一个playbook文件中引用变量文件中的变量,比playbook中定义的变量优化级高
#先写一个变量文件
vim vars.yml
---
# variables file
package_name: mariadb-server
service_name: mariadb#调用这个文件
vim var5.yml
---
#install package and start service
- hosts: dbsrvs
remote_user: root
vars_files:
- vars.yml
tasks:
- name: install package
yum: name={{ package_name }}
tags: install
- name: start service
service: name={{ service_name }} state=started enabled=yes
五.role角色
角色是ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中
运维复杂的场景:建议使用 roles,代码复用度高
roles:多个角色的集合目录, 可以将多个的role,分别放至roles目录下的独立子目录中,如下示例
roles/
mysql/
nginx/
tomcat/
redis/
默认roles存放路径
/root/.ansible/roles
/usr/share/ansible/roles
/etc/ansible/roles
官方文档:
1.Ansible Roles目录编排
roles目录结构如下所示
每个角色,以特定的层级目录结构进行组织
playbook1.yml
playbook2.yml
roles/
project1/
tasks/
files/
vars/
templates/
handlers/
default/
meta/
project2/
tasks/
files/
vars/
templates/
handlers/
default/
meta/
Role各目录作用
-
roles/project/ :项目名称,有以下子目录
-
files/ :存放由copy或script模块等调用的文件
-
templates/:template模块查找所需要模板文件的目录
-
tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
-
handlers/:至少应该包含一个名为main.yml的文件;此目录下的其它的文件需要在此文件中通过include进行包含
-
vars/:定义变量,至少应该包含一个名为main.yml的文件;此目录下的其它的变量文件需要在此文件中通过include进行包含
-
meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其它文件需在此文件中通过include进行包含
-
default/:设定默认变量时使用此目录中的main.yml文件,比vars的优先级低
2.建立role
创建role的步骤
1 创建role的目录结构.在以roles命名的目录下分别创建以各角色名称命名的目录,如mysql等,在每个角色命名的目录中分别创建相关的目录和文件,比如tasks、files、handlers、templates和vars等目录;用不到的目录可以创建为空目录,也可以不创建
2 编写和准备role的功能文件
3 编写playbook文件调用需要的角色应用于指定的主机
针对大型项目使用Roles进行编排
示例:用 ansible-galaxy 创建角色目录的结构
[root@localhost roles]#mkdir -pv /etc/ansible/roles/nginx/{tasks,templates,handlers,files}
mkdir: 已创建目录 "/etc/ansible/roles/nginx/tasks"
mkdir: 已创建目录 "/etc/ansible/roles/nginx/templates"
mkdir: 已创建目录 "/etc/ansible/roles/nginx/handlers"
mkdir: 已创建目录 "/etc/ansible/roles/nginx/files"
[root@localhost roles]#tree
.
└── nginx
├── files
├── handlers
├── tasks
└── templates
5 directories, 0 files
[root@localhost nginx]#vim tasks/main.yml
[root@localhost nginx]#cat tasks/main.yml
- include: group.yml
- include: user.yml
- include: install.yml
- include: config.yml
- include: webpage.yml
- include: service.yml
[root@localhost nginx]#vim tasks/group.yml
- name: groups
group: name=nginx state=present
[root@localhost nginx]#vim tasks/user.yml
- name: user
user: name=nginx state=present
[root@localhost nginx]#vim tasks/install.yml
- name: install epel
yum: name=epel-release.noarch state=present
- name: install nginx
yum: name=nginx state=present
[root@localhost nginx]#vim tasks/config.yml
- name: web file
copy: src=/data/index.html dest=/usr/share/nginx/html/
[root@localhost nginx]#vim tasks/service.yml
- name: start nginx
service: name=nginx state=started
[root@localhost nginx]#tree
.
├── files
├── handlers
├── tasks
│ ├── config.yml
│ ├── group.yml
│ ├── install.yml
│ ├── main.yml
│ ├── service.yml
│ └── user.yml
└── templates
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 运维自动化之ANSIBLE
发表评论 取消回复