运维自动化工具--Ansible
运维自动化工具Ansible
1. ansible安装
rocky安装
需要先安装 enel源
# yum install -y epel-release
然后再安装ansible
# yum install -y ansible
ubuntu安装 ansible
有大量的ansible有大量的第三方模块(34739),旧版本
# apt update;apt install -y ansible
查看ansible版本
# ansible --version
可以用此命令查看第三方模块数量
# dpkg -l ansible | wc -l
ubuntu ansible-core 安装
新版本,外围文件比较少(1064)
# apt update;apt install ansible-core
查新ansible-core第三方模块数量
# dpkg -l ansible | wc -l
#anslble和ansible-core 不能共存只能装一个
在ubuntu中使用ansible需要生成配置文件
# 创建目录
[root@ubuntu2204 ~]#mkdir -pv /etc/ansible/roles
mkdir: created directory '/etc/ansible'
mkdir: created directory '/etc/ansible/roles'
# 创建文件
[root@ubuntu2204 ~]#touch /etc/ansible/hosts
#生成配置文件
[root@ubuntu2204 ~]#ansible-config init --disabled -t all > /etc/ansible/ansible.cfg
[root@ubuntu2204 ~]#tree /etc/ansible/
/etc/ansible/
├── ansible.cfg #主配置文件,配置ansible工作特性,也可以在项目的目录中创建此文件,当前目录下如果也有ansible.cfg,则当前目录中的配置文件优先于此文件
├── hosts #主机清单,在此文件中定义要管理的主机
└── roles # 目录,存放角色文件
1 directory, 2 files
ubuntu配置文件
[root@ubuntu2204 ~]#ansible --version
ansible [core 2.12.0] #ansible版本号
config file = /etc/ansible/ansible.cfg #配置文件(该配置文件只有完成上述操作之后才会生成,默认是没有的)
configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules'] #第三方插件目录
ansible python module location = /usr/lib/python3/dist-packages/ansible #官方模块目录
ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/bin/ansible #可执行程序
python version = 3.10.6 (main, May 29 2023, 11:10:38) [GCC 11.3.0] # python环境
jinja version = 3.0.3 #jinjia模板引擎版本
libyaml = True #是否已经安装libyaml
2 配置文件优先级和hosts主机管理配置项
ansible 的主配置文件可以有多个,分别存放于不同目录,其优先级如下
ANSIBLE_CONFIG #环境变量,此变量中指向的文件必须存在才生效,指向的文件要以.cfg 结尾
./ansible.cfg #当前目录下的ansible.cfg 一般一个项目对应一个专用的配置文件
~/.ansible.cfg #当前家目录下的 .ansible.cfg
/etc/ansible/ansible.cfg #ansible默认配置文件,主配置文件
#第二个当前目录下的ansible.cfg 此项命令用于单个项目时会经常用
#例如: 当前有两个项目第一个是 app1 app2 可以在当前目录下创建两个ansible.cfg 来分别管理两个项目
[root@ubuntu ~]# ansible --version | grep cfg
config file = /etc/ansible/ansible.cfg
#在家目录下创建配置文件
[root@ubuntu ~]# touch .ansible.cfg
#再次查看,配置文件己经发生了改变
[root@ubuntu ~]# ansible --version | grep cfg
config file = /root/.ansible.cfg
#创建目录,在当前目录下创建配置文件
[root@ubuntu ~]# mkdir app1
[root@ubuntu ~]# cd app1
[root@ubuntu app1]# touch ansible.cfg
[root@ubuntu app1]# ansible --version | grep cfg
config file = /root/app1/ansible.cfg
#设置环境变量,要以 cfg 结尾
hosts管理主机配置项
#分组定义, 可以使用区间写法
[root@ubuntu2204 ~]#vim /etc/ansible/hosts
[root@ubuntu2204 ~]#cat /etc/ansible/hosts
[group1]
192.168.168.[5:9]
group2.m5[4:5]-magedu,com
[group2]
192.168.16[1:3].10
[group3:children]
group1
group2 #调用group1 group2
[root@ubuntu2204 ~]#ansible group1 --list
hosts (10):
192.168.168.5
192.168.168.6
192.168.168.7
192.168.168.8
192.168.168.9
group2.m54-magedu,com
group2.m55-magedu,com
[root@ubuntu2204 ~]#ansible group3 --list
hosts (19):
192.168.168.5
192.168.168.6
192.168.168.7
192.168.168.8
192.168.168.9
group2.m54-magedu,com
group2.m55-magedu,com
192.168.161.10
192.168.162.10
192.168.163.10
分组别名
#在分组中定义别名
[group1]
node1 ansible_ssh_host=10.0.0.101
node2 ansible_ssh_host=10.0.0.102
[goup1:vars]
ansible_ssh_password=123456
可定义的常用配置项
ansible_ssh_host=IP|hostname #指定远程主机,可用IP或主机名
ansible_ssh_port=PORT #指定SSH端口
ansible_ssh_user=UNAME #指定SSH用户名
ansible_ssh_pass=PWD #显式指定SSH密码
ansible_sudo_pass=PWD #显式指定SUDO密码
ansible_sudo_exe=/PATH/CMD #sudo 命令路径(适用于1.8及以上版本)
ansible_connection=local|ssh|paramiko|docker #与主机的连接类型
ansible_ssh_private_key_file=/PATH/FILE #SSH私钥文件
ansible_shell_type=sh|csh|fish #目标系统的shell类型.默认 sh
ansible_python_interpreter=/PATH/PYTHON #目标主机的python路径用于系统中有多个Python版本,或默认/usr/bin/python不存在
3 ansible工具
[root@ubuntu ~]# ls /usr/bin/ansible*
/usr/bin/ansible #主程序,ad-hoc工作模式下执行单条命令
/usr/bin/ansible-connection #连接插件管理工具
/usr/bin/ansible-doc #帮助手册,查看帮助文档
/usr/bin/ansible-inventory #用特定格式显示所有远程主机列表
/usr/bin/ansible-pull #playbook获取工具
/usr/bin/ansible-vault #文档加密工具
/usr/bin/ansible-config #配置管理工具
/usr/bin/ansible-console #互式命令行工具
/usr/bin/ansible-galaxy #线上role管理工具
/usr/bin/ansible-playbook #playbook 管理工具
/usr/bin/ansible-test
#本质上是个python脚本文件
[root@ubuntu ~]# file /usr/bin/ansible
/usr/bin/ansible: Python script, ASCII text executable
ansible-doc 命令用法
ansible-doc 工具用来查看 ansible 文档
ansible-doc [options] [module...]
#常用选项
-h|--help #显示帮助
--version #显示版本
-l|--list #列出所有可用模块
-t|--type #指定模块类型
become|cache|callback|cliconf|connection|httpapi|inventory|lookup|
#
netconf|shell|vars|module|strategy|role|keyword
-s|--snippet #显示指定模块的playbook片段
-j|--json #以 json 格式显示
-v|--verbose #显示详细信息,最多可以 -vvvvvv
#统计所有模块
ansible-doc -l 统计数量 ansible-doc -l | wc -l
#过滤指定模块
ansible-doc -l |gerp mysql
#列出指定类型模块
ansible-doc -t shell -l
#列出指定模块帮助
ansible-doc ping -s #查询其他模块替换ping即可
ansible-consile命令用法
ansible-console 用来交互式执行命令,支持 tab 键补齐
ansible-console
#常用子命令
help|? #列出所子命令
cd #切换主机组
copy #
exit #退出
forks #设置并发执行数量
list #列出被管理的所有主机
ping #执行ping模块
#修改主机清单文件,新增
[root@ubuntu2204 ~]#vim /etc/ansible/hosts
1 [group1]
2 10.0.0.150
3 10.0.0.157
4 10.0.0.167
5
6
7 [group2]
8 10.0.0.164
9 10.0.0.184
10 ccc[1:3]linux.magedu.com
# 列出所有主机
[root@ubuntu2204 ~]#ansible-console
Welcome to the ansible console. Type help or ? to list commands.
root@all (8)[f:5]$ list
10.0.0.150
10.0.0.157
10.0.0.167
10.0.0.164
10.0.0.184
ccc1linux.magedu.com
ccc2linux.magedu.com
ccc3linux.magedu.com
root@all (8)[f:5]$ cd 10.0.0.150
#切换分组
root@10.0.0.150 (1)[f:5]$ cd group1
#查看主机
root@group1 (3)[f:5]$ list
10.0.0.150
10.0.0.157
10.0.0.167
#修改并发数,此处是临时修改,永久生效需要修改配置文件
root@all (8)[f:5]$ forks 10
root@all (8)[f:10]$
4 ansible命令用法
4.1ansible命令基础用法
ansible <host-pattern> [-m module_name] [-a args]
#常用选项
-h|--help #查看帮助
--version #显示版本
--list-hosts #列出远程主机,可以写成 --list
-m module #指定模块,默认模块为command,默认模块时,可省略不写
-a|--args #指定模块选项
-e|--extra-vars #指定执行选项
-C|--check #检测语句是否正确,并不立即执行
-k|--ask-pass #提示输入ssh密码,默认用sshkey验证
-T|--timeout N #设置命令超时时长,默认10S
-k|--ask-pass #提示输入ssh连接密码,默认Key验证
-u|--user=UNAME #执行远程执行的用户,默认root
-b|--become #代替旧版的sudo实现通过sudo机制实现提升权限
--become-user=USERNAME #指定sudo的runas用户,默认为root
-K|--ask-become-pass #提示输入sudo时的口令
-f|--forks N #指定并发同时执行ansible任务的主机数
-i|--inventory /PATH/FILE #指定主机清单文件
-v|vv|vvv|vvvv|vvvvv #显示详细执行过程
查看主机
#查看所有主机列表
[root@ubuntu2204 ~]#ansible all --list
hosts (4):
10.0.0.161
10.0.0.160
10.0.0.157
10.0.0.153
# ansible group1 --list-hosts 查看指定组主机列表
自动添加到信任列表
#安装 apt install sshpase
#修改配置文件,自动添加目标主机到信任主机列表
将 host_key_checking=true修改为 host_key_checking=False
root@ubuntu2204 ~]#vim /etc/ansible/ansible.cfg
[root@ubuntu2204 ~]#ansible 10.0.0.153 -m ping -k
SSH password:
10.0.0.153 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
# 生成一个 socket文件
[root@ubuntu2204 ~]#rm -rf .ansible
[root@ubuntu2204 ~]#ansible 10.0.0.153 -m ping -k
SSH password:
10.0.0.153 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
[root@ubuntu2204 ~]#tree .ansible
.ansible
├── cp
│ └── 54e560e037 #socket文件,连接缓存,该文件有生命周期 1分钟后失效
└── tmp
#默认sshkey验证,由于有缓存的socket文件,所以可以操作成功
[root@ubuntu2204 ~]#ansible 10.0.0.153 -m ping
10.0.0.153 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
指定主机和用户
在指定主机 #添加用户 useradd tom 修改密码 passwd tom
#指定用户要使用该用户的密码
[root@ubuntu2204 ~]#ansible 10.0.0.153 -m ping -u tom -k
SSH password:
10.0.0.153 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false,
"ping": "pong"
}
以sudo身份运行
tom没有权限执行 ls /root
#修改目标主机配置文件
[21:04:35 root@rocky86[ ~]#vim /etc/sudoers
# Allow root to run any command
#s anywhere
root ALL=(ALL) ALL
tom ALL=(root) NOPASSWD:ALL #添加权限
## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
#再次查看成功
[root@ubuntu2204 ~]#ansible 10.0.0.153 -m command -a"sudo ls /root" -u tom -k
SSH password:
10.0.0.153 | CHANGED | rc=0 >>
0619.txt
0620.txt
anaconda-ks.cfg
bash_completion
Desktop
Documents
Downloads
initial-setup-ks.cfg
Music
Pictures
Public
rocky86.cn-.log
Templates
Videos
y
并发控制
[root@ubuntu2204 ~]#ansible rocky --list
hosts (2):
10.0.0.157
10.0.0.153
# 并发数为1 每次执行一台机器
[root@ubuntu2204 ~]#ansible rocky -a "sleep 2" -f1 -k
SSH password:
10.0.0.157 | CHANGED | rc=0 >>
10.0.0.153 | CHANGED | rc=0 >>
# 并发数为2 每次执行两台机器
[root@ubuntu2204 ~]#ansible rocky -a "sleep 2" -f2 -k
SSH password:
10.0.0.153 | CHANGED | rc=0 >>
10.0.0.157 | CHANGED | rc=0 >>
# 并发数为2 睡5秒钟 在tmp下创建一个文件
[root@ubuntu2204 ~]#ansible rocky -m shell -a"sleep 5;touch /tmp/test-1" -f2 -k
SSH password:
10.0.0.157 | CHANGED | rc=0 >>
10.0.0.153 | CHANGED | rc=0 >>
在主机清单中定义选项
#修改配置文件
1 [ubuntu]
2 10.0.0.161
3 10.0.0.160
4
5
6 [rocky]
7 10.0.0.157
8 10.0.0.153
9
10
11 [rocky:vars]
12 ansible_ssh_password=123456 # 指定ssh密码
13 ansible_ssh_user=tom #指定tom用户
14
15 [group1:children]
16 ubuntu
17 rocky
#执行id命令 不用再填写密码 并且用户为tom
[root@ubuntu2204 ~]#ansible rocky -m command -a "id"
10.0.0.153 | CHANGED | rc=0 >>
uid=3534(tom) gid=3534(tom) groups=3534(tom)
10.0.0.157 | CHANGED | rc=0 >>
uid=1001(tom) gid=1001(tom) groups=1001(tom) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
host-pattern规则
#指定开头
[root@ubuntu ~]# ansible "10.0.0.15*" --list
hosts (2):
10.0.0.150
10.0.0.157
#指定结尾
[root@ubuntu ~]# ansible "*com" --list
hosts (3):
node1.linux-magedu.com
node2.linux-magedu.com
node3.linux-magedu.com
#指定开头和结尾
[root@ubuntu ~]# ansible "node*com" --list
hosts (3):
node1.linux-magedu.com
node2.linux-magedu.com
node3.linux-magedu.com
[root@ubuntu ~]# vim /etc/ansible/hosts
[test1]
10.0.0.150
10.0.0.157
[test2]
10.0.0.184
10.0.0.157
[test3]
10.0.0.150
10.0.0.157
无法连接解决办法
# 报 错:
10.0.0.152 | UNREACHABLE! => {
"changed": false,
"msg": "Invalid/incorrect password: Permission denied, please try again.", ("密码无效/不正确:拒绝权限,请重试。)
"unreachable": true
# 查看配置文件是否修改
#vim /etc/ssh/sshd confiq找到开头 PermitRootLogin
# 改成 PermitRootLogin yes
# 把注释消掉然后保存退出
# 再执行 systemctl restart sshd 重启sshd
# 然后敲 passwd 命令,给 root 用户设置密码
再次查看是否连接cheng'gong
5常用模块目录和查看帮助
查看帮助ansible-doc -s +模块
# 例: ansible-doc -s shell
# 安装模块 ansible-galaxy collection install ansible.posix
其他模块搜索
ansible 提供了很多其它的模块,在我们需要使用时,可以再进行查询
ansible-doc -l | grep "模块关键字"
ansible-doc 模块名
ansible常用模块
# command模块:执行命令,但不支持管道,重定向,不具有幂等性
# shell模块:执行命令,可以说是command的加强版,支持重定向,管道符等,但是复杂的命令可能会执行失败,比如多重管道,正则表达式等,不具有幂等性
# script模块 可以在远程主机上面执行脚本(脚本文件可以没有权限)
# copy模块 将ansible主机上的文件复制到远程主机,同时可以修改属主属组还有权限,具有幂等性(可以复制目录到目标主机上, 源和目标也可以都在远程主机上)
# get_url模块 从网络上下载
# fetch模块 从远程主机提取至ansible主控端 ,与copy相反,不支持目录
# file模块 主要提供文件管理功能,比如创建文件和目录,修改文件和目录,设置文件权限和属性,设置 链接等
# stat模块 用来获取目标文件的状态,对于 windows 主机,要使用 win_stat 模块
# unarchive模块 主要用来解压缩或解包,将 ansible 主机或其它主机上的压缩包复制到指定主机,再解压到某个目录,在使用此模块时,要保证远程主机能解压对应的压缩包
# archive模块 在远程主机上执行压缩打包命令,此模块的源和目标都在远程主机上
# hostname模块 修改远程的主机名,修改后永久生效
# cron模块 远程执行定时任务
# yum模块和apt模块 远程安装
# yum_repository模块 对远程主机上的yum仓库源进行管理
# service模块 对远程主机上的服务进行管理
# user模块 远程主机上进行用户管理
# group模块 远程主机上的组管理
# lineinfile模块 lineinfile 模块主要用于修改远程主机上的文件。ansible 提供了两个常用的文件修改模块,其中 lineinfile 主要对文件单行进行替换修改,replace 模块主要进行多行替换和修改。如果使用 ansible 调用 sed 进行文件修改时,经常会遇到需要转义的情况,而且在对特殊符号进行替换时,有可能会失败。
# replace模块 该模块功能与 lineinfile 模块功能类似,也是基于正则匹配的模式来修改文件,但与 lineinfile 不同的是replace 模块用于多行匹配和修改
# selinux模块 用作对远程主机的 selinux 机制进行管理
# mount模块 用于管理远程主机的挂载
# setup模块 此模块主要用来从远程主机上收集相关信息在 ansible 主机上显示,由于需要收集的信息较多,此模块执行较慢。
# debug模块 此模块可以用于输出信息,并且通过 msg 定制输出的信息内容,功能类似于 echo 命令
# sysctl模块 用来修改远程主机上的内核参数
# pam_limits 模块 此模块主要用于管理远程主机上的资源限制
command模块 1
此模块为 ansible 默认模块,可以省略 -m 选项,该模块用来在远程主机上执行 shell 命令,但有些操作 不支持,比如管道,重定向,通配符等,如果要实现这些功能,可以用 shell 模块实现。 不具有幂等性
#常用选项
chdir=dir #执行命令前,先切换至目录dir
creates=file #当file不存在时才会执行
removes=file #当file存在时才会执行
#例:
[root@ubuntu2204 ~]#ansible ubuntu -m command -a "chdir=/tmp creates=/tmp/abc touch abc"
# 执行命令之前先切换到tmp目录 当abc文件不存在执行一个touch(创建一个abc)
#romoves
[root@ubuntu2204 ~]#ansible ubuntu -m command -a "rm -rf /tmp/abc"
shell模块 1
此模块用法和 command 模块类似,都是用来执行 shell 命令,但功能比 command 模块强大,对于在 command 模块中不支持的功能,此处均可使用。此模块也不具有幂等性。
在调用shell模块执行命令时,复杂的命令也有可能会执行失败,类似于包含多重管道,正则表达式这 些,这种情况下,我们需要写成 shell 脚本,用 copy 模块直接推送到远程执行。
#常用选项
chdir=dir #执行命令前,先切换至目录dir
creates=file #当file不存在时才会执行
removes=file #当file存在时才会执行
#支持管道
[root@ubuntu2204 ~]#ansible ubuntu -m shell -a "echo 1+2 | bc"
10.0.0.161 | CHANGED | rc=0 >>
3
10.0.0.160 | CHANGED | rc=0 >>
3
# 支持重定向 没有文件会自己创建文件
[root@ubuntu2204 ~]#ansible ubuntu -m shell -a "echo 1+2 | bc > /tmp/abc "
10.0.0.161 | CHANGED | rc=0 >>
10.0.0.160 | CHANGED | rc=0 >>
#支持多条命令
[root@ubuntu2204 ~]#ansible ubuntu -m shell -a "id;id;hostname"
10.0.0.160 | CHANGED | rc=0 >>
uid=0(root) gid=0(root) groups=0(root)
uid=0(root) gid=0(root) groups=0(root)
ubuntu
10.0.0.161 | CHANGED | rc=0 >>
uid=0(root) gid=0(root) groups=0(root)
uid=0(root) gid=0(root) groups=0(root)
ubuntu
#不具有幂等性
[root@ubuntu ~]# ansible 10.0.0.206 -m shell -a "mkdir dira"
10.0.0.206 | CHANGED | rc=0 >>
[root@ubuntu ~]# ansible 10.0.0.206 -m shell -a "mkdir dira"
10.0.0.206 | FAILED | rc=1 >>
mkdir: cannot create directory ‘dira’: File existsnon-zero return code
script模块 1
# 脚本
[root@ubuntu2204 ~]#vim test.sh
1 #!/bin/bash
2 #
3 #****************************************************
4 #Author: ck
5 #QQ: 123456
6 #Date: 2023-07-06
7 #FileName: test.sh
8 #URL: http://www.magedu.com
9 #Description: test
10 #Copyright(C): 2023 All right
11 #***************************************************
12
13
14
15 hostname -I > /tmp/ansibles-script.log #(执行hostname -I 发送到 /tmp/ansibles-script.log 文件中)
16 hostname -I # 执行 hostname -I 命令
#执行脚本
[root@ubuntu2204 ~]#ansible ubuntu -m script -a "./test.sh"
10.0.0.161 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 10.0.0.161 closed.\r\n",
"stderr_lines": [
"Shared connection to 10.0.0.161 closed."
],
"stdout": "10.0.0.161 \r\n",
"stdout_lines": [
"10.0.0.161 "
]
}
10.0.0.160 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 10.0.0.160 closed.\r\n",
"stderr_lines": [
"Shared connection to 10.0.0.160 closed."
],
"stdout": "10.0.0.160 \r\n",
"stdout_lines": [
"10.0.0.160 "
]
}
# 查看分组ubuntu 10.0.0.160 的文件
root@ubuntu:/tmp# cat ansibles-script.log
10.0.0.160
copy模块 1
copy 模块将 ansible 主机上的文件复制到远程主机,此模块具有幂等性。
#常用选项
src=/path/file #ansible主机文件路径
dest=/path/file #远程主机文件路径
owner=UNAME #新文件属主
group=GNAME #新文件属组
mode=777 #新文件权限
backup=yes|no #是否备份,默认no
content=str #使用str生成新文件
remote_src=yes|no #no是默认值,表示src文件在ansible主机,yes表示src文件在远程主机
#将ansible主机上的cc文件复制到目标主机的root目录下文件名叫cc.bak 属主是tom 属组是tom 文件权限是777 backup=yes 是备份 只有文件发生变化才会备份
[root@ubuntu2204 ~]#ansible ubuntu -m copy -a"src=./0706/cc dest=/root/cc.bak backup=yes mode=777 owner=tom group=tom "
root@ubuntu2204 ~]#echo "123" >> ./cc
[root@ubuntu2204 ~]#ansible ubuntu -m copy -a"src=./cc dest=/root/cc.bak backup=yes mode=777 owner=tom group=tom "
root@ubuntu:~# ls
aaa.txt cc.bak snap # 文件修改前
root@ubuntu:~# ls
aaa.txt cc.bak cc.bak.3797.2023-07-06@07:46:19~ snap # 文件修改后
# 源和目标都在远程主机上
[root@ubuntu2204 ~]#ansible ubuntu -m copy -a "src=/root/aaa.txt dest=/tmp/ remote_src=yes"
# 将ansible主机上面的cc文件 复制到目标主机上文件名为cc.bak (ubuntu为目标主机)
[root@ubuntu2204 ~]#ansible ubuntu -m copy -a"src=/etc/ansible dest=/tmp/"
get_url模块
常用选项
url=http://www.a.com/b.txt #下载文件URL
dest=/tmp/c.txt #保存文件路径(绝对路径)
owner=UNAME #指定属主
group=GNAME #指定属组
mode=777 #指定权限
force=yes|no #默认yes,如果目标文件存在,则覆盖, no 表示只有目标不存在才下载
checksum="algorithm:str" #指定目标文件摘要值,下载完成后算出文件摘要再对比,确认文件是否完整
url_username=UNAME #http 认证用户名
url_password=PWD #http认证密码
validate_certs=yes|no #no表示不验证SSL证书合法性
timeout=10 #URL请求的超时时间,默认10S
# 从http://www.jose-404.com/aini.jpg 上下载图片到10.0.0.160 文件路径是/tmp/a.jpg
[root@ubuntu2204 ~]#ansible 10.0.0.160 -m get_url -a 'url=http://www.jose-404.com/aini.jpg dest=/tmp/a.jpg'
10.0.0.160 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": true,
"checksum_dest": null,
"checksum_src": "a025296e5a5d173e519cec5511c8f590f9e4fa33",
"dest": "/tmp/a.jpg",
"elapsed": 0,
"gid": 0,
"group": "root",
"md5sum": "e8fee721ce6e1556e1bf93ae39c7324e",
"mode": "0644",
"msg": "OK (689635 bytes)",
"owner": "root",
"size": 689635,
"src": "/root/.ansible/tmp/ansible-tmp-1688630788.2633946-3292-179484533638598/tmprg5cygre",
"state": "file",
"status_code": 200,
"uid": 0,
"url": "http://www.jose-404.com/aini.jpg"
fetch模块 1
#常用选项
src=/path/file #远程主机上的文件路径
fail_on_missing=yes|no #默认yes,无法获取远程主机文件时,显示失败
dest=/path #ansible主机上的保存路径,不存在会自动创建
#从目标主机 10.0.0.160和10.0.0.161主机上提取文件 000.txt 到ansible主机上 保存路径为当前目录下chen的目录中
[root@ubuntu2204 ~]#ansible "10.0.0.160 10.0.0.161" -m fetch -a "src=/root/000.txt dest=./chen/"
10.0.0.161 | CHANGED => {
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/root/chen/10.0.0.161/root/000.txt",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"remote_checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"remote_md5sum": null
}
10.0.0.160 | CHANGED => {
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/root/chen/10.0.0.160/root/000.txt",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"remote_checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"remote_md5sum": null
}
# 分开存放
[root@ubuntu2204 ~]#tree
.
├── cc
├── chen
│ ├── 10.0.0.160
│ │ └── root
│ │ └── 000.txt
│ └── 10.0.0.161
│ └── root
│ └── 000.txt
file模块
file 模块主要提供文件管理功能,比如创建文件和目录,修改文件和目录,设置文件权限和属性,设置 链接等
#常用选项
path=/path/file #目标文件路径
owner=USER #属主
group=GROUP #属组
mode=777 #权限
state=file|touch|directory|link|hard|absent #具体操作path
“file”(文件):代表操作的目标是一个文件。
“touch”(触摸):代表在目标位置创建一个空白的文件,如果文件已存在,则更新其最后修改时间。
“directory”(目录):代表操作的目标是一个目录(文件夹)。
“link”(链接):代表操作的目标是一个符号链接(软链接)。
“hard”(硬链接):表示操作的目标是一个硬链接,即指向与源文件相同的实际文件。
“absent”(不存在):代表从目标位置删除文件或目录,如果目标不存在,则不会报错。
recurse=yes|no #yes表示递归操作,仅在 state=directory 时生效
# 在10.0.0.160主机上递归创建一个目录
[root@ubuntu2204 ~]#ansible 10.0.0.160 -m file -a "path=/ansible/text/test state=directory"
10.0.0.160 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/ansible/text/test",
"size": 4096,
"state": "directory",
"uid": 0
}
# 创建文件
[root@ubuntu2204 ~]#ansible 10.0.0.160 -m file -a "path=/ansible/text/test.txt state=touch owner=tom group=root mode=777"
10.0.0.160 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": true,
"dest": "/ansible/text/test.txt",
"gid": 0,
"group": "root",
"mode": "0777",
"owner": "tom",
"size": 0,
"state": "file",
"uid": 1001
}
# 获取文件信息
[root@ubuntu2204 ~]#ansible 10.0.0.160 -m file -a 'path=/ansible/text/test.txt state=file '
10.0.0.160 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"gid": 0,
"group": "root",
"mode": "0777",
"owner": "tom",
"path": "/ansible/text/test.txt",
"size": 0,
"state": "file",
"uid": 1001
}
#链接文件可以用dest|path|name 来指定
[root@ubuntu2204 ~]#ansible 10.0.0.160 -m file -a "src=/ansible/text/test.txt dest=/ansible/text/test/test.link state=link owner=tom group=tom"
10.0.0.160 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": true,
"dest": "/ansible/text/test/test.link",
"gid": 0,
"group": "root",
"mode": "0777",
"owner": "root",
"size": 22,
"src": "/ansible/text/test.txt",
"state": "link",
"uid": 0
}
#递归删除目录
[root@ubuntu2204 ~]#ansible 10.0.0.160 -m file -a "path=/root/ansible/text/ state=absent"
10.0.0.160 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": true,
"path": "/ansible/text/",
"state": "absent"
}
stat模块
stat 模块用来获取目标文件的状态,对于 windows 主机,要使用 win_stat 模块
#常用选项
path=/path/file #指定目标文件路径
follow=true|false #是否跟随链接,默认 false,不跟随
# 文件存在
[root@ubuntu2204 ~]#ansible 10.0.0.160 -m stat -a "path=/etc/issue"
10.0.0.160 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"stat": {
"atime": 1688607734.4439998,
"attr_flags": "e",
"attributes": [
"extents"
],
"block_size": 4096,
"blocks": 8,
"charset": "us-ascii",
"checksum": "885858c5f069d990788e0df1719920326aeed634",
"ctime": 1686014263.555828,
"dev": 64768,
"device_type": 0,
"executable": false,
"exists": true,
"gid": 0,
"gr_name": "root",
"inode": 2622121,
"isblk": false,
"ischr": false,
"isdir": false,
"isfifo": false,
"isgid": false,
"islnk": false,
"isreg": true,
"issock": false,
"isuid": false,
"mimetype": "text/plain",
"mode": "0644",
"mtime": 1676563352.0,
"nlink": 1,
"path": "/etc/issue",
"pw_name": "root",
"readable": true,
"rgrp": true,
"roth": true,
"rusr": true,
"size": 26,
"uid": 0,
"version": "2235086703",
"wgrp": false,
"woth": false,
"writeable": true,
"wusr": true,
"xgrp": false,
"xoth": false,
"xusr": false
}
}
#文件不存在
[root@ubuntu2204 ~]#ansible 10.0.0.160 -m stat -a "path=/etc/abcd"
10.0.0.160 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"stat": {
"exists": false
}
}
unarchive模块 1
#查看帮助
[root@ubuntu ~]# ansible-doc -s unarchive
#常用选项
src=/path/file #包文件路径,可以是ansible主机上的包文件,也可以是远程主机上的文件
(也可以是第三方主机)
dest=/pth/dir #目标路径
remote_src=yes|no #yes表示包文件在远程主机或第三方主机上,no表示包文件在ansible主机
上,默认值为no
copy=yes|no #yes表示包文件在ansible主机上,no表示包文件在远程主机或第三方主机
上,己废弃
creates=/path/file #此文件不存在才执行
mode=777 #设置目标权限
owner=USER #设置目标属主
group=GROUP #设置目标属组
#将/etc/ansible文件 拷贝到当前目录下
[root@ubuntu2204 ~]#cp -r /etc/ansible ./
[root@ubuntu2204 ~]#ls
ansible dira.tar.gz qwe.txt snap test.sh
# 压缩
[root@ubuntu2204 ~]#tar -cvf /tmp/ansible.tar ansible (要压缩的路径为/tmp/ansible.tar 要压缩的包是ansible 要压缩的路径是/tmp/ansible.tar)
#将ansible主机上的压缩包解压至远程主机,远程目标必须存在
[root@ubuntu2204 tmp]#ansible 10.0.0.160 -m unarchive -a "src=/root/ansible.tar dest=/root owner=tom"
10.0.0.160 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": true,
"dest": "/root",
"extract_results": {
"cmd": [
"/usr/bin/tar",
"--extract",
"-C",
"/root",
"--owner=tom",
"-f",
"/root/.ansible/tmp/ansible-tmp-1688647233.157563-6027-190205531788187/source"
],
"err": "",
"out": "",
"rc": 0
},
"gid": 0,
"group": "root",
"handler": "TarArchive",
"mode": "0700",
"owner": "root",
"size": 4096,
"src": "/root/.ansible/tmp/ansible-tmp-1688647233.157563-6027-190205531788187/source",
"state": "directory",
"uid": 0
}
#查看10.0.0.160主机,已完成解包
root@ubuntu:~# ls
000.txt aaa.txt ansible cc.bak cc.bak.3797.2023-07-06@07:46:19~ snap
root@ubuntu:~# cd ansible
root@ubuntu:~/ansible# ls
ansible.cfg hosts roles
#将第三方包解压缩到指定主机
[root@ubuntu2204 ~]#ansible 10.0.0.160 -m unarchive -a "src=http://www.jose-404.com/web-dir.tar dest=/tmp remote_src=yes mode=777"
10.0.0.160 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": true,
"dest": "/tmp",
"extract_results": {
"cmd": [
"/usr/bin/tar",
"--extract",
"-C",
"/tmp",
"-f",
"/root/.ansible/tmp/ansible-tmp-1688648286.5569296-6187-227155230225367/web-dir0qjjsbbx.tar"
],
"err": "",
"out": "",
"rc": 0
},
"gid": 0,
"group": "root",
"handler": "TarArchive",
"mode": "01777",
"owner": "root",
"size": 4096,
"src": "/root/.ansible/tmp/ansible-tmp-1688648286.5569296-6187-227155230225367/web-dir0qjjsbbx.tar",
"state": "directory",
"uid": 0
}
archive模块 1
# 在远程主机上执行压缩打包命令,此模块的源和目标都在远程主机上
#常用选项
path=/path/dir #源目录或文件路径
dest=/pth/file #目标的文件路径
remove=false|true #是否删除源文件,默认 false
mode=777 #设置目标权限
owner=USER #设置目标属主
group=GROUP #设置目标属组
format=bz2|gz|tar|xz|zip #指定压缩算法,默认 gz
# 保留源文件
[root@ubuntu2204 ~]#ansible ubuntu -m archive -a"path=/root/ansible/ dest=/tmp/dira.bz2 format=bz2 mode=600"
10.0.0.161 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"archived": [],
"arcroot": "/root/ansible/",
"changed": false,
"dest": "/tmp/dira.bz2",
"dest_state": "absent",
"expanded_exclude_paths": [],
"expanded_paths": [
"/root/ansible/"
],
"missing": [
"/root/ansible/"
]
}
10.0.0.160 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"archived": [
"/root/ansible/roles",
"/root/ansible/hosts",
"/root/ansible/ansible.cfg"
],
"arcroot": "/root/ansible/",
"changed": true,
"dest": "/tmp/dira.bz2",
"dest_state": "archive",
"expanded_exclude_paths": [],
"expanded_paths": [
"/root/ansible/"
],
"gid": 0,
"group": "root",
"missing": [],
"mode": "0600",
"owner": "root",
"size": 14740,
"state": "file",
"uid": 0
}
#不保留源目录
[root@ubuntu ~]# [root@ubuntu2204 ~]#ansible ubuntu -m archive -a"path=/root/ansible/ dest=/tmp/dira.zip format=zip remove=true"
hostname模块
修改远程的主机名,修改后永久生效
[root@ubuntu2204 ~]#ansible ubuntu -m hostname -a "name=ubuntu2204"
10.0.0.161 | CHANGED => {
"ansible_facts": {
"ansible_domain": "0.0.161",
"ansible_fqdn": "10.0.0.161",
"ansible_hostname": "ubuntu2204",
"ansible_nodename": "ubuntu2204",
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": true,
"name": "ubuntu2204"
}
10.0.0.160 | CHANGED => {
"ansible_facts": {
"ansible_domain": "0.0.160",
"ansible_fqdn": "10.0.0.160",
"ansible_hostname": "ubuntu2204",
"ansible_nodename": "ubuntu2204",
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": true,
"name": "ubuntu2204"
}
cron模块
#常用选项
name=str #任务名称
job=/path/cmd args #具体任务命令
disabled=yes|no #是否禁用,默认 false
state=absent|present #absent 删除,默认present
env=yes|no #yes设置环境变量,no 设置定时任务,默认 no
special_time=annually|daily|hourly|monthly|reboot|weekly|yearly #指定特殊时间
user=UNAME #指定任务用户
minute= #指定分钟参数
hour= #小时参数
day= #自然天参数
month= #自然月参数
weekday= #星期参数
#创建任务
ansible 10.0.0.206 -m cron -a 'job="/usr/bin/wall test-crontab" name=test-crontab'
#指定时间
[root@ubuntu ~]# ansible 10.0.0.206 -m cron -a 'job="/usr/bin/wall test-crontab2" minute=*/5 hour=12 day=10,20,30 month=3,4,5 weekday=1-5 name=test-crontab2'
yum模块和apt模块
yum 模块和 apt 模块用于在远程主机上管理软件包,yum 模块适用于 redhat 系列,apt 适用于 debian 系列
yum模块
#常用选项
name=packagename #指定包名 name1,name2
state=absent|installed|latest|present|removed #absent|removed 删除,installed|present 安装,latest 升级到最新版
list=packagename|installed|updates|available|repos #此选项与name选项互斥,
#写具体包名是相当于执行 yum list --showduplicates packagename
download_dir=/path #指定下载目录
download_only=yes|no #只下载不安装,默认 no
update_only=yes|no #yes 仅更新,默认no
use_backend=auto|yum|yum4|dnf #指定真实执行的命令,默认 auto
autoremove=yes|no #卸载依赖,仅在卸载时生效,默认no
disablerepo=repoid #排除某些仓库 repoid1,repoid2
enablerepo=repoid #从指定仓库中安装 repoid1,repoid2
validate_certs=yes|no #是否对包进行校验,默认yes
disable_gpg_check=yes|no #是否不对包进行校验,默认no
update_only=yes|no #只更新不安装,默认no
#列出指定软件包
[root@ubuntu2204 ~]#ansible rocky -m yum -a "list=nginx"
#卸载
[root@ubuntu2204 ~]#ansible rocky -m yum -a'name=sos state=removed' -k
#指定源安装
[root@ubuntu2204 ~]#ansible rocky -m yum -a'name=sos enablerepo=baseos' -k
apt模块
#常用选项
name=packagename #指定包名,可用通配符
autoclean=yes|no #清除本地安装包,只删除己卸载的软件的 deb包
deb=/path/file.deb #指定deb包,可以是本地的,也可以是网络的
autoremove=yes|no #卸载依赖包,默认no
only_upgrade=yes|no #仅更新,不安装
state=absent|build-dep|latest|present|fixed #absent 卸载,build-dep 安装依赖包,
latest 安装或升级到最新版
#present 安装,fixed 修复
update_cache=yes|no #更新索引
#安装
[root@ubuntu2204 ~]#ansible ubuntu -m apt -a "name=nginx state=present"
#卸载
[root@ubuntu2204 ~]#ansible ubuntu -m apt -a "name=nginx state=absent"
yum_repository 模块
此模块用来对远程主机上的 yum 仓库配置进行管理
#常用选项
name=repoid #repoid
description=desc #描述信息
baseurl=url #仓库地址
enabled=yes|no #是否启用
gpgcheck=yes|no #是否启用gpgcheck,没有默认值,默认跟随 /etc/yum.conf 中的全局配置
gpgkey=/path/key #gpgkey路径
state=absent|present #absent删除, present安装,默认present
timeout=30 #超时时长,默认30s
# 添加yum源
[root@ubuntu2204 ~]#ansible group1 -m yum_repository -a 'name=nginx description=nginx-desc baseurl="http://nginx.org/packages/centos/$releasever/$basearch/"gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key'
#删除
[root@ubuntu2204 ~]#ansible rocky -m yum_repository -a'name=nginx state=absent'
service模块
#常用选项
name=servicename #服务名
enabled=yes|no #是否是开机启动
state=reloaded|restarted|started|stopped #具体操作
"reloaded"表示重新加载或重新装填,通常用于描述重新加载一个程序、网页或游戏等。
"restarted"表示重新启动,通常用于描述重新启动计算机、服务器或设备等。
"started"表示开始或启动,通常用于描述开始某个活动、进程或任务等。
"stopped"表示停止或结束,通常用于描述停止某个活动、进程或任务等
args=val #参数
# 启动服务
[root@ubuntu2204 ~]#ansible group1 -m service -a "name=nginx state=started"
# 重载
[root@ubuntu2204 ~]#ansible group1 -m service -a "name=nginx state=reloaded"
# 远程主机上查看
systemctl in-enabled nginx
# 加开机启动
[root@ubuntu2204 ~]#ansible group1 -m service -a 'name=nginx enabled=yes'
user模块
#常用选项
name=USERNAME #指定用户名
comment=str #用户描述信息
create_home=yes|no #是否创建家目录,默认yes
group=GROUPNAME #指定私有组
groups=group1,group2... #指定附加组
home=/path #指定家目录路径
shell=SHELL #指定shell
password=str #设置密码,必须是加密后的字符串
state=absent|present #absent 删除用户,present 创建用户,默认 present
system=yes|no #是否创建系统账号,默认 no
uid=UID #手动指定uid
umask=UMASK #指定umask
remove=yes|no #是否删除家目录,默认 no
generate_ssh_key=yes|no #是否创建私钥,默认 no
ssh_key_bits=2048 #指定私钥位数
ssh_key_file=/path/file #指定文件位置,默认 .ssh/id_rsa
# 创建用户
[root@ubuntu2204 ~]#ansible ubuntu -m user -a 'name=user1 comment="ansible user" uid=2048 home=/user1/'
# 在远程主机上查看
root@ubuntu2204:~# id user1
uid=2048(user1) gid=2048(user1) groups=2048(user1)
root@ubuntu2204:~# getent passwd user1
user1:x:2048:2048:ansible user:/user1/:/bin/sh
# 生成密码
[root@ubuntu ~]# openssl passwd -6 123456
$6$yaZYTO7B1gnMCfoK$MmKbbYKOX2c7Cx8mXBLSp1JGYbr6ZNTq0qAymnbU4dbTvLcuRmyOL5GPKSLpuYxDl2Ir7rkNr4gnuSlC0KSi10
# 创建系统用户,不创建家目录,指定shell,指定组,指定密码,组要先存在
[root@ubuntu2204 ~]#ansible ubuntu -m user -a 'name=user2 comment="ansible user" system=yes create_home=no shell=/sbin/nologin/ group=ga password="$6$yaZYTO7B1gnMCfoK$MmKbbYKOX2c7Cx8mXBLSp1JGYbr6ZNTq0qAymnbU4dbTvLcuRmyOL5GPKSLpuYxDl2Ir7rkNr4gnuSlC0KSi10"'
#创建用户生成密钥
[root@ubuntu ~]# ansible ubuntu -m user -a 'name=user3 generate_ssh_key=yes ssh_key_bits=2048'
# 删除用户
[root@ubuntu2204 ~]#ansible ubuntu -m user -a "name=user1 remove=yes state=absent"
group模块
#常用选项
name=GROUPNAME #指定组名
gid=GID #指定组ID
state=absent|present #absent 删除,present 创建,默认present
system=yes|no #是否是系统组,默认no
# 创建普通组
[root@ubuntu2204 ~]#ansible ubuntu -m group -a 'name=ga gid=1024'
# 创建系统组
[root@ubuntu2204 ~]#ansible ubuntu -m group -a 'name=gb gid=888 system=yes'
# 删除组
[root@ubuntu2204 ~]#ansible ubuntu -m group -a "name=gb state=absent"
lineinfile模块
#常用模块
path=/path/file #远程主机文件路径
regexp= #正则,用来锚定要被修改的内容
insertafter= #正则,在指定内容后的新行中增加line里面的内容,与regex同时使用时,只有regex没匹配才生效
insertbefore= #正则,在指定内容前的新行中增加line里面的内容,与regex同时使用时,只有regex没匹配才生效
line=str #修改后的内容
state=absent|present #absent 删除,present 不存在先创建
backup=yes|no #修改前先备份,默认no
create=yes|no #不存在先创建,默认no
backrefs=yes|no #是否支持引用,默认no不支持
mode=666 #置权限
owner=USER #指定属主
group=GROUP #指定属组
#使用 regexp 配合正则表达式来锚定要被修改的内容时,如果有多行被匹配,则只有最后一行会被替换,如果删除,则匹配到的行都会被删除
#替换以a开头的最后一行为AA
[root@ubuntu2204 ~]#ansible ubuntu -m lineinfile -a'path=/root/a.txt regexp="^a" line="AA"'
root@ubuntu2204:~# cat a.txt
123---123
321---321
12345
a# bcd
# abc
# aaa
bbb
ccc
a
a
a
a
a
AA
TOM
bb
cc
#往最后一行追加一行内容 内容为abcdefg
[root@ubuntu2204 ~]#ansible ubuntu -m lineinfile -a 'path=/root/a.txt line="abcdefg"'
root@ubuntu2204:~# cat a.txt
123---123
321---321
12345
a# bcd
# abc
# aaa
bbb
ccc
a
a
a
a
a
AA
TOM
bb
cc
abcdefg
#在最后一行123后面插入新行 内容是AAAAAAa
[root@ubuntu2204 ~]#ansible ubuntu -m lineinfile -a 'path=/root/a.txt insertafter="^123$" line="AAAAAAa"'
root@ubuntu2204:~# cat a.txt
123
AAAAAAa
321
12345
a# bcd
# abc
# aaa
#在最后一个123开头的行上面插入新行 内容为BBBBBB
[root@ubuntu2204 ~]#ansible ubuntu -m lineinfile -a 'path=/root/a.txt insertbefore="^123" line="BBBBBB"'
#修改之前内容
[root@ubuntu2204 ~]#cat a.txt
TOM
bb
cc
abcdefg
12i
AAAAAA
123
123123
123
123
123
abc
#删除所有以123开头的行 并且备份
[root@ubuntu2204 ~]#ansible ubuntu -m lineinfile -a 'path=/root/a.txt regexp="^123" backup=yes state=absent'
#备份
#[root@ubuntu2204 ~]#ls
a.txt a.txt.2687.2023-07-08@07:51:48~
#内容已修改
#[root@ubuntu2204 ~]#cat a.txt
TOM
bb
cc
abcdefg
12i
AAAAAA
abc
replace模块
#常用选项
path=/path/file #远程主机文件路径
regexp= #正则,用来锚定要被修改的内容
replace=STR #用来替换的内容
after=STR #从STR之后开始处理
before=STR #处理到STR之前
backup=yes|no #修改前是否备份,默认 no
mode=666 #设置权限
owner=USER #指定属主
group=GROUP #指定属组
# 将ansible主机中的文件test.txt 发送到ubuntu组中 文件名为a.txt 属主属组是root 文件权限是 rwxrwxrwx
[root@ubuntu2204 ~]#ansible ubuntu -m copy -a"src=./test.txt dest=/root/a.txt backup=yes mode=777 owner=root group=root "^C
#替换所有3个数字的行
#\1---\1后向引用 引用两次
[root@ubuntu2204 ~]#ansible ubuntu -m replace -a "path=/root/a.txt regexp='^([0-9]{3})$' replace='\1---\1' backup=yes"
root@ubuntu2204:~# cat a.txt
123---123
321---321
#只处理ccc和cc中间的行 .+任意字符匹配一次或多次 replace='# \1'替换的内容是 # \1是后向引用
[root@ubuntu2204 ~]#ansible ubuntu -m replace -a"path=/root/a.txt after='ccc' before='cc' regexp='^(.+)$' replace='# \1'"
root@ubuntu2204:~# cat a.txt
123---123
321---321
12345
a# bcd
# abc
# aaa
bbb
ccc
# a
# a
# a
# a
# a
# a
# a
# bb
cc
selinux模块(不懂)
#安装
[root@ubuntu ~]# ansible-galaxy collection install ansible.posix
#常用选项
configfile=/path/file #selinux 配置文件路径,默认
/etc/selinux/config
policy=targeted|minimum|mls #在state值不为 disabled 时必选
state=disabled|enforcing|permissive #具体设置
reboot模块
#常用选项
msg=str #广播重启提示消息,默认为空
test_command=str #重启后执行验证命令,默认 whoami
reboot_timeout=600 #超时时长,默认600S
pre_reboot_delay=0 #执行重启前等待时长,如果小于60S,此字段会被置0,也就是无效
post_reboot_delay=0 #重启后等待一个时长后再验证是否重启完成
#远程主机在重启过程中此进程会一直等待,直到超时
[root@ubuntu2204 ~]#ansible "ubuntu" -m reboot -a 'pre_reboot_delay=65 msg="this is test msg"'
#远程主机上收到广播消息
this is test msg
The system is going down for reboot at Sun 2023-02-05 13:48:10 CST!
mount模块
#常用选项
src=/path/device #要挂载的设备路径,可以是网络地址
path=/path/point #挂载点
state=absent|mounted|present|unmounted|remounted
# absent 取消挂载,并删除永久挂载中的配置
# mounted 永久挂载,立即生效,挂载点不存在会自动创建
# present 永久挂载,写配置文件,但不会立即生效
# unmounted 临时取消挂载,不改变配置文件
# remounted 重新挂载,但不会改变配置文件
fstab=/path/file #指定挂载配置文件路径,默认 /etc/fstab
fstype=str #设备文件系统 xfs|ext4|swap|iso9660...
opts=str #挂载选项
# 挂载光盘,永久挂载,立即生效
[root@ubuntu2204 ~]#ansible ubuntu -m mount -a 'src=/dev/sr0 path=/mnt/ state=mounted fstype=iso9660'
# 临时取消挂载
[root@ubuntu2204 ~]# ansible ubuntu -m mount -a 'src=/dev/sr0 path=/mnt/ state=unmounted'
# 取消挂载,永久生效
[root@ubuntu2204 ~]#ansible ubuntu -m mount -a 'src=/dev/sr0 path=/mnt/ state=absent'
setup模块 1
#常用选项
filter=filed1,filed2 #只显示指定字段,可以用通配符,可以写多个,可以用 !取反
gather_timeout=10 #超时时长,默认10S
#显示本机所有信息
[root@ubuntu2204 ~]#ansible 127.0.0.1 -m setup
#收集所有字段
ansible 10.0.0.153 -m setup
# 只显示主机名
[root@ubuntu2204 ~]#ansible 10.0.0.153 -m setup -a 'filter=ansible_hostname'
10.0.0.153 | SUCCESS => {
"ansible_facts": {
"ansible_hostname": "rocky86",
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}
# 显示主机名和IPV4
[root@ubuntu2204 ~]#ansible 10.0.0.153 -m setup -a 'filter=ansible_hostname,all_ipv4_addresses'
10.0.0.153 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"10.0.0.153",
"10.0.0.110"
],
"ansible_hostname": "rocky86",
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}
debug模块
#常用选项
msg=str #输出消息内容,默认 Hello world!
var=val #指定变量名,和 msg 互斥
verbosity=0|1|2|3 #指定调试级别,verbosity=2 则表示仅在 -vv|-vvv|-vvvv 的级别下显示
#默认消息
[root@ubuntu ~]# ansible 10.0.0.206 -m debug
10.0.0.206 | SUCCESS => {
"msg": "Hello world!"
}
#设定了运行级别,当前跳过
[root@ubuntu ~]# ansible 10.0.0.206 -m debug -a 'msg="this is test msg" (这是一条测试消息)
verbosity=2'
10.0.0.206 | SKIPPED
#可以正常显示
[root@ubuntu ~]# ansible 10.0.0.206 -m debug -a 'msg="this is test msg"
verbosity=2' -vv
......
sysctl模块
#常用选项
name=str #参数名称
val=str #参数值
reload=yes|no #默认yes,调用 /sbin/sysctl -p 生效
state=present|absent #是否保存到文件,默认present
sysctl_file=/path/file #指定保存文件路径,默认 /etc/sysctl.conf
sysctl_set=yes|no #是否使用systctl -w 校验,默认no
#修改内核参数,并写文件
[root@ubuntu2204 ~]#ansible 10.0.0.153 -m sysctl -a 'name=net.ipv4.ip_forward value=1'
查看之后内核已经修改
[15:30:58 root@rocky86[ ~]#sysctl -a | grep "ip_forward ="
net.ipv4.ip_forward = 1
[17:12:58 root@rocky86[ ~]#cat /etc/sysctl.conf | grep ip_forward
net.ipv4.ip_forward=1
#从文件中删除
[root@ubuntu2204 ~]#ansible 10.0.0.153 -m sysctl -a 'name=net.ipv4.ip_forward state=absent'
#再次查看文件已经删除,但是值没发生变化。
[17:16:01 root@rocky86[ ~]#ansible cat /etc/sysctl.conf | grep ip_forward
[17:17:29 root@rocky86[ ~]#
#重启之后再次查看
[17:25:36 root@rocky86[ ~]#sysctl -a | grep "ip_forward ="
net.ipv4.ip_forward = 0
pam_limits 模块
#常用选项
domain=username|@groupname|UID|GID #具体对象
limit_item=core|data|fsize|memlock|nofile|rss|stack|cpu|nproc|as|maxlogins|maxsyslogins|priority|locks|sigpending|msgqueue|nice|rtprio|chroot #修改内容
limit_type=hard|soft|- #限定类型 硬件|软件
value=str #具体值
#范例:
ansible 10.0.0.206 -m pam_limits -a 'domain=tom limit_type=- limit_item=nproc value=200'
# cat /etc/security/limits.conf | grep tom
apt_repository 模块
#常用选项
repo=str #具体源
filename=/path/file #具体文件名,默认加到 /etc/apt/sources.list 中
state=absent|present #absent 删除,present 新增,默认 present
update_cache=yes|no #yes 更新源,相当于执行 apt-get update
apt_key 模块
#常用选项
url=URL #key文件路径
validate_certs=yes|no #是否校验https 的 ssl 证书,默认yes
state=absent|present #absent 删除,present 新增,默认 present
6 ansible中的Playbook
YAML 语言语法
- 在单一文件第一行,用连续三个连字号 "-" 开始,还有选择性的连续三个点号( ... )用来表示文件的 结尾
- 次行开始正常写 Playbook 的内容,一般建议写明该 Playbook 的功能
- 使用#号注释代码
- 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换 行来实现的
- 缩进不支持 tab,必须使用空格进行缩进
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- YAML文件内容是区别大小写的,key/value 的值均需大小写敏感
- 多个 key/value 可同行写也可换行写,同行使用,分隔
- key 后面冒号要加一个空格 比如 key: value
- value 可是个字符串,也可是另一个列表
- YAML 文件扩展名通常为 yml 或 yaml
playbook的构成
#hosts 必须是己在主机清单中定义的主机或IP
- hosts: 10.0.0.206 #IP写法
- hosts: node.linux-magedu.com #主机名写法
- hosts: group1 #分组写法
- hosts: group1:group2 #分组写法,或者关系,两个分组并集
- hosts: group1:&group2 #分组写法,与关系,两个分组交集
- hosts: group1:!group2 #分组写法,非关系,两个分组差集
#remote_user 可以全局指定,也可以在特定 task 中指定,默认是在远程主机上以 root 身份执行,默认
不写此项,切换用户执行需要先完成登录校验或者用 -k 选项手动输入ssh 密码
- hosts: group1 #指定主机分组
gather_facts: no #不收集主机信息
remote_user: tom #远程执行用户
tasks: #task 列表
- name: task1 #task 名称,此 task 以 tom 身份认行
shell: id #具体执行的模块 和参数
- name: task2 #task 名称,此 task 以 jerry 身份连接主机执行
shell: id #具体执行的模块 和参数
remote_user: jerry
- name: task3 #task 名称,此 task 以 jerry 身份运行 sudo 到
root 执行
shell: id #具体执行的模块 和参数
remote_user: jerry
sudo: yes
- name: task4 #task 名称,此 task 以 jerry 身份运行 sudo 到
tom 执行
shell: id #具体执行的模块 和参数
remote_user: jerry
sudo: yes
sudo_user: tom
#task 两种定义方式
#action: module arguments
#module: arguments
#如果是 shell 模块或 command 模块,后面是跟命令,而不是 key=val 写法
- hosts: group1 #指定主机分组
gather_facts: no #不收集主机信息
tasks: #task 列表
- name: task1 #task 名称
action: shell id #具体执行的模块和参数,执行shell 模块,参数是id
- name: task2 #task 名称
command: id #具体执行的模块和参数,执行 command 模块,参数是 id
- name: task3 #task 名称
debug: msg="task3" #非 shell,非 command 模块,后面是 key=val 格式
playbook命令
ansible-playbook <filename.yml> ... [options]
#常用选项
--syntax-check|--syntax #语法检查
-C|--check #模拟执行,只检测可能会发生的改变,但不真正执行操作
[root@ubuntu2204 0710]#ansible-playbook -C ping.yaml
-i|--inventory|--inventory-file #指定主机清单文件
-l|--limit #单独指定主机列表去执行
[root@ubuntu2204 0710]#ansible-playbook -l “10.0.0.161 10.0.0.160” ping.yaml
-k|--ask-pass #远程连接密码
-T|--timeout #连接超时时长,默认10S
-e|--extra-vars #定义变量
--become-user #以指定用户执行
--flush-cache #刷新facts
--list-hosts #列出所有主机
[root@ubuntu2204 0710]#ansible-playbook ping.yaml --list-hosts
playbook: ping.yaml
play #1 (ubuntu): ubuntu TAGS: []
pattern: ['ubuntu']
hosts (2):
10.0.0.161
10.0.0.160
--list-tags #列出playbook中所有 tag
-skip-tags #跳过指定的tags
-t|--tags #只执行特定tag对应的task
--start-at-task #从指定task开始执行
--list-tasks #列出plabook中所有 task
-v--verbose #显示详细信息,最多可以写 vvvvv
ansible-playbook执行结果
0.0.0.150 : ok=3 changed=3 unreachable=0 failed=0 skipped=0
rescued=0 ignored=0
10.0.0.206 : ok=3 changed=3 unreachable=0 failed=0 skipped=0
rescued=0 ignored=0
#OK=3 #3个task 执行成功
#change=3 #3个task 都导致了系统状态发生了改变,如果是查询类task,可以在playbook文件中加上 changed_when:false
#unreachable=0 #0个task不可达
#failed=0 #0个task执行失败
#skipped=0 #跳过0个task
#rescued=0 #0个task被拒绝执行
#ignored=0 #忽略0个task
下面是一个基本的Ansible Playbook示例,其中包含两个任务:安装Nginx服务器和启动Nginx服务。
---
- name: Install and start Nginx
hosts: web_servers
become: yes
tasks:
- name: Install Nginx
apt:
name: nginx
state: present
- name: Start Nginx service
service:
name: nginx
state: started
在上面的示例中,Playbook以YAML格式编写,并使用以下几个关键字:
name:用于给Playbook或任务命名,方便阅读和理解。
hosts:指定要在哪些主机上执行任务。这里使用了web_servers,你可以在Ansible的主机清单文件中定义这个名称,并将其映射到一组实际的主机地址。
become:用于指定是否切换为超级用户(例如root)执行任务。
tasks:指定要执行的任务列表。在这个示例中,有两个任务:安装Nginx和启动Nginx服务。
apt:这是Ansible的apt模块,用于在Debian或Ubuntu系统上安装软件包。
name参数指定要安装的软件包名称,
state参数指定软件包的状态(在此处是present,表示确保软件包已安装)。
service:这是Ansible的service模块,用于管理系统服务。在这个示例中,
name参数指定要管理的服务名称(这里是Nginx),
state参数指定服务的状态(在此处是started,表示启动服务)。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步