Ansible模块
一、Ansible
1.简介
Ansible是自动化运维工具,能实现跨主机对应用编排管理部署。
Ansible能批量配置、部署、管理上千台主机,是应用级别的跨主机编排工具。
比如以前需要切换到每个主机上执行的一或多个操作,使用Ansible只需在固定的一台Ansible控制节点上去完成所有主机的操作。
2.工作原理
读取配置:
Ansible 从主机清单文件中读取目标主机信息。
读取 Playbook 文件,解析任务和操作。
建立连接:
使用 SSH 或其他指定的连接插件与目标主机建立连接。
执行任务:
按照 Playbook 中定义的顺序执行任务。
每个任务调用相应的模块,在目标主机上执行操作。
报告结果:
收集并汇总每个任务的执行结果。
根据需要显示结果或者记录日志。
3.Ansible的特性
特性一:Agentless,即无Agent的存在
1)无客户端agent存在,不需要在被控制的节点上安装额外的客户端应用;
2)通过ssh协议与被控制节点通信。
特性二:幂等性
所谓幂等性,指的是无论执行多少次同样的运算,结果都是相同的,即一条命令,任意多次执行所产生的影响均与一次执行的影响相同。
Ansible的很多模块具有幂等性,如果多次模块操作的状态没有发生改变,则不会重复执行。
-
INVENTORY:Ansible管理主机的清单 /etc/anaible/hosts 需要管理的服务清单
-
MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
-
PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
-
API:供第三方程序调用的应用程序编程接口
Ansible 命令执行来源
-
USER 普通用户,即SYSTEM ADMINISTRATOR
-
PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件
-
CMDB(配置管理数据库) API 调用
-
PUBLIC/PRIVATE CLOUD API调用
二、Ansible环境安装部署
角色 | IP | 安装工具 |
---|---|---|
管理端 | 192.168.100.254 | ansible |
被管理端1 | 192.168.100.146 | 无需安装 |
被管理端2 | 192.168.100.150 | 无需安装 |
1.安装ansible
#先安装 epel 源 yum install -y epel-release #yum安装ansible yum install -y ansible
2.查看基本信息
ansible --version
3.配置远程主机清单
cd /etc/ansible vim hosts [webservers] #配置组名 192.168.100.146 #组里包含的被管理的主机IP地址或主机名(主机名需要先修改/etc/hosts文件) [dbservers] 192.168.100.150
#配置密钥对验证 ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa yum install -y sshpass sshpass -p '123' ssh-copy-id -o StrictHostKeyChecking=no root@192.168.100.146 sshpass -p '123' ssh-copy-id -o StrictHostKeyChecking=no root@192.168.100.150
#免密登录测试,以被管理端1为例 ssh 192.168.100.146
- /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模块的官网平台
执行临时任务一次性任务
#用法 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任务的主机数
[root@node1 ~]#ansible-doc -l #查看所有支持的模块 [root@node1 ~]#ansible-doc -l |wc -l 3387 [root@node1 ~]#ansible-doc -l |grep ^ping ping Try to connect to host, verify a usable ... pingdom Pause/unpause Pingdom alerts q [root@node1 ~]#ansible-doc ping #该模块的详细信息 [root@node1 ~]#ansible-doc -s ping #简单模块 [root@node1 ~]#ansible-doc file #幂等性,安全性,自己写脚本
#此工具可交互执行命令,支持tab,ansible 2.0+新增 提示符格式 执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$ 常用子命令: 设置并发数: forks n 例如: forks 10 切换组: cd 主机组 例如: cd web 列出当前组主机列表: list 列出所有的内置命令: ?或help root@all (4)[f:5]$ cd web root@web (2)[f:5]$ root@web (2)[f:5]$ forks 1 root@web (2)[f:1]$ [root@node1 ~]#ansible-console Welcome to the ansible console. Type help or ? to list commands. root@all (4)[f:5]$ ping #直接使用模块
此工具用于执行编写好的 playbook 任务 范例 ansible-playbook hello.yml cat hello.yml --- #hello world yml file - hosts: websrvs remote_user: root gather_facts: no tasks: - name: hello world command: /usr/bin/wall hello world
三、Ansible的模块
1.Command模块
功能:在远程主机执行命令,此为默认模块,可忽略 -m
选项。
注意:此命令不支持 $VARNAME < > | ; & 等,即不支持管道符、重定向符号。
注意:此模块不具有幂等性
#基本格式 ansible <组名/IP> [-m command] -a '[参数] 命令'
常用参数 | 功能 |
---|---|
chdir | 在远程主机上运行命令前,提前进入目录 |
creates | 判断指定文件是否存在,如果存在,不执行后面的操作 |
removes | 判断指定文件是否存在,如果存在,执行后面的操作 |
#指定组/IP执行命令 ansible 192.168.100.146 -m command -a 'date' ansible webservers -a 'date' #忽略-m选项,默认使用command格式
#chdir参数 ansible all -m command -a "chdir=/home ls ./"
#creates参数 ansible all -m command -a "creates=/opt/test.txt ls ./"
#removes参数 ansible all -m command -a "removes=/opt/test.txt ls ./"
2.shell模块
功能:和command模块类似,在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开一个子shell运行命令。
注意:此模块不具有幂等性
注意:此模块支持管道符号等功能
#基本格式 ansible <组/IP/all> -m shell -a ' '
#shell模块能够使用管道符 ansible dbservers -m shell -a "ifconfig | awk 'NR==2 {print \$2}'"
3.script 模块
功能:在远程主机执行shell脚本。
注意:script模块不具有幂等性,所以建议用剧本来执行。
#在本地写一个脚本 vim test.sh #!/bin/bash echo "hello ansible from script" > /opt/test2.txt chmod +x test.sh #给脚本执行权限
ansible dbservers -m script -a '/opt/test.sh' #远程运行本地脚本 ansible dbservers -a 'cat /opt/test2.txt' #查看生成的文件内容
4.copy模块
功能:从ansible服务器主控端复制文件到远程主机
注意:src=file 如果是没指明路径,则为当前目录或当前目录下的files目录下的file文件
#基本格式 ansible < > -m copy -a 'src= dest= [owner= ] [mode=] '
常用参数 | 功能 | 注意事项 |
---|---|---|
src | 指出源文件的路径,可以使用相对路径或绝对路径,支持直接指定目录 | 如果源是目录则目标也要是目录 |
dest | 指出复制文件的目标及位置,使用绝对路径 | 如果源是目录,指目标也要是目录,如果目标文件已经存在会覆盖原有的内容 |
mode | 指出复制时,目标文件的权限 | |
owner | 指出复制时,目标文件的属主 | |
group | 指出复制时,目标文件的属组 | |
content | 指出复制到目标主机上的内容 | 不能与src一起使用 |
ansible dbservers -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak owner=root mode=640' ansible dbservers -a 'ls -l /opt' ansible dbservers -a 'cat /opt/fstab.bak'
ansible dbservers -m copy -a 'content="helloworld" dest=/opt/hello.txt' #将helloworld写入/opt/hello.txt文件中 ansible dbservers -a 'cat /opt/hello.txt'
在 Ansible 的 playbook 中,使用 copy
模块可以实现文件复制,同时可以保留文件的权限。通过 copy
模块的 mode
, owner
, 和 group
参数,可以确保复制后的文件权限、所有者和组与源文件相同。
但是,如果你想自动保持源文件的权限而不手动指定这些参数,你可以使用 stat
模块来获取源文件的权限信息,然后在 copy
模块中使用这些信息。
下面是一个示例 playbook,它展示了如何使用 stat
模块获取源文件的权限信息,并在 copy
模块中应用这些信息:
- name: Copy nginx.conf while preserving permissions hosts: your_host_group tasks: - name: Get file permissions of the source file stat: path: /usr/local/nginx/conf/nginx.conf register: src_file_stat - name: Copy the nginx.conf file copy: src: /usr/local/nginx/conf/nginx.conf dest: /etc/nginx/nginx.conf owner: "{{ src_file_stat.stat.pw_name }}" group: "{{ src_file_stat.stat.gr_name }}" mode: "{{ src_file_stat.stat.mode | format('%04o') }}"
在 Ansible 中,register 是一个关键字,用于将任务执行的结果保存到一个变量中,以便后续任务使用或检查。具体来说,register 可以用在任何模块执行任务中,比如 command、shell、copy、template 等模块中。
解释:
-
获取源文件权限信息:
- 使用
stat
模块来获取/usr/local/nginx/conf/nginx.conf
文件的状态信息并存储在src_file_stat
变量中。
- 使用
-
复制文件并应用权限:
- 使用
copy
模块来复制文件。 owner
: 设置文件的所有者,使用从stat
模块中获取的值{{ src_file_stat.stat.pw_name }}
。group
: 设置文件的组,使用从stat
模块中获取的值{{ src_file_stat.stat.gr_name }}
。mode
: 设置文件的权限,使用从stat
模块中获取的值{{ src_file_stat.stat.mode }}
,并将其格式化为四位八进制字符串'%04o'
。
- 使用
这样,复制后的文件 /etc/nginx/nginx.conf
将具有与源文件 /usr/local/nginx/conf/nginx.conf
相同的权限、所有者和组。
#基本格式
ansible < > -m get_url -a "url= dest="
ansible web -m get_url -a 'url=https://nginx.org/download/nginx-1.18.0.tar.gz dest=/opt'
功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录
#基本格式 ansible < > -m fetch -a "src= dest="
ansible webservers -m fetch -a 'src=/etc/passwd dest=/mnt'
7.file模块
功能:在远程主机管理文件属性、创建软链接等
#基本格式 ansible < > -m file -a ''
常用参数 | 功能 |
---|---|
path | 指定远程服务器的路径,也可以写成"dest",“name” |
state | 状态,可以将值设定为directory表示创建目录,设定为touch表示创建文件,设定为link表示创建软链接,设定为hard表示创建硬连接,设定为absent表示删除目录文件或链接 |
mode | 文件复制到远程并设定权限,默认file=644,directory=755 |
owner | 文件复制到远程并设定属主,默认为root |
group | 文件复制到远程并设定属组,默认为root |
recurese | 递归修改 |
src | 指的是目标主机上的源文件。与copy模块不同 |
#修改文件的属主属组权限等 ansible dbservers -m file -a 'owner=test01 group=mysql mode=644 path=/opt/fstab.bak'
#软连接 state=link ansible dbservers -m file -a 'src=/opt/fstab.bak dest=/opt/fstab.link state=link'
#创建一个空文件,state=touch ansible dbservers -m file -a "path=/opt/abc.txt state=touch" #创建一个空目录,state=directory ansible dbservers -m file -a "path=/data state=directory"
#删除一个文件,state=absent ansible dbservers -m file -a "path=/data/123.txt state=absent" ansible dbservers -a 'removes=/data/123.txt ls ./'
功能:检查文件或文件系统的状态
注意:对于Windows目标,请改用win_stat模块
#基本格式 ansible < > -m stat -a 'path= '
ansible webservers -m stat -a 'path=/mnt/test.txt'
9.unarchive 模块
功能:将本地或远程主机的压缩包在远程主机解压缩 。
常用参数 | 功能 |
---|---|
copy | 指定是否将打包文件复制到远程节点以进行解压缩。 |
remote_src | (已弃用)改用 copy 参数。 |
src | 指定要解压缩的打包文件路径,可以是本地路径或远程路径。 |
dest | 指定要将文件解压缩到的目标目录。 |
creates | 指定一个文件路径,如果该文件已经存在,则不进行解压缩操作。 |
remote_tmp | 用于制定远程节点上的临时目录。默认为 /tmp |
#copy参数
copy参数的可选值为 `yes` 或 `no`。
默认为 `yes`,即先将文件从控制节点复制到远程节点,然后在远程节点上进行解压缩。
如果已经将文件分发到了目标节点并想要提高效率,可以将该值设置为 `no`。
反效果的参数为 `remote_src`。
#现在ansible主机建立压缩包 tar cf test.tar.gz test.sh #将 ansible 主机的压缩文件拷贝到到远程主机并解压,修改文件所属组和用户 ansible dbservers -m unarchive -a "src=/opt/test.tar.gz dest=/root copy=yes"
功能:将被管理节点上的文件进行打包压缩保存在被管理节点
ansible webservers -m archive -a 'path=/var/log/ dest=/data/log.tar.bz2 format=bz2 owner=hx mode=0600'
11.hostname模块
功能:用于管理远程主机上的主机名
#修改主机名 ansible dbservers -m hostname -a "name=mysql01"
功能:在远程主机定义crontab任务计划。
#基本格式 ansible <组/IP/all> -m cron -a ' '
常用参数 | 功能 |
---|---|
minute/hour/day/month/weekday | 分/时/日/月/周 |
job | 任务计划要执行的命令 |
name | 任务计划的名称 |
user | 指定计划任务属于哪个用户,默认是root用户 |
state | present表示添加(可以省略),absent表示移除。 |
#周一到周五早八点半和晚八点半 执行 复制/var/log/messages 到 /opt
ansible dbservers -m cron -a 'minute=30 hour="8,20" weekday="1-5" job="/usr/bin/cp -f /var/log/message /opt" name="backup1"'
#删除计划任务,指定状态为absent ansible dbservers -m cron -a 'name="backup1" state=absent'
13.yum/apt 模块
功能:在远程主机上安装与卸载软件包
常用参数 | 功能 |
---|---|
name | 需要安装的服务名 |
state=present(缺省值)/absent | 状态,abasent表示卸载服务 |
ansible webservers -m yum -a 'name=httpd' #安装服务
#卸载服务 ansible webservers -m yum -a 'name=httpd state=absent'
功能:建立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 源。
功能:用于管理远程主机上的管理服务的运行状态。
常用参数 | 功能 |
---|---|
name | 指定需要控制的服务名称 |
state | 指定服务状态,其值可以为stopped、started、reloaded、restarted、status |
enabled | 指定服务是否为开机启动,yes为启动,no为不启动 |
daemon_reload | yes:重启systemd服务,让unit文件生效 |
#先安装服务 ansible webservers -m yum -a 'name=httpd' #启动httpd服务 ansible webservers -m service -a 'enabled=true name=httpd state=started' #查看web服务器httpd运行状态 ansible webservers -a 'systemctl status httpd'
16.mount 模块
功能:在远程主机挂载目录/设备文件
常用参数 | 功能 |
---|---|
src | 指定要挂载的设备或分区路径。 |
path | 指定要挂载到的目标路径。 |
fstype | 指定要挂载的文件系统类型。 |
state | 指定挂载状态,可选值为 mounted 、unmounted 或 absent 。 |
opts | 指定挂载选项,例如挂载选项或参数。 |
ansible dbservers -m mount -a 'src=/dev/sr0 path=/mnt state=mounted fstype=iso9660' #使用 Ansible 的 mount 模块将设备 /dev/sr0 的内容挂载到目标路径 /mnt。 #文件系统类型为 iso9660,并将该设备标记为已挂载状态
17.user模块
功能:在远程主机管理用户账户
ansible <组/IP/all> -m user -a ' '
常用参数 | 功能 |
---|---|
name | 用户名,必选参数 |
state=present|absent | 创建账号或者删除账号,present表示创建,absent表示删除 |
system=yes|no | 是否为系统账号 |
uid | 用户uid |
group | 用户基本组 |
groups | 用户所属附加组 |
shell | 默认使用的shell |
create_home=yes|no | 是否创建家目录 |
password | 是否用户的密码,建议使用加密后的字符串 |
remove=yes|no | 当state=absent时,是否删除用户的家目录 |
ansible dbservers -m user -a 'name="test01"' #创建用户test01 ansible dbservers -a 'tail -n1 /etc/passwd'
ansible dbservers -m user -a 'name="test01" state=absent' #删除用户test01 ansible dbservers -a 'tail -n1 /etc/passwd'
18.group模块
功能:管理组
ansible <组/IP/all> -m group -a ' '
name:用户名,必选参数 state=present|absent:创建账号或者删除账号,present表示创建,absent表示删除 system=yes|no:是否为系统账号 gid:组id
ansible dbservers -m group -a 'name=mysql gid=306 system=yes' #创建mysql组 ansible dbservers -m user -a 'name=test01 uid=306 system=yes group=mysql' #将test01用户添加到mysql组中 ansible dbservers -a 'id test01'
ansible webservers -m reboot
20.replace 模块
功能:在远程主机修改文件内容 。
类似于sed命令,主要也是基于正则进行匹配和替换。
常用参数 | 功能 |
---|---|
path | 指定需要处理的文件路径 |
regexp | 用于匹配需要替换内容的正则表达式 |
replace | 用于替换匹配内容的字符串 |
after | 在哪个字符串之后进行替换,默认为空 |
before | 在哪个字符串之前进行替换,默认为空 |
backup | 是否备份文件,选项为 yes 或 no |
#在db服务器的主机下创建测试文件 vim /opt/test.txt 11 22 33 44 55 66 aa bb cc dd ee ff 1a 2b 3c 4d 5e 6f
#匹配 33 并修改为 ccc ansible dbservers -m replace -a "path=/opt/test.txt regexp='33' replace='cc'" #查看 ansible dbservers -a "cat /opt/test.txt"
#匹配到任意一个或多个开头的行增加注释 ansible dbservers -m replace -a "path=/opt/test.txt regexp='^(.*)' replace='#\1'" #取消注释 ansible dbservers -m replace -a "path=/opt/test.txt regexp='^#(.*)' replace='\1'"
#匹配以 a 开头的后面有一个或者多个字符的行,并在前面添加 # 注释 ansible dbservers -m replace -a "path=/opt/test.txt regexp='^(a.*)' replace='#\1'"
21.setup 模块
功能:使用facts组件获取远程主机的系统信息(facts信息)
常用参数 | 功能 |
---|---|
filter | 指定需要过滤的条件,仅返回满足条件的主机信息,默认为空 |
ansible webservers -m setup #获取mysql组主机的facts信息 ansible dbservers -m setup -a 'filter=*ipv4' #使用filter可以筛选指定的facts信息