ansible安装和常用模块的使用
快速上手ansible
安装ansible
1.安装:yum -y install absible
;版本:ansible-2.9.27-1.el7.noarch
前提:已经部署了免密远程连接
3.配置ansible配置文件如下:
[root@seven-two ~]# egrep -vn '^#|^$' /etc/ansible/ansible.cfg
10:[defaults]
327:[inventory]
340:[privilege_escalation]
346:[paramiko_connection]
370:[ssh_connection]
431:[persistent_connection]
445:[accelerate]
460:[selinux]
469:[colors]
485:[diff]
4.做如下修改
71 host_key_checking = False#关闭主机秘钥检测
111 log_path = /var/log/ansible.log#开启日志功能
forks = 100 # ansible同时可以管理的主机数量
批量管理命令
1.定义一个主机清单文件
-
清单默认在:/etc/ansible/hosts。如果放在其他目录,也可以 -i 手动指定清单
-
写入要被管理的ip,也可以对其分组。类似rsync的模块
-
前提是被管理的主机做了免密登录,不然操作无法执行
vim hosts
[rsyc]
10.0.0.70
10.0.0.71
[other]
10.0.0.72
[web]
10.0.0.8
10.0.0.62
[k8s]
10.0.0.231
2.对所有设备执行一个测试命令,如果组中的主机ip不能被访问,会报错
[root@seven-three ~]# ansible all -m ping
10.0.0.72 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
....
子组功能
-
子组是一个组内包含其他组的逻辑结构。子组中的主机会继承父组的变量和配置
-
Ansible 的
inventory
文件中,子组功能允许将主机分组嵌套在其他组中,从而实现灵活的层次化组织和管理 -
语法:
[组名:children]
小组1
小组2
2.示例。创建2个组db、web,这2个组作为app的子组
[db]
10.0.0.51
10.0.0.52
[web]
10.0.0.231
[app:children]
db
web
3.验证测试,可以基于任意组运行
[root@gitlabansible]# ansible db -m command -a 'pwd' -i hosts_children
10.0.0.52 | CHANGED | rc=0 >>
/root
10.0.0.51 | CHANGED | rc=0 >>
/root
[root@gitlabansible]# ansible web -m command -a 'pwd' -i hosts_children
10.0.0.231 | CHANGED | rc=0 >>
/root
[root@gitlabansible]# ansible app -m command -a 'pwd' -i hosts_children
10.0.0.52 | CHANGED | rc=0 >>
/root
10.0.0.51 | CHANGED | rc=0 >>
/root
10.0.0.231 | CHANGED | rc=0 >>
/root
在hosts手动添加主机信息
- 若被管理的目标主机没有做免密认证,也可手动在hosts文件添加。
- 然后本地就多了个known_hosts文件。等于ansible填了yes/no
- 但并不意味着公钥传递过去了
[rsync]
10.0.0.70 ansible_user=root ansible_hosts=rsync1 ansible_password=aa ansible_port=22
模块介绍和使用
- ansible模块类似linux的命令
- 举例:yum模块类似yum命令,目录/文件增删改查类似file模块…
ansible模块 | 使用说明 |
---|---|
命令模块 (默认) | -a ‘要执行的命令’ 🔔 命令里不支持特殊符号 |
shell | 支持特殊符号。仍要注意特殊字符 |
script | 使用脚本模块 |
… | 使用…模块 |
ansible-doc -s +模块名 | 获取对应模块帮助 |
ansible-doc +模块名 | /EXA获取示例 |
基本模块
shell模块
- command模块不支持管道符等特殊字符…
[root@seven]# ansible all -m shell -a "ifconfig|awk -F '[ /]+' 'NR==2{print \$3}'"
10.0.0.71 | CHANGED | rc=0 >>
10.0.0.71
10.0.0.70 | CHANGED | rc=0 >>
10.0.0.70
脚本模块
shell模块可以看做shell模块的升级版
脚本内容为:
vim x.sh
#!/bin/bash
#desc:用ansible批量系统巡检
hostname
hostname -I
ifconfig|awk -F '[ /]+' 'NR==2{print $3}'
date +%F_%T
sleep 5
执行:ansible all -m script -a ‘/root/x.sh’
10.0.0.71 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 10.0.0.71 closed.\r\n",
"stderr_lines": [
"Shared connection to 10.0.0.71 closed."
],
"stdout": "backup\r\n10.0.0.71 172.16.1.71 \r\n10.0.0.71\r\n2024-04-06_10:07:55\r\n",
"stdout_lines": [
"backup",
"10.0.0.71 172.16.1.71 ",
"10.0.0.71",
"2024-04-06_10:07:55"
]
}
file文件模块
- file模块可以管理文件、目录、软链接
file模块 | 说明 |
---|---|
path | 必填选项 |
state | 不同模式 state=directory 创建目录 state=file (默认) 更新文件,如果文件不存在也不创建 state=link 创建软连接 state=touch 创建文件 state=absent 递归删除 |
src | 指定源文件,如创建软连接/复制时 |
mode | mode=755创建并修改权限 |
owner | owner=root改属主为root |
group | owner=root改属主为root |
state | directory 创建目录,link 创建软连接 |
增/删目录和文件
ansible all -m file -a 'path=/test/ state=directory/absent'
ansible all -m file -a 'path=/test/test.txt state=touch/absent'
- 创建软连接
ansible all -m file -a 'src=/home/ path=/root/home.lns state=link'
copy模块
- 用途:批量分发,类似scp。💊 只能单向分发,不能拉取
copy模块参数 | 说明 |
---|---|
src | 源文件 |
dest | 目的位置 |
backup=yes | 覆盖前备份,文件内容相同则不会产生备份 |
mode:owner/group/preserve(保留权限) | 文件权限设置 |
- 基础使用示例
ansible all -m copy -a 'src=/root/x.sh dest=/test/'
- 生成备份
ansible all -m copy -a 'src=/root/x.sh dest=/test/ backup=yes'
查看这2个文件:x.sh x.sh.17987.2024-04-06@12:58:48~
fetch拉取模块(略)
其他系统模块
lineinfile修改文件模块
- 功能类似sed的编辑
lineinfile参数 | 说明 |
---|---|
path | 要更改的文件,必填 |
regex=‘XX’ | 用正则找到要更改的行 例如以…开头/结尾的行 |
state=absent/present | 增加/删除行 |
insertafter/insertbefore:=‘XX’ | 在之后/之前添加新行XX |
- 插入新行示例
环境:/test/hosts
127.0.0.1
::1 localhost
目的:在第一行上方插入新行"wzy666"
方法:ansible all -m lineinfile -a "path=/test/hosts insertbefore='4$' line='wzy666' "
其中4$表示以4结尾的行,即正则。
systemed服务管理模块
systemed模块 | |
---|---|
name=XX | 服务名 |
enabled=yes/no(可选项) | 是否开机自启改服务 |
state= | state=started 开启 state=stopped 关闭 state=reloaded 重读配置文件(服务支持) state=restarted 重启(关闭再开启) |
- 重启该服务,但是不要把它列入开机自启中
ansible all -m systemd -a "name=NetworkManager enabled=no state=restarted"
验证:可以使用nmtui命令,但是并未自启
[root@wzy~]# systemctl list-unit-files |grep NetworkM
NetworkManager.service disabled
service模块
- 适合一些老旧的linux系统
yum软件管理模块
- 注意:该模块包含yum和apt
yum模块 | |
---|---|
name=XX,yy | 软件名称。多个软件用逗号分隔 也可以是本地rpm包 |
update_cache=yes/no(可选) | 是否开启本地缓存 |
state= | installed 安装(present)(默认) removed 删除 (absent) lastest 安装或更新 |
- 示例:安装sl
ansible all -m yum -a "name=sl"
- 卸载:sl
ansible all -m yum -a "name=sl" state=removed
get-url下载模块
类似wget命令
get_url下载功能 | |
---|---|
url | 指定要下载的地址 |
dest | 下载到哪个目录 🔔不会创建目录 |
validate_certs: no | 不检查证书 |
https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/5.5/rhel/7/x86_64/zabbix-agent-6.0.0-0.1alpha1.el7.x86_64.rpm
- 下载zabbix为例
ansible all -m get_url -a "url=https://XXXX.zabbix/省略... dest=/test/"
yum_repository❌
- 鸡肋功能,不如写好yum配置文件复制过去
yum_repository | |
---|---|
name | yum源中名字 [epel] |
description | yum源的注释说明 对应的 是name的内容 |
baseurl | yum源中 baseurl 下载地址 |
enabled | 是否启动这个源 yes/no |
gpgcheck | 是否启动gpgcheck功能 no |
file | 自动添加为XX.repo 默认与模块名字一致. |
- cat /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch#没用的注释
baseurl=http://mirrors.aliyun.com/epel/7/$basearch
enabled=1
gpgcheck=0
#nginxyum官方源
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
- 手写nginx源
ansible rsync -m yum_repository -a 'name=nginx-stable baseurl="http://nginx.org/packages/centos/$releasever/$basearch/" enabled=yes gpgcheck=no description=wzy'
- 查看效果
[root@nfs-clientyum.repos.d]# cat nginx-stable.repo
[nginx-stable]
baseurl = http://nginx.org/packages/centos/$releasever/$basearch/
enabled = 1
gpgcheck = 0
name = wz
user模块
user模块 | |
---|---|
name | 指定用户名 |
uid= | 指定uid |
group= | 组名,需提前创建组 |
shell= | 指定命令解释器 |
create_home=yes/no | 是否创建家目录(yes/no) |
state= | present 添加 absent删除 |
passwd= | 改密码 |
- 创建用户示例:
ansible rsync -m user -a 'user=www uid=1234 shell=/bin/bash state=present'
批量设置密码
- 先提前做好加密规划。这里设置密码为mypassword
ansible all -i localhost, -m debug -a "msg={{'mypassword' | password_hash('sha512','mysecretsalt') }}"
🔴 处理流程:{{‘mypassword’ | password_hash(‘sha512’,‘mysecretsalt’) }}
mypassword通过管道传递给了后面的sha512加密插件,mysecretsalt作为参与加密参数的字符
加密后的密码为:
localhost | SUCCESS => {
"msg": "$6$mysecretsalt$qJbapG68nyRab3gxvKWPUcs2g3t0oMHSHMnSKecYNpSi3CuZm.GbBqXO8BE6EI6P1JUefhA0qvD7b5LSh./PU1"
}
- 设置密码为mypassword
ansible all -m user -a "name=vv password={{ 'mypassword' | password_hash('sha512', 'mysecretsalt')}} state=present"
也可用之前的密文设置:
ansible all -m user -a 'name=vv password="$6$mysecretsalt$qJbapG68nyRab3gxvKWPUcs2g3t0oMHSHMnSKecYNpSi3CuZm.GbBqXO8BE6EI6P1JUefhA0qvD7b5LSh./PU1" state=present'
- 最简单改密码是用shell模块:
echo "password" |passwd --stdin username
或者echo 'username:aa'|chpasswd
group模块
group | |
---|---|
name=xx | 略 |
gid | 略 |
state | 略 |
mount模块
原理同修改fstab实现永久挂载
mount模块 | |
---|---|
fstype | 文件系统类型 |
src | 源地址 |
path | 挂载点 |
state | 见下方 |
present | 仅写入配置,不进行挂载。会在下次重启系统时挂载 |
mounted | 写入配置,进行挂载 |
unmounted | 卸载设备,但不修改配置fstab文件。会在下次重启系统时挂载 |
absent | 卸载设备,删除对应配置文件 |
remounted | 重新挂载 |
- 在其他设备创建分区/dev/sdb1,并批量挂载
ansible all -m mount -a "src=/dev/sdb1 path=/mnt state=present fstype=xfs"
- 挂载NFS服务器共享的目录
ansible nfs -m mount -a "src=10.0.0.71:/data_nfs path=/mnt state=mounted fstype=nfs"
cron定时模块
cron模块 | |
---|---|
name (必填) | 定时任务名,在最终定时任务里会变成注释 |
job | 要执行的任务 job=ping baidu.com -c3 &>>/tmp/ping.result |
state=present/absent | 创建/删除任务 |
minute | 分 |
hour | 时 |
day | 日 |
month | 月 |
week | 周 |
- 每分钟ping百度
ansible all -m cron -a "job='ping -c2 baidu.com &>/tmp/ping.txt' name=ping"
查看用户定时任务:
#Ansible: ping
* * * * * ping -c2 baidu.com &>/tmp/ping.txt
- 每隔1小时ping
ansible all -m cron -a "job='ping -c2 baidu.com &>/tmp/ping.txt' name=ping minute=00 hour=*/1"
查看用户定时任务:
#Ansible: ping
00 */1 * * * ping -c2 baidu.com &>/tmp/ping.txt
解压模块
- 管理端有一个1.tar.gz的文件,解压后传输到其节点上。
- hosts: nfs
tasks:
- name: 解压1.tar.gz,内容是hosts文件
unarchive:
src: /root/1.tar.gz
dest: /tmp
#被解压的文件如果是在被管理端,需要加上下面这一句
remote_src: yes
selinux模块
selinux:
policy: targeted
#状态可选3种..
state: enforcing
ron -a "job='ping -c2 baidu.com &>/tmp/ping.txt' name=ping minute=00 hour=*/1"`
查看用户定时任务:
#Ansible: ping
00 */1 * * * ping -c2 baidu.com &>/tmp/ping.txt
### 解压模块
- 管理端有一个1.tar.gz的文件,解压后传输到其节点上。
```yaml
- hosts: nfs
tasks:
- name: 解压1.tar.gz,内容是hosts文件
unarchive:
src: /root/1.tar.gz
dest: /tmp
#被解压的文件如果是在被管理端,需要加上下面这一句
remote_src: yes
selinux模块
selinux:
policy: targeted
#状态可选3种..
state: enforcing
原文地址:https://blog.csdn.net/qq_73797346/article/details/144413738
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!