【002】Ansible学习笔记-常用模块
模块索引 https://docs.ansible.com/ansible/latest/modules/modules_by_category.html
为了便于操作我们把上一篇博文设置的主机ip保存到对应目录下
vim hosts
[dbservers]
192.168.23.188
[webservers]
192.168.23.13
cat hosts
Command和Shell模块
两个模块都是在远程服务器上去执行命令。
但command模块是ad-hoc的默认模块,在执行ad-hoc时,若不指定模块的名字则默认使用此模块。
[root@ansible ~]# ansible all -i hosts -a "echo 'hello'"
192.168.23.13 | CHANGED | rc=0 >>
hello
192.168.23.188 | CHANGED | rc=0 >>
hello
两个模块的差异
- shell 模块可以执行SHELL 的内置命令和 特性(比如管道符)。
- command 模块无法执行SHELL 的内置命令和特性
[root@ansible ~]# ansible all -i hosts -m shell -a "echo 'hello' "| grep -o 'e'
e
e
Script模块
将管理节点上的脚本传递到被管理节点(远程服务器)上进行执行
Example
建立一个脚本a.sh
[root@ansible ~]# vim a.sh
脚本 /root/a.sh
内容如下:
touch /tmp/testfile
~
执行并验证
[root@ansible ~]# ansible webservers -i hosts -m script -a "/root/a.sh"
192.168.23.13 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 192.168.23.13 closed.\r\n",
"stderr_lines": [
"Shared connection to 192.168.23.13 closed."
],
"stdout": "",
"stdout_lines": []
}
[root@ansible ~]# ansible webservers -i hosts -m shell -a "ls -l /tmp/testfile"
192.168.23.13 | CHANGED | rc=0 >>
-rw-r--r--. 1 root root 0 6月 10 19:24 /tmp/testfile
Copy模块
copy 模块的主要用于管理节点和被管理节点之间的文件拷贝。
常用参数:
- src 要复制到远程服务器的文件的本地路径。
这可以是绝对的,也可以是相对的。
如果路径是一个目录,则递归地复制它。
在这种情况下,如果路径以“/”结尾,则只有该目录的内部内容被复制到目标。
否则,如果不以“/”结尾,则复制包含所有内容的目录本身。
此行为类似于rsync命令行工具。 - dest 文件应复制到的远程绝对路径。
如果src是一个目录,那么它也必须是一个目录。
如果dest是不存在的路径,则创建dest。
如果dest是相对路径,则起始目录由远程主机确定。
如果src和dest是文件,则不创建dest的父目录,如果父级目录不存在,则任务失败。 - backup 拷贝文件前,若原目标文件发生了变化,则对目标文件进行备份
- woner 指定新拷贝文件的所有者
- group 指定新拷贝文件的所有组
- mode 指定新拷贝文件的权限
Example-copy
copy 管理节点上的 a.txt
到被管理节点上
[root@ansible ~]# cat a.txt
hello
[root@ansible ~]# ansible webservers -i hosts -m copy -a "src=./a.txt dest=./a.txt"
192.168.23.13 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "f572d396fae9206628714fb2ce00f72e94f2258f",
"dest": "./a.txt",
"gid": 0,
"group": "root",
"md5sum": "b1946ac92492d2347c6235b4d2611184",
"mode": "0644",
"owner": "root",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 6,
"src": "/root/.ansible/tmp/ansible-tmp-1654861987.61-32114-268644563655396/source",
"state": "file",
"uid": 0
}
在webserver端查看发现复制成功
[root@webserver1 ~]# ls
anaconda-ks.cfg a.txt basicset.sh
Example-backup copy
[root@ansible ~]# ansible webservers -i hosts -m copy -a "src=./a.txt dest=./a.txt backup=yes"
192.168.23.13 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"checksum": "f572d396fae9206628714fb2ce00f72e94f2258f",
"dest": "./a.txt",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"path": "./a.txt",
"secontext": "unconfined_u:object_r:admin_home_t:s0",
"size": 6,
"state": "file",
"uid": 0
}
Example-用户,组设置
all 是资产清单中的默认组
ansible all -m copy -a "src=./a.txt dest=./a.txt owner=nobody group=nobody"
Example-权限设置
ansible all -m copy -a "src=./a.txt dest=./a.txt mode=0755"
yum_repository模块
添加yum仓库
常用参数
- name 仓库名称
- description 仓库描述
- baseurl yum储存库“repodata”目录的url,也可以说多个url的列表
- file 仓库保存到被管理节点的文件名
- state preset 确认添加仓库文件,absent确认删除仓库文件
yum模块
等同于 Linux 上的YUM 命令, 对远程服务器上RPM包进行管理。
常用参数:
- name 要安装的软件包名, 多个软件包以英文逗号(,) 隔开
- state 对当前指定的软件安装、移除操作(present installed latest absent removed)
支持的参数
- present 确认已经安装,但不升级
- installed 确认已经安装
- latest 确保安装,且升级为最新
- absent 和 removed 确认已移除
安装一个软件包
ansible webservers -i hosts -m yum -a "name=nginx state=present"
ansible webservers -i hosts -m yum -a "name=nginx state=latest"
ansible webservers -i hosts -m yum -a "name=nginx state=installed"
移除一个软件包
ansible webservers -i hosts -m yum -a "name=nginx state=absent"
ansible webservers -i hosts -m yum -a "name=nginx state=removed"
安装一个软件包组
ansible webservers -i hosts -m yum -a "name='@Development tools' state=present"
systemd模块
管理远程节点上的 systemd 服务,就是由 systemd 所管理的服务。
常用参数:
daemon_reload 重新载入 systemd,扫描新的或有变动的单元
enabled 是否开机自启动 yes|no
name 必选项,服务名称 ,比如 httpd vsftpd
state 对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)
Example
重新加载 systemd
# ansible webservers -i hosts -m systemd -a "daemon_reload=yes"
启动 Nginx 服务
# ansible webservers -i hosts -m systemd -a "name=nginx state=started"
关闭 Nginx 服务
# ansible webservers -i hosts -m systemd -a "name=nginx state=stopped"
重启 Nginx 服务
# ansible webservers -i hosts -m systemd -a "name=nginx state=restarted"
重新加载 Nginx 服务
# ansible webservers -i hosts -m systemd -a "name=nginx state=reloaded"
将 Nginx 服务设置开机自启动
# ansible webservers -i hosts -m systemd -a "name=nginx enabled=yes"
group和user模块
group模块
在被管理节点上,对组进行管理。
常用参数:
- name 组名称, 必须的
- system 是否为系统组, yes/no , 默认是 no
- state 删除或这创建,present/absent ,默认是present
创建普通组 db_admin
# ansible webNginx -m group -a "name=db_admin"
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 设置为 yes 将会为用户生成密钥,这不会覆盖原来的密钥
-
ssh_key_type 指定用户的密钥类型, 默认 rsa, 具体的类型取决于被管理节点
-
state 删除或添加用户, present 为添加,absent 为删除;
默认值 present
-
remove 当与 state=absent 一起使用,删除一个用户及关联的目录,
比如家目录,邮箱目录。可选的值为: yes/no
创建用户并设置密码
- 先生成加密密码
pass=$(echo "123456" | openssl passwd -1 -stdin)
- 执行 ansible 命令 创建用户 foo 并设置密码
ansible webservers-i hosts -m user -a "name=foo password=${pass}"
创建用户 yangge, 并且为其创建密钥对,并且密钥类型为: ecdsa
ansible all -m user -a "name=yangge generate_ssh_key=yes ssh_key_type=ecdsa"
创建用 tom, 并且设置其有效期到 2020年4月15日, 加入到组 db_admin 中, 不改变用户原有假如的组。
ansible webservers-i hosts -m user -a "name=tom expires=$(date +%s -d 20200415) gorups=db_admin append=yes"
file模块
file 模块主要用于远程主机上的文件操作。
常用参数:
-
owner 定义文件/目录的属主
-
group 定义文件/目录的属组
-
mode 定义文件/目录的权限
-
path 必选项,定义文件/目录的路径
-
recurse 递归的设置文件的属性,只对目录有效
-
src 链接(软/硬)文件的源文件路径,只应用于state=link的情况
-
dest 链接文件的路径,只应用于state=link的情况
state
-
directory 如果目录不存在,创建目录
-
file 文件不存在,则不会被创建,存在则返回文件的信息,
常用于检查文件是否存在。 -
link 创建软链接
-
hard 创建硬链接
-
touch 如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
-
absent 删除目录、文件或者取消链接文件
Example
// 创建一个文件
ansible all -m file -a "path=/tmp/foo.conf state=touch"
// 改变文件所有者及权限
ansible all -m file -a "path=/tmp/foo.conf owner=nobody group=nobody mode=0644"
// 创建一个软连接
ansible all -m file -a "src=/tmp/foo.conf dest=/tmp/link.conf state=link"
// 创建一个目录
ansible all -m file -a "path=/tmp/testdir state=directory"
// 取消一个连接
ansible all -m file -a "path=/tmp/link.conf state=absent"
// 删除一个文件
ansible all -m file -a "path=/tmp/foo.conf state=absent"
cron模块
管理远程节点的CRON 服务。等同于Linux 中的 计划任务。
注意:使用 Ansible 创建的计划任务,是不能使用本地 crontab -e去编辑,否则 Ansible 无法再次操作此计划任务了。
常用参数:
- name 指定一个cron job 的名字。一定要指定,便于日之后删除。
- minute 指定分钟,可以设置成(0-59, *, */2 等)格式。 默认是 * , 也就是每分钟。
- hour 指定小时,可以设置成(0-23, *, */2 等)格式。 默认是 * , 也就是每小时。
- day 指定天, 可以设置成(1-31, *, */2 等)格式。 默认是 * , 也就是每天。
- month 指定月份, 可以设置成(1-12, *, */2 等)格式。 默认是 * , 也就是每周。
- weekday 指定星期, 可以设置成(0-6 for Sunday-Saturday, * 等)格式。默认是 *,也就是每星期。
job 指定要执行的内容,通常可以写个脚本,或者一段内容。 - state 指定这个job的状态,可以是新增(present)或者是删除(absent)。 默认为新增(present)
Example
// 新建一个 CRON JOB 任务
ansible all -m cron -a "name='create new job' minute='0' job='ls -alh > /dev/null'"
// 删除一个 CRON JOB 任务,删除时,一定要正确指定job 的name参数,以免误删除。
ansible all -m cron -a "name='create new job' state=absent"
登录任何一台管理机验证cron
crontab -l
输出如下信息:
# Ansible: create new job
0 * * * * ls -alh > /dev/null
debug模块
debug 模块主要用于调试时使用,通常的作用是将一个变量的值给打印出来。
常用参数:
- var 直接打印一个指定的变量值
- msg 打印一段可以格式化的字符串
这里引入了变量,我们只需了解 debug 模板的使用即可。在学习变量、剧本时,我们会对它有更深刻的理解。
# ansible all -i hosts -m debug -a "var=role" -e "role=web"
# ansible all -i hosts -m debug -a "msg='role is {{role}} '" -e "role=web"
template模块
template 模块使用了Jinjia2格式作为文件模版,可以进行文档内变量的替换。文件以 .j2 结尾。
常用参数:
- src 指定 Ansible 控制端的 文件路径
- dest 指定 Ansible 被控端的 文件路径
- owner 指定文件的属主
- group 指定文件的属组
- mode 指定文件的权限
- backup 创建一个包含时间戳信息的备份文件,这样如果您以某种方式错误地破坏了原始文件, 就可以将其恢复原状。yes/no
Example
用法其实和 copy 模块基本一样, template 模块的强大之处就是使用变量替换,就是可以把传递给 Ansible 的变量的值替换到模板文件中。
- 建立一个 template 文件, 名为 hello_world.j2
# cat hello_world.j2
Hello {{var}} !
- 执行命令,并且设置变量 var 的值为 world
# ansible all -m template -a "src=hello_world.j2 dest=/tmp/hello_world.world" -e "var=world"
- 在被控主机上验证
# cat /tmp/hello_world.world
Hello world !
lineinfile 模块
在被管理节点上,用正则匹配的方式对目标文件的一行内容修改删除等操作。
如果是在一个文件中把所有匹配到的多行都进行统一处理,请参考replace 模块。
如果想对一个文件进行一次性添加/更新/删除多行内容等操作,参考blockinfile模块
常用参数
-
path 被管理节点的目标文件路径, 必须。
-
state 可选值absent 删除 |present 替换(默认值)。
-
regexp 在文件的每一行中查找的正则表达式。
-
对于 state=present ,仅找到的最后一行将被替换。
-
line 要在文件中插入/替换的行。需要state=present。
-
create 文件不存在时,是否要创建文件并添加内容。yes/no
Example
删除被控节点文件里的某一条内容
# ansible all -m lineinfile -a "path=/etc/sudoers regexp='^%wheel' state=absent"
替换某一行
# ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled' state=present"
blockinfile 模块
对目标文件进行多行的添加/更新/删除操作。
常用参数
- path 目标文件路径
- block 文件中被操作的块内容
- state 块内容如何处理,absent 删除, present 添加/更新(默认值)
Example
向文件/etc/ssh/sshd_config
的最后添加几行内容
添加的内容是
Match User ansible-agent
PasswordAuthentication no
ansible all -m blockinfile -a "path=/etc/ssh/sshd_config block='Match User ansible-agent\nPasswordAuthentication no'"
注意:\n 是换行符的意思。
更新之前的内容
ansible all -m blockinfile -a "path=/etc/ssh/sshd_config block='Match User ansible-agent\nPasswordAuthentication yes'"
删除文件中的连续出现几行内容
ansible all -m blockinfile -a "path=/etc/ssh/sshd_config block='Match User ansible-agent\nPasswordAuthentication yes'
Reference
自动化运维-Ansible by shark_西瓜甜
建议搭配 上述老师的视频食用【千锋云计算】Ansible教程(ansible自动化编程精讲)
————————————————
版权声明:本文为CSDN博主「shark_西瓜甜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_22648091/article/details/117197763