静态资产
文件文件,一个格式类似于INI的文件
默认情况下,Ansible的资产文件位于/etc/ansible/host,如果使用pip安装的则可能没有这文件,可以自己创建。
1、自定义资产
#自定义编写inventory.ini文件
1.1.1.1
2.2.2.2
3.3.3.[1:15]
test01.gyq.com
test03.gyq.com
test[05:09].gyq.com
[web_servers]
192.168.1.2
192.168.1.3
192.168.1.5
[db_servers]
192.168.2.2
192.168.2.3
192.168.1.5
[all_servers]
[all_servers:children]
db_servers
web_servers
1.2如何使用自定义资产
通过-i 参数指定自定义资产的位置即可(可以是全路径,也可以是相对路径)。
ansible all -i inventory.ini ... //伪指令, 不可执行
1.3 如何验证自定义资产
ansible db_servers -i inventory.ini --list-hosts
2、资产选择器
只对部分服务器进行操作,可以使用PATTERN资产选择器
2.1 基本语法格式
ansible PATTERN -i inventory -m module -a argument
使用案例
#选择单个IP
[root@GYQ-master ~]# ansible 1.1.1.1 -i inventory.ini --list-hosts
hosts (1):
1.1.1.1
#选择一组
[root@GYQ-master ~]# ansible web_servers -i inventory.ini --list-hosts
hosts (3):
192.168.1.2
192.168.1.3
192.168.1.5
#使用*号选定
[root@GYQ-master ~]# ansible 3.3.3.1* -i inventory.ini --list-hosts
hosts (7):
3.3.3.10
3.3.3.11
3.3.3.12
3.3.3.13
3.3.3.14
3.3.3.15
3.3.3.1
#使用逻辑匹配
web_server和db_servers的并集
显示两个族内的所有主机
[root@GYQ-master ~]# ansible 'web_servers:db_servers' -i inventory.ini --list-hosts
hosts (5):
192.168.1.2
192.168.1.3
192.168.1.5
192.168.2.2
192.168.2.3
web_server和db_servers的交集
[root@GYQ-master ~]# ansible 'web_servers:&db_servers' -i inventory.ini --list-hosts
hosts (1):
192.168.1.5
#在web_server中,但是不在db_servers中 排除
[root@GYQ-master ~]# ansible 'web_servers:!db_servers' -i inventory.ini --list-hosts
hosts (2):
192.168.1.2
192.168.1.3
Ad-hoc命令相当于一个shell命令
命令语法格式:
ansible pattern [-i inventory] -m module -a argument
pattern 资产选择其
-i 指定资产清单文件的位置
-m 自定本次Ansible ad-hoc要执行的模块。可以类别成SHELL中的命令。
-a 模块的参数,可以类比成SHELL中的命令参数
Ansible模块类型
帮助文档
列举出所有的核心模块和附加模块
ansible-doc -l
查询某个模块的使用方法
ansible-doc 模块名
查询某个模块的使用方法,比较简洁的信息
ansible-doc -s 模块名
常用模块
先准备测试文件hosts
[dbservers]
192.168.40.137
[webservers]
192.168.40.138
4.1 command & shell 模块
两个模块都是在远程服务器上执行命令
但command模块是ad-hoc的默认模块,在执行ad-hoc时,若不指定模块的名字则默认使用此模块。
[root@GYQ-master ~]# ansible all -i hosts -a "echo 'hello'"
192.168.40.137 | CHANGED | rc=0 >>
hello
192.168.40.138 | CHANGED | rc=0 >>
hello
[root@GYQ-master ~]# ansible all -i hosts -m shell -a "echo 'hello'"
192.168.40.138 | CHANGED | rc=0 >>
hello
192.168.40.137 | CHANGED | rc=0 >>
hello
[root@GYQ-master ~]#
两个模块的差异
shell 模块可以执行SHELL的内置命令和特性(比如管道符)。
command模块无法执行SHELL的内置命令和特性
script模块
#ansible webservers -i hosts -m script -a "/root/a.sh"
192.168.40.138 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.40.138 closed.\r\n",
"stderr_lines": [
"Shared connection to 192.168.40.138 closed."
],
"stdout": "",
"stdout_lines": []
}
copy模块
copy 模块的主要用于管理节点和被管理节点之间的文件拷贝
经常使用到参数如下:
src指定拷贝文件的源地址dest指定拷贝文件的目标地址
backup拷贝文件前,若原始文件发生变化,则对目标文件进行备份
woner 指定新拷贝文件的所有者
group 指定新拷贝文件的所有组
mode指定新拷贝文件的权限
案例:
#拷贝文件到目标主机
[root@GYQ-master ~]# ansible webservers -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo"
192.168.40.138 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "21b7750daa3e959a63aab1564d748e326d565d50",
"dest": "/etc/yum.repos.d/nginx.repo",
"gid": 0,
"group": "root",
"md5sum": "640b9f8a4cc8dc99cb1a0048f28afd4f",
"mode": "0644",
"owner": "root",
"secontext": "system_u:object_r:system_conf_t:s0",
"size": 357,
"src": "/root/.ansible/tmp/ansible-tmp-1678688946.53-7950-171811340470478/source",
"state": "file",
"uid": 0
}
#查看
[root@GYQ-master ~]# ansible webservers -i hosts -a "ls /etc/yum.repos.d"
192.168.40.138 | CHANGED | rc=0 >>
CentOS-Base.repo
CentOS-CR.repo
CentOS-Debuginfo.repo
CentOS-fasttrack.repo
CentOS-Media.repo
CentOS-Sources.repo
CentOS-Vault.repo
epel.repo
epel-testing.repo
nginx.repo
[root@GYQ-master ~]#
copy 前, 在被管理节点上对原文件进行备份
ansible webservers -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo backup=yes"
copy文件的同时对文件进行用户及用户组设置
[root@GYQ-master ~]# ansible webservers -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo owner=nobody group=nobody"
192.168.40.138 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "21b7750daa3e959a63aab1564d748e326d565d50",
"dest": "/etc/yum.repos.d/nginx.repo",
"gid": 99,
"group": "nobody",
"mode": "0644",
"owner": "nobody",
"path": "/etc/yum.repos.d/nginx.repo",
"secontext": "system_u:object_r:system_conf_t:s0",
"size": 357,
"state": "file",
"uid": 99
}
copy文件的同时对文件进行权限设置
[root@GYQ-master ~]# ansible webservers -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo mode=0755"
192.168.40.138 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "21b7750daa3e959a63aab1564d748e326d565d50",
"dest": "/etc/yum.repos.d/nginx.repo",
"gid": 99,
"group": "nobody",
"mode": "0755",
"owner": "nobody",
"path": "/etc/yum.repos.d/nginx.repo",
"secontext": "system_u:object_r:system_conf_t:s0",
"size": 357,
"state": "file",
"uid": 99
}
yum_repsitory模块
添加YUM仓库
常用参数
name 仓库名称,就是仓库文件中第一行的中括号中名称,必须的参数。
description 仓库描述信息,添加时必须的参数
baseurl yum存储库"repodata"目录所在目录的URL,添加时必须的参数。它也可以是多个URL的列表。
file 仓库文件保存到被管理节点的文件名,不包含.repo。默认是name的值。
state preset确认添加仓库文件,absent 确认删除仓库文件。
gpgcheck 是否检查GPG yes | no,没有默认值,使用/etc/yum.conf中的配置
Example
添加epel源
[root@GYQ-master ~]# ansible dbservers -i hosts -m yum_repository -a "name=epel baseurl='https://download.fedoraproject.org/pub/epel/$releasever/$basearch/' description='EPEL YUM repo'"
192.168.40.137 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"repo": "epel",
"state": "present"
}
删除epel源
[root@GYQ-master ~]# ansible dbservers -i hosts -m yum_repository -a "name=epel state=absent"
192.168.40.137 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"repo": "epel",
"state": "absent"
}
yum模块
等同于Linux上的YUM命令,对远程服务器上的RPM包进行管理
常用参数:
name 要安装的软件包名,多个软件包以逗号(,)隔开
state 对当前指定的软件安装、一处操作(present installed latest absent removed)
支持的参数
- present 确认已经安装,但不升级
- installed 确认已经安装
- latest 确保安装,且升级为最新
- absent 和 removed 确认已移除
案例:安装一个nginx软件
ansible webservers -i hosts -m yum -a "name=nginx state=present" #其他安装方式一致
到目标主机上查看是否安装了nginx
移除一个软件包
ansible webservers -i hosts -m yum -a "name=nginx state=removed"
安装一个软件包组
ansible webservers -i hosts -m yum -a "name='@Development tools' state=present"
systemd模块
daemon_reload 重新载入systemd, 扫描新的或有变动的单元
enabled 是否开机自启动yes |no
name 必选项,服务名称,比如httpd vsftpd
state 对当前服务执行启动,停止、重启、重新加载等操作
(started,stopped,restarted,reloaded)
案例:重新加载系统后台进程
[root@GYQ-master ~]# ansible webservers -i hosts -m systemd -a "daemon_reload=yes"
192.168.40.138 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"name": null,
"status": {}
}
启动nginx服务
ansible webservers -i hosts -m systemd -a "name=nginx state=started"
关闭nginx服务
ansible webservers -i hosts -m systemd -a "name=nginx state=stopped"
group模块
在被管理节点上,对组进行管理。
常用参数:
name 组名称,必须的
system 是否为系统组,yes/no 默认是no
state 删除或者创建,present/absent,默认是present
案例:
[root@GYQ-master ~]# ansible dbservers -i hosts -m group -a "name=db_admin"
192.168.40.137 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"gid": 1000,
"name": "db_admin",
"state": "present",
"system": false
}
user模块
用于在被管理节点上对用户进行管理
常用参数:
name 必须的参数,指定用户名
password 设置用户的密码,这里接受一个加密的值,因为会直接存到shadow
update_password 假如设置的密码不同于原密码,则会更新密码.在1.3版本中被加入
home 指定用户的家目录
shell 设置用户的shell
comment 用户的描述信息
create_home 在创建用户时,是否创建其家目录。默认创建,假如不创建,设置为no。2.5版本之前使用createhome
group 设置用户的主组
groups 将用户加入到多个其他组中,多个用逗号隔开。
默认会把用户从其他已经加入的组中删除。
append yes|no和groups配合使用,yes 时,不会把用户从其他已经加入的组中删除
system 设置为yes时,将会创建一个 系统账号
expires 设置用户的过期时间,值为时间戳,会转为为天数后,放在 shadow 的第8个字段里;
generate_ssh_key设置为 yles将会为用户生成密钥,这不会覆盖原来的密钥
ssh_key_type 指定用户的密钥类型,默认 rsa,具体的类型取决于被管理
节点
state 删除或添加用户, present为添加,absent 为删除;默认值present
remove 当与state=absent -起使用,删除一个用户 及关联的目录,比如家目录,邮箱目录。可选的值为: yes/no
案例:
创建用户并设置密码
#第一步:先生成加密密码
[root@GYQ-master ~]# pass=$(echo "123456" | openssl passwd -1 -stdin)
[root@GYQ-master ~]# echo $pass
$1$KAvZ0DCJ$Tp7vgBM8qPyDq5KBQqwn2/
#第二部创建用户并设置密码
ansible all -i hosts -m user -a "name=foo password=${pass}"
创建用户yangge,并且为其创建密钥对,并且密钥类型为:ecdsa
nsible all -i hosts -m user -a "name=yangge generate_ssh_key=yes ssh_key_type=ecdsa"
创建用tom,并且设置其有效期
到2023年10月1日,加入到组db_admin中,不改变原有加入的组。
ansible dbservers -i hosts -m user -a "name=tom expires=$(date +%s -d 20231001) groups=db_admin append=yes"
date命令说明
file 模块
主要用于远程主机上的文件操作
常用参数:
owner 定义文件/目录的属主
group 定义文件/目录的属组
mode 定义文件/目录的权限
path 必选项,定义文件/目录的路径
recurse 递归的设置文件的属性,只对目录有效
src 要被链接(软/硬)的源文件的路径,只应用于state=link的情况
dest 被链接到的路径,只应用于state=link的情况
state
directory 如果目录不存在,创建目录
file 文件不存在,则不会被创建,存在则返回文件的信息,常用于检查文件是否存在。
link 创建软链接
hard 创建硬链接
touch 如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent 删除目录、文件或者取消链接文件
创建一个文件
ansible all -i hosts -m file -a "path=/tmp/foo.conf state=touch"
改变文件所有者及权限
ansible all -i hosts -m file -a "path=/tmp/foo.conf owner=nobody group=nobody mode=0644"
创建一个软连接
ansible all -i hosts -m file -a "src=/tmp/foo.conf dest=/tmp/link.conf state=link"
创建目录
ansible all -i hosts -m file -a "path=/tmp/testdir state=directory"
取消一个链接·
ansible all -i hosts -m file -a "path=tmp/link.conf state=absent"
删除一个文件和目录
ansible all -i hosts -m file -a "path=/tmp/foo.conf state=absent"
ansible all -i hosts -m file -a "path=/tmp/testdir state=absent"
cron模块
管理员成节点的CRON服务。等同于Linux中的定时任务。
注意:使用Ansible创建的计划任务,是不能使用本地任务crontab -e 去编辑的,否则Ansible无法再次操作此任务了。
常用参数
name 指定一个cron job的名字。王定要指定,便于日之后删除。
minute 指定分钟,可以设置成(O-59,*,*/2等)格式。默认是*,也就是每分钟。
hour 指定小时,可以设置成(0-23,*,*/2等)格式。默认是*,也就是每小时。
day 指定天,可以设置成(1-31,*,*/2等)格式。默认是*,也就是每天。
month 指定月份,可以设置成(1-12,*,*/2等)格式。默认是*,也就是每周。
weekday 指定星期,可以设置成(O-6 for Sunday-Saturday,*等)格式。默认是*,也就是每星期。
job 指定要执行的内容,通常可以写个脚本,或者一段内容。
state 指定这个job的状态,可以是新增(present)或者是删除(absent)。默认为新增(present)
案例:
新建一个Cron Job任务
ansible all -i hosts -m cron -a "name='create new job' minute='0' job='ls -alh > /dev/null'"
删除一个CRON JOB任务
ansible all -i hosts -m cron -a "name='create new job' state=absent"
debug模块
debug模块主要用来调式时使用,通常的作用是将一个变量的值给打印出来。
常用参数:
var 直接打印一个指定的变量值
msg 打印一段可以格式化的字符串
案例:
template模块
template模块使用jinjia2格式作为文件模板,可以进行文档内变量的替换。
他的每次使用都会被ansible标记为"changed"状态。文件以.j2结尾。
常用参数:
src指定Ansible控制端的文件路径
dest指定Ansible 被控端的文件路径
owner 指定文件的属主
group指定文件的属组
mode指定文件的权限
backup 创建一个包含时间戳信息的备份文件,这样如果您以某种方式错误地破坏了原始文件,就可以将其恢复原状。yes/no
案例:
用法和copy模块基本一样,template模块的强大之处就是使用变量替换,就是可以把传递给Ansible的变量的值替换到模板中。
1.建立一个templte文件,名为hello_world.j2
#cat hello_world.j2
Hello {{var}} !
2.执行命令,并且设置变量 var 的值为 world
#ansible all -i hosts -m template -a "src=hello_world.j2 dest=/tmp/hello_world" -e "var=world"
3.在被控主机上验证
#cat /tmp/hello_world.world
Hello world !
lineinfile
在被管理节点上,用正则匹配的方式对目标文件的一行内容修改删除等操作。
如果是在一个文件中把所有匹配到的多行统一处理统一处理,请参考replace模块。
如果相对文件中的多行进行添加/更新/删除等操作,参考blockinfile模块
常用参数
path 被管理节点的目标文件路径,必须。
state 可选值absent 删除| present 替换(默认值)。
regexp 在文件的每- -行中查找的正则表达式。对于state=present ,仅找到的最后-行将被替换。
line 要在文件中插入/替换的行。需要state=present。
create 文件不存在时,是否要创建文件并添加内容。yes/no
案例:
删除被控节点文件里的某一条内容
ansible dbservers -i hosts -m lineinfile -a "path=/etc/sudoers regexp='^%wheel' state=absent"
替换某一行
ansible dbservers -i hosts -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SElinux=disabled' state=present"