ansible安装和常用模块的使用

快速上手ansible

安装ansible

1.安装:yum -y install absible ;版本:ansible-2.9.27-1.el7.noarch

前提:已经部署了免密远程连接

3.配置ansible配置文件如下:

bash 复制代码
[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.做如下修改

bash 复制代码
71 host_key_checking = False	#关闭主机秘钥检测
111 log_path = /var/log/ansible.log	#开启日志功能
forks          = 100  # ansible同时可以管理的主机数量

批量管理命令

1.定义一个主机清单文件

  • 清单默认在:/etc/ansible/hosts。如果放在其他目录,也可以 -i 手动指定清单

  • 写入要被管理的ip,也可以对其分组。类似rsync的模块

  • 前提是被管理的主机做了免密登录,不然操作无法执行

vim hosts

bash 复制代码
[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不能被访问,会报错

bash 复制代码
[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 文件中,子组功能允许将主机分组嵌套在其他组中,从而实现灵活的层次化组织和管理

  • 语法:

bash 复制代码
[组名:children]
小组1
小组2

2.示例。创建2个组db、web,这2个组作为app的子组

bash 复制代码
[db]
10.0.0.51
10.0.0.52

[web]
10.0.0.231

[app:children]
db
web

3.验证测试,可以基于任意组运行

bash 复制代码
[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
    • 但并不意味着公钥传递过去了
bash 复制代码
[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模块不支持管道符等特殊字符...
bash 复制代码
[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模块的升级版

脚本内容为:

bash 复制代码
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'

python 复制代码
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
bash 复制代码
[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'

  • 查看效果
bash 复制代码
[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小时pingansible 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的文件,解压后传输到其节点上。
yaml 复制代码
- hosts: nfs
  tasks:
    - name: 解压1.tar.gz,内容是hosts文件
      unarchive:
        src: /root/1.tar.gz
        dest: /tmp
        #被解压的文件如果是在被管理端,需要加上下面这一句
        remote_src: yes

selinux模块

yaml 复制代码
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模块

yaml 复制代码
selinux:
  policy: targeted
  #状态可选3种..
  state: enforcing
相关推荐
心随_风动17 分钟前
CentOS 下安装和配置 HTTPD 服务的详细指南
linux·运维·centos
信阳农夫21 分钟前
centos 7只能安装到3.6.8
linux·运维·centos
游客5202 小时前
自动化办公|xlwings生成图表
python·自动化
2401_867021902 小时前
linux下软件安装、查找、卸载
linux
TT-Kun2 小时前
Linux | 进程控制(进程终止与进程等待)
linux·运维·服务器
...:...:...2 小时前
Linux 第三次脚本作业
linux·运维·服务器
二十七剑3 小时前
jvm调试和查看工具
java·linux·jvm
菜菜小蒙3 小时前
【Linux】基于UDP/TCP服务器与客户端的实现
linux·服务器·udp
a小胡哦3 小时前
Windows、Mac、Linux,到底该怎么选?
linux·windows·macos·操作系统
_extraordinary_3 小时前
Linux权限(一)
android·linux·excel