ansible

1. Ansible概述

自动化运维: 批量管理,批量分发,批量执行,维护...

Ansible是python写的.

 

批量管理工具

说明

Ansible

无客户端,基于ssh进行管理与维护

Saltstack

需要安装客户端,基于ssh进行管理,与ansible.

terraform

tf批量管理基础设施(批量创建100台公有云)
......  

2. Ansible管理架构

2.1 ansible组成

2.1.1 Inventory 主机清单:

被管理主机的ip列表,也包含分类.

2.1.2 ad-hoc模式:

命令行批量管理(使用ans模块),临时任务.

2.1.3 playbook 剧本模式:

类似于把操作写出脚本,可以重复运行这个脚本.

3. 部署与配置

3.1 部署

#1.安装pip工具 (pip python软件包管理器) 麒麟系统中安装
yum install -y python3-pip
#2.pip 使用pip安装ansible
pip3 install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple ansible

#3.安装配置path环境变量
echo 'export PATH=/usr/local/bin/:$PATH' >>/etc/profile
source /etc/profile
#4.检查
ansible --version


#centos中可以直接安装
yum install -y ansible

安装ansible 报错:error: out of memory  内存不足

# 通常tmp大小是分配内存的一半
[root@m01 ~]#  free -h
              total        used        free      shared  buff/cache   available
Mem:          1.9Gi       271Mi       1.0Gi       4.0Mi       627Mi       1.5Gi
Swap:         2.0Gi       7.0Mi       2.0Gi
[root@m01 ~]# 
[root@m01 ~]# df -h /tmp
文件系统        容量  已用  可用 已用% 挂载点
tmpfs           979M     0  979M    0% /tmp
[root@m01 ~]# 

# 解决:
1.临时取消tmp分区挂载(直接挂到根上,centos,debian就是这做的)
[root@m01 ~]# umount /tmp
[root@m01 ~]# 
[root@m01 ~]# df -h /tmp
文件系统               容量  已用  可用 已用% 挂载点
/dev/mapper/klas-root   96G  4.7G   92G    5% /

2.永久取消tmp分区
[root@m01 ~]# systemctl disable tmp.mount
[root@m01 ~]# systemctl mask tmp.mount
Created symlink /etc/systemd/system/tmp.mount → /dev/null.
[root@m01 ~]# systemctl stop tmp.mount

3.2 配置

# 修改配置文件关闭主机Host_key_checking .
# 修改配置文件开启日志功能.
[root@m01 ~]# egrep -nv '^$|#' /etc/ansible/ansible.cfg
10:[defaults]
11:interpreter_python=/usr/bin/python3
72:host_key_checking = False
181:deprecation_warnings = False
328:[inventory]
341:[privilege_escalation]
347:[paramiko_connection]
371:[ssh_connection]
432:[persistent_connection]
446:[accelerate]
461:[selinux]
470:[colors]
486:[diff]

未关闭主机密钥检查后不输入yes/no,然后报错

4. Ans-inventory主机清单

  • 什么是主机清单: 让ansible管理的节点的列表.
  • ansible默认读取在/etc/ansible/hosts文件,并非/etc/hosts.
  • 未来实际使用中一般我们会把主机清单文件存放在指定的目录中,运行ansible的时候通过-i选项指定主机清单文件即可.

环境准备

分类 主机名 ip地址
ansible管理端 m01

10.0.0.61/172.16.1.71

被管理端

web web01 10.0.0.69/172.16.1.69
被管理端 nfs nfs01

10.0.0.68/172.16.1.68

被管理端

backup backup  10.0.0.67/172.16.1.67

4.1 批量管理主机并执行hostname命令 ⭐⭐⭐⭐⭐

ansible命令格式

ansible 主机ip或分组或all -m 指定使用的模块名字 -a 模块中的参数

command 模块是ansible默认的模块可以不写.

# 主机清单格式:
[分类或分组的名字] #注意分类要体现出服务器的作用
ip地址或主机名或域名 #注意主机名要能解析才行

[root@m01 ~]# cat /etc/ansible/hosts 
[backup]
172.16.1.67

[nfs01]
172.16.1.68

[web01]
172.16.1.69 ansible_user=root  ansible_password=123 ansible_port=22
#172.16.1.70

[root@m01 ~]# ansible all -m command -a 'hostname -I'
[DEPRECATION WARNING]: Ansible will require Python 3.8 or newer on the controller starting with Ansible 2.12. Current version: 3.7.9 (default, Jun 10 2022, 11:25:35) [GCC
 7.3.0]. This feature will be removed from ansible-core in version 2.12. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
172.16.1.67 | CHANGED | rc=0 >>
10.0.0.67 172.16.1.67 
172.16.1.69 | CHANGED | rc=0 >>
10.0.0.69 172.16.1.69 
172.16.1.68 | CHANGED | rc=0 >>
10.0.0.68 172.16.1.68 
[root@m01 ~]# 

4.2 给backup,nfs 2个组合并新的组叫data ⭐⭐⭐

主机清单分组详解:

需要我们进行分组:按照层次进行分组,按照功能/业务.

# 子组使用children关键词创建
格式:
[data:children] #组名字:children即可.
分组的名字

[root@m01 ~]# cat /etc/ansible/hosts 
[backup]
172.16.1.67

[nfs01]
172.16.1.68

[web01]
172.16.1.69 ansible_user=root  ansible_password=Liuxiaoke123 ansible_port=22
#172.16.1.70

[data:children]
nfs01
backup

[root@m01 ~]# ansible data -m command -a 'hostname'
[DEPRECATION WARNING]: Ansible will require Python 3.8 or newer on the controller starting with Ansible 2.12. Current version: 3.7.9 (default, Jun 10 2022, 11:25:35) [GCC
 7.3.0]. This feature will be removed from ansible-core in version 2.12. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
172.16.1.67 | CHANGED | rc=0 >>
backup
172.16.1.68 | CHANGED | rc=0 >>
nfs01
[root@m01 ~]# 

4.3 主机清单中表示范围 ⭐⭐⭐⭐

[root@m01 ~]# cat /etc/ansible/hosts
[web]
172.16.1.[5:10] #[从哪里开始:到哪里结束] 172.16.1.5-10

4.4 指定用户,密码

不推荐,推荐先配置密钥认证,然后管理

主机清单没有配置密钥认证,主机清单如何书写.

172.16.1.69 ansible_user=root  ansible_password=123 ansible_port=22

4.5 批量管理400台机器

4.5.1 环境准备

1. 先准备好zabbix服务端  8c 16G 500G
2. 400台服务器上部署zabbix-agent
3. 流程
  a. 安装软件
  b. 配置文件
  c. 启动服务
4. 需求:
  a. 400台 300Linux 100 win_server 2012 r2
  b. 400台所有的密码不同. 

4.5.2 规划

1. 批量创建主机清单脚本

 linux_pass.txt 
ip 用户名 密码 linux
ip 用户名  密码 win
书写一个脚本生成主机清单文件

#!/bin/bash
#author: xk
#desc: 读取密码文件批量创建主机清单文件.
i=0
j=0

while read  ip  user  pass type
do
  if [ "$type" = "linux"  ];then
    if [ $i -eq 0 ];then
       echo [linux_servers]    >>  hosts
       i=1
    fi
    echo $ip    ansible_user=$user   ansible_port=22  ansible_password=$pass   >>  hosts
  fi
    if [ "$type" = "win"  ];then
      if [ $j -eq 0 ];then
       echo [win_servers]    >>  hosts
       j=1
    fi
    echo $ip    ansible_user=$user   ansible_port=22  ansible_password=$pass   >>  hosts
  fi
done  <linux_pass.txt

2. 主机清单的内容

 [linux_servers]
10.0.0.9   ansible_user=root   ansible_port=22  ansible_password=xxxx

[win_servers]
10.0.0.10   ansible_user=administrator     ansible_password=xxxx

[win_servers:vars]
ansible_connection="winrm"
ansible_port=5985 
#5985 http
#5986 https
ansible_winrm_transport="ntlm"
ansible_winrm_server_cert_validation=ignore

3. 管理机安装winrm模块

yum install python-winrm  #如果ansible是python3安装 python3-winrm
或者 
pip install  pywinrm       #如果ansible是python3安装   pip3 install pywinrm

4.进行检查

#1. 检查linux
ansible  -i hosts  -f 50   linux_servers   -m ping 

#2. 检查windows 
ansible  -i hosts  -f 50   linux_servers   -m win_ping 

#-f  forks  并发数,默认是5.

5.书写剧本

#1. 下载软件
#2. 安装软件
#3. 分发配置文件
#4. 启动服务
#5. handlers 检查配置变化与自动重启服务

参考链接:https://docs.ansible.com/ansible/latest/collections/ansible/windows/index.html#plugins-in-ansible-windows

4.6 小结

主机清单对应写法

应用场景

基本分组 ⭐ ⭐ ⭐ ⭐ ⭐

最常用的,ip,主机名 172.16.1.[5:10]

+children 子组 ⭐ ⭐ ⭐ ⭐

普通的组无法满足了,可以套娃,给组创建组.

在主机清单中指定被管理端的用户名,密码,ssh端口号

无法进行密钥认证.

主机清单获取:

  1. 根据已有的清单获取(表格...其他系统)
  2. 公有云导出
  3. 书写脚本ping/fping+获取ip.

主机清单(inventory) 直接分组,使用子组

ansible格式:

ansible 主机 -m 模块 -a 参数

ansible all所有主机/分组名字/主机

主机清单如果不在/etc/ansible/hosts,则需要通过ansible -i选项指定

帮助:  https://docs.ansible.com/ansible/latest/inventory_guide/intro_inventory.html

5. Ansible必知必会模块

  • Ansible模块概述:
    • ansible中的模块就类似于Linux中的命令,我们Linux命令管理系统,我们通过ansible模块实现批量管理.
    • ansible中模块一般相当于Linux中的一些命令.yum模块,file模块,user模块.
    • ansible中的模块拥有不同的选项,这些选项一般都是一些单词,拥有自己的格式与要求.

ansible -m 模块 -a 命令参数 -i 指定文件

模块分

模块 对应的命令

命令和脚本模块

command模块 ans默认的模块,执行简单命 ,不支持特殊符号

 
 

shell模块 执行命令,支持特殊符号

 
 

script模块 分发脚本然后执行

 

文件

file 创建目录,文件,软连接,

touch,mkdir,ln -s,rm

  copy 远程分发==文件,修改权限,所有者,备份

批量scp/rsync

服务

systemd服务管理

systemctl命令服务

开关重启,开机自启动

 

service 服务管理(了解)

 

软件包

yum源 yum_repository  
 

yum模块/apt模块

 yum命令/apt命令
 

get_url下载软件

wget命令,下载内容.

其他系统管理

mount模块 挂载

mount挂载命令.
 

cron模块 定时任务

 

定时任务:crontab -e 编辑定时任务

用户管理

group模块 管理用户组

 
 

user模块 管理用户

useradd命令

其他可以研究

压缩解压(unarchive) ,rsync模块(synchronize),

数据库模块(mysql_db,mysql_user)...

 

其他

ansible管理docker k8s zabbix grafana ...

 

用于调试模块

ping 模块检查 ansible与其他节点连通性.

 

 

debug 模块 用于检查/显示 变量 剧本使用.

 

官网:https://docs.ansible.com/ansible/latest/collections/index.html

本地命令: ansible-doc -s copy

5.1 命令与脚本类模块

5.1.1 command模块⭐⭐⭐⭐⭐

ans默认的模块,适用于执行简单的命令,不支持特殊符号.

批量获取所有主机的主机名
 [root@m01 ~]# ansible all -m command -a 'hostname'
172.16.1.67 | CHANGED | rc=0 >>
backup
172.16.1.68 | CHANGED | rc=0 >>
nfs01
172.16.1.69 | CHANGED | rc=0 >>
web01
[root@m01 ~]# 
[root@m01 ~]# ansible all -a 'hostname'
172.16.1.67 | CHANGED | rc=0 >>
backup
172.16.1.69 | CHANGED | rc=0 >>
web01
172.16.1.68 | CHANGED | rc=0 >>
nfs01
[root@m01 ~]# 

[root@m01 ~]# ansible all -a 'ip a s ens33'
[DEPRECATION WARNING]: Ansible will require Python 3.8 or newer on the controller starting with Ansible 
2.12. Current version: 3.7.9 (default, Jun 10 2022, 11:25:35) [GCC 7.3.0]. This feature will be removed from
 ansible-core in version 2.12. Deprecation warnings can be disabled by setting deprecation_warnings=False in
 ansible.cfg.
172.16.1.67 | CHANGED | rc=0 >>
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:50:56:3e:c6:d4 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.67/24 brd 10.0.0.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::d164:8730:891c:6d04/64 scope link dadfailed tentative noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::73c4:a5cc:ca9b:b3d1/64 scope link dadfailed tentative noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::48d7:197a:dde0:e786/64 scope link dadfailed tentative noprefixroute 
       valid_lft forever preferred_lft forever
172.16.1.68 | CHANGED | rc=0 >>
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:50:56:2c:73:be brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.68/24 brd 10.0.0.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::d164:8730:891c:6d04/64 scope link dadfailed tentative noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::73c4:a5cc:ca9b:b3d1/64 scope link dadfailed tentative noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::48d7:197a:dde0:e786/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
172.16.1.69 | CHANGED | rc=0 >>
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:39:f3:b7 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.69/24 brd 10.0.0.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::73c4:a5cc:ca9b:b3d1/64 scope link dadfailed tentative noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::d164:8730:891c:6d04/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@m01 ~]# 

5.1.2 shell模块⭐⭐⭐⭐⭐

与command模块类似,但是shell支持特殊符号.

批量获取ip地址
 [root@m01 ~]# ansible all -m shell -a "ip a s ens33 |awk -F'[ /]+' 'NR==3{print \$3}'"
172.16.1.67 | CHANGED | rc=0 >>
10.0.0.67
172.16.1.69 | CHANGED | rc=0 >>
10.0.0.69
172.16.1.68 | CHANGED | rc=0 >>
10.0.0.68

[root@m01 ~]# ansible all -m shell -a "ip a s ens33 |awk -F'[ /]+' 'NR==3{print $3}'"
[DEPRECATION WARNING]: Ansible will require Python 3.8 or newer on the controller starting with Ansible 
2.12. Current version: 3.7.9 (default, Jun 10 2022, 11:25:35) [GCC 7.3.0]. This feature will be removed from
 ansible-core in version 2.12. Deprecation warnings can be disabled by setting deprecation_warnings=False in
 ansible.cfg.
172.16.1.67 | CHANGED | rc=0 >>
    inet 10.0.0.67/24 brd 10.0.0.255 scope global noprefixroute ens33
172.16.1.68 | CHANGED | rc=0 >>
    inet 10.0.0.68/24 brd 10.0.0.255 scope global noprefixroute ens33
172.16.1.69 | CHANGED | rc=0 >>
    inet 10.0.0.69/24 brd 10.0.0.255 scope global noprefixroute ens33
[root@m01 ~]#

温馨提示:

shell模块不推荐执行较为复杂的指令,如果需要执行放在脚本中执行.避免因为特殊符号和引号导致的问题.

5.1.3  script模块⭐⭐⭐⭐⭐

执行流程:分发脚本(传输脚本),在被管理端运行脚本

ansible_scripts.sh
 [root@m01 ~]# cat /server/scripts/ansible_scripts.sh 
#!/bin/bash
##############################################################
# File Name:/server/scripts/ansible_scripts.sh
# Version:V1.0
# Author:xk
# Organization:
# Desc:巡检脚本
##############################################################
hostname
hostname -I
ip a s eth0 |awk -F'[ /]+' 'NR==3{print $3}'
uptime
whoami
date +%F
sleep 30

批量执行脚本获取主机信息

查看代码
 [root@m01 ~]# ansible all -m script -a '/server/scripts/ansible_scripts.sh'
172.16.1.69 | CHANGED => {
    "changed": true,
    "rc": 0,
    "stderr": "Shared connection to 172.16.1.69 closed.\r\n",
    "stderr_lines": [
        "Shared connection to 172.16.1.69 closed."
    ],
    "stdout": "web01\r\n10.0.0.69 172.16.1.69 \r\nDevice \"eth0\" does not exist.\r\n 17:03:49 up  8:47,  2 users,  load average: 0.00, 0.00, 0.00\r\nroot\r\n2024-10-15\r\n",
    "stdout_lines": [
        "web01",
        "10.0.0.69 172.16.1.69 ",
        "Device \"eth0\" does not exist.",
        " 17:03:49 up  8:47,  2 users,  load average: 0.00, 0.00, 0.00",
        "root",
        "2024-10-15"
    ]
}
172.16.1.68 | CHANGED => {
    "changed": true,
    "rc": 0,
    "stderr": "Shared connection to 172.16.1.68 closed.\r\n",
    "stderr_lines": [
        "Shared connection to 172.16.1.68 closed."
    ],
    "stdout": "nfs01\r\n10.0.0.68 172.16.1.68 \r\nDevice \"eth0\" does not exist.\r\n 17:03:49 up  8:47,  1 user,  load average: 0.00, 0.00, 0.00\r\nroot\r\n2024-10-15\r\n",
    "stdout_lines": [
        "nfs01",
        "10.0.0.68 172.16.1.68 ",
        "Device \"eth0\" does not exist.",
        " 17:03:49 up  8:47,  1 user,  load average: 0.00, 0.00, 0.00",
        "root",
        "2024-10-15"
    ]
}
172.16.1.67 | CHANGED => {
    "changed": true,
    "rc": 0,
    "stderr": "Shared connection to 172.16.1.67 closed.\r\n",
    "stderr_lines": [
        "Shared connection to 172.16.1.67 closed."
    ],
    "stdout": "backup\r\n10.0.0.67 172.16.1.67 \r\nDevice \"eth0\" does not exist.\r\n 17:03:49 up  7:01,  1 user,  load average: 0.00, 0.00, 0.00\r\nroot\r\n2024-10-15\r\n",
    "stdout_lines": [
        "backup",
        "10.0.0.67 172.16.1.67 ",
        "Device \"eth0\" does not exist.",
        " 17:03:49 up  7:01,  1 user,  load average: 0.00, 0.00, 0.00",
        "root",
        "2024-10-15"
    ]
}
[root@m01 ~]# 

# ansible 将脚本临时放到被管理端的/root/.ansible/tmp目录下,脚本执行完后自动删除
[root@web01 ~]# ps -ef | grep ansible
root       13712   13536  0 17:03 pts/1    00:00:00 /bin/sh -c  /root/.ansible/tmp/ansible-tmp-1728983029.070055-7657-174275532150501/ansible_scripts.sh && sleep 0
root       13755   13712  0 17:03 pts/1    00:00:00 /bin/bash /root/.ansible/tmp/ansible-tmp-1728983029.070055-7657-174275532150501/ansible_scripts.sh
root       13767   13461  0 17:03 pts/0    00:00:00 grep --color=auto ansible
[root@web01 ~]# 
[root@web01 ~]# cd /root/.ansible/tmp
[root@web01 ~/.ansible/tmp]# ll
总用量 0
drwx------ 2 root root 32 10月 15 17:03 ansible-tmp-1728983029.070055-7657-174275532150501
[root@web01 ~/.ansible/tmp]#
[root@web01 ~/.ansible/tmp]# ll
总用量 0

5.2 文件相关模块

从这个部分模块开始模块中会有较多的选项.

从这部分开始记忆模块选项的规律(单词或单词缩写).

5.2.1 file模块⭐⭐⭐⭐⭐

file模块不仅可以管理文件,还可以管理目录,管理软连接.

file模块相当于把touch命令,mkdir命令,rm命令,ln -s命令,chown,chmod结合在一起了.

file模块参数

模块说明

path

路径(目录,文件) 必须要写 注意不是name

src

source源,源文件一般用于link(创建软连接模式) 用于指定源文件

state

 

状态(模式) ,具体要做的什么,创建/删除,操作文件/操作目录

state=directory 创建目录

state=file (默认) 更新文件,如果文件不存在也不创建

state=link 创建软连接

state=touch 创建文件

state=absent 删除 (⚠ 如果是目录递归删除目录. )

mode

mode=755 创建并修改权限 建议 mode="0600"

owner

onwer=root 指定用户

group

group=root 指定用户组

案例

查看代码
 # 创建目录 /ans_app⭐
[root@m01 ~]# ansible web01 -m file -a 'path=/ans_app state=directory'
172.16.1.69 | CHANGED => {
    "changed": true,
    "gid": 0,
    "group": "root",
    "mode": "0755",
    "owner": "root",
    "path": "/ans_app",
    "size": 6,
    "state": "directory",
    "uid": 0
}
[root@web01~]# ls /
ans_app   bin   dev  home  lib64  mnt  proc  run   server  sys  usr
ans_test  boot  etc  lib   media  opt  root  sbin  srv     tmp  var

# 创建文件/ans_app/1.txt ⭐
[root@m01 ~]# ansible web01 -m file -a 'path=/ans_app/1.txt state=touch'
172.16.1.69 | CHANGED => {
    "changed": true,
    "dest": "/ans_app/1.txt",
    "gid": 0,
    "group": "root",
    "mode": "0644",
    "owner": "root",
    "size": 0,
    "state": "file",
    "uid": 0
}

[root@web01 ~]# ls /ans_app/
1.txt

# 创建软连接 /etc/hosts到/ans_app/下 ⭐
[root@m01 ~]# ansible web01 -m file -a 'src=/etc/hosts dest=/ans_app/hosts.ln state=link'
172.16.1.69 | CHANGED => {
    "changed": true,
    "dest": "/ans_app/hosts.ln",
    "gid": 0,
    "group": "root",
    "mode": "0777",
    "owner": "root",
    "size": 10,
    "src": "/etc/hosts",
    "state": "link",
    "uid": 0
}

[root@web01 ~]# ls /ans_app/
1.txt  hosts.ln

# 创建/ans_test/目录 所有者是xk,权限是700
[root@m01 ~]# ansible web01 -m file -a 'path=/ans_test state=directory owner=xk group=xk mode=700'
172.16.1.69 | CHANGED => {
    "changed": true,
    "gid": 1000,
    "group": "xk",
    "mode": "0700",
    "owner": "xk",
    "path": "/ans_test",
    "size": 6,
    "state": "directory",
    "uid": 1000

[root@web01 ~]# ll -d /ans_test/
drwx------ 2 xk xk 6 10月 15 17:38 /ans_test/

# 删除/ans_test目录
[root@m01 ~]# ansible web01 -m file -a 'path=/ans_test state=absent'
172.16.1.69 | CHANGED => {
    "changed": true,
    "path": "/ans_test",
    "state": "absent"
}

[root@web01 ~]# ll -d /ans_test/
ls: 无法访问 '/ans_test/': 没有那个文件或目录

5.2.1 copy模块⭐⭐⭐⭐⭐

批量分发:scp,1个节点(管理节点)发送文件或压缩包到所有被管理端. 注意:copy是单向的传输.类似于scp命令.

copy模块

参数说明

src

source 源文件,管理端的某个文件.

dest

destination 目标,被管理端的目录/文件.

backup

backup=yes 则会在覆盖前进行备份,文件内容要有变化或区别.

mode

修改权限

owner

修改为指定所有者

group

修改为指定用户组

 模块官方文档: ansible-doc -s 查询 https://docs.ansible.com/ansible/latest/collections/index.html

分发文件(hosts,配置文件,压缩包)

不推荐copy分发目录.

分发书写好的/etc/hosts文件,如果文件存在则备份
 [root@m01 ~]# cat /etc/hosts
172.16.1.5 lb01
172.16.1.6 lb02
172.16.1.69 web01
172.16.1.70 web02
172.16.1.9 web03
172.16.1.68 nfs01
172.16.1.67 backup
172.16.1.51 db01
172.16.1.71 m01
172.16.1.xx web03
172.16.1.xx web04
[root@m01 ~]# ansible web01 -m copy -a 'src=/etc/hosts dest=/etc/ backup=yes'
172.16.1.69 | CHANGED => {
    "backup_file": "/etc/hosts.17155.2024-10-15@19:11:40~",
    "changed": true,
    "checksum": "fd6fc9a242e1ffb04030589d5ea1a2efd4666541",
    "dest": "/etc/hosts",
    "gid": 0,
    "group": "root",
    "md5sum": "186485265722235f1f9b7571ca21f179",
    "mode": "0644",
    "owner": "root",
    "size": 191,
    "src": "/root/.ansible/tmp/ansible-tmp-1728990699.175297-8820-185337985937168/source",
    "state": "file",
    "uid": 0
}
[root@m01 ~]# 

[root@web01 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.5 lb01
172.16.1.6 lb02
172.16.1.69 web01
172.16.1.70 web02
172.16.1.9 web03
172.16.1.68 nfs01
172.16.1.67 backup
172.16.1.51 db01
172.16.1.61 m01
[root@web01 ~]# 
[root@web01 ~]# cat /etc/hosts
172.16.1.5 lb01
172.16.1.6 lb02
172.16.1.69 web01
172.16.1.70 web02
172.16.1.9 web03
172.16.1.68 nfs01
172.16.1.67 backup
172.16.1.51 db01
172.16.1.71 m01
172.16.1.xx web03
172.16.1.xx web04
[root@web01 ~]# 
[root@web01 ~]# ls /etc/ | grep hosts
hosts
hosts.17155.2024-10-15@19:11:40~
[root@web01 ~]# 

额外扩展:

copy是推送,批量推送.
fetch是拉取,批量拉取.使用较少. 拉取所有主机的/etc/hostname
ansible all -m fetch -a 'src=/etc/hostname dest=/tmp/'

5.3 服务管理-systemd⭐⭐⭐⭐⭐

  • systemd模块相当于是linux systemctl 命令:
    • 开启/关闭/重启服务 ;
    • 开机自启动;

systemd模块参数

说明

name

用于指定服务名称

enabled

yes开机自启动 (yes/no)
state

表示服务开,关,重启...

state=started 开启

state=stopped 关闭

state=reloaded 重读配置文件(服务支持)

state=restarted 重启(关闭再开启)

daemon-reload

 

yes是否重新加载对应的服务的管理配置文件(未来讲解书写systemctl配置文件)

开启crond服务并设置开机自启动.

关闭firewalld服务并不让开机自启动.

#启动服务
ansible all -m systemd -a 'name=crond enabled=yes state=started'

#关闭服务
ansible all -m systemd -a 'name=firewalld enabled=no state=stopped'

#重启ssh
ansible all -m systemd -a 'name=sshd state=reloaded' #也可以restarted

额外扩展:

systemd模块适用于目前大部分的Linux系统.

service模块适用于管理旧的Linux系统.

5.4 软件管理

  • yum模块
  • get_url模块:wget命令
  • yum_repository模块 yum源配置模块,未来可以通过copy模块.

5.4.1 yum模块⭐⭐⭐⭐⭐

yum模块并不只是yum命令,包含了yum/apt命令

yum模块参数

说明
name

指定软件包名字,可以指定多个,通过","分割.

state

installed 安装(也可以写为present)(默认)

removed 删除 (也可以写为absent) yum remove删除,慎用.删除依赖.

lastest 安装或更新(安装最新版本)

update_cache

可以设置为no加加速,表示不更新本地yum缓存. 实际公网环境,正式环境可以不加.

安装常用的软件

ansible all -m yum -a 'name=htop,tree,lrzsz,sshpass '
ansible all -m yum -a 'name=rsync state=present'
ansible all -m yum -a 'name=rsync state=latest'

5.4.2  get_url模块⭐⭐

相当于是wget命令.所有主机能访问网络才行.

推荐在管理节点下载好,使用copy仅分发即可.

get_url下载功能

说明
url

指定要下载的地址

dest

下载到哪个目录

下载ngx软件包到/opt/

ansible all -m get_url -a 'url="https://nginx.org/download/nginx-1.26.1.tar.gz" dest=/opt/

5.4.3  yum_repository模块

推荐: 未来书写好yum配置(xxx.repo)文件,copy分发过去即可.

yum源模块  yum_repository

yum源的配置文件内容

name=epel

yum源中名字 [epel]

description="介绍"

yum源的注释说明 对应的 是name的内容

baseurl

yum源中 baseurl 下载地址

enabled=yes

是否启动这个源 enabled=1 yes/no

gpgcheck

是否启动gpgcheck功能 no

file

指定yum源的文件 自动添加 .repo 默认与模块名字一致.

 

# yum配置文件
root@m01 ~]# 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

# yum源模块选项
ansible backup -m yum_repository -a 'name=epel description="Extra Packages for Enterprise Linux 7 -$basearch" baseurl="http://mirrors.aliyun.com/epel/7/$basearch" enabled=yes gpgcheck=no

 

yum配置文件内容

yum源的模块的选项

[epel]

name=epel #默认yum源文件的名字与这个一致

name=Extra Pxxxxx

 

description="Extra xxxxxxx"

baseurl=http://mirrors.aliyun.com/epel/7/$basearch

baseurl="http://mirrors.aliyun.com/epel/7/$basearch"

enabled=1

enabled=yes

gpgcheck=0

 gpgcheck=no

5.4.4  小结

5.5 用户管理

  • user用户管理 : useradd,userdel,passwd,usermod修改用户信息
  • group用户组管理 : groupadd,groupdel.
  • 添加普通用户与设置密码,添加虚拟用户,设置uid

5.5.1 user模块⭐⭐⭐⭐⭐

user模块参数

说明

name

wwww 用户名

uid

指定uid

group

指定用户组,一般用于事先创建好了用户组,通过选项指定下.

shell

指定命令解释器:默认是/bin/bash /sbin/nologin

create_home

是否创建家目录(yes/no),默认yes.
state

present 添加

absent 删除

password

加密的密码. 不能直接写明文密码

创建www-ans用户uid2000虚拟用户 ⭐ ⭐ ⭐ ⭐ ⭐

ansible all -m user -a 'name=www-ans uid=2000 shell=/sbin/nologin create_home=no state=present'

批量更新密码

批量更新密码
 #方法01 user模块
ansible all -m user -a "name=xk password={{ 'Xk123456' | password_hash('sha512', '135') }} state=present"
#方法02
ansible all -m shell -a 'echo 1 |passwd --stdin Xk123456'
#其他方法
https://docs.ansible.com/ansible/latest/reference_appendices/faq.html # how-do-i-generate-encrypted-passwords-for-the-usermodule


[root@m01 ~]# ansible 172.16.1.68 -i /server/ans/playbook/hosts -m debug -a "msg='{{ '1' | password_hash('sha512','abc135') }}'"
172.16.1.68 | SUCCESS => {
    "msg": "$6$abc135$Ir9F7vUl8Y0/3AIfuD2XUDnIzFWQ3cEdWUtZ1hPDtlj7Er6CfaXk3dV5qnetoJCd2bvDQFTsk/Tx1DZ9Z692S0"
}
# 值一样,加密出来的结果也是一样的  
[root@m01 ~]# echo 1 | sha512sum
3abb6677af34ac57c0ca5828fd94f9d886c26ce59a8ce60ecf6778079423dccff1d6f19cb655805d56098e6d38a1a710dee59523eed7511e5a9e4b8ccb3a4686  -
[root@m01 ~]# 
[root@m01 ~]# echo 1 | sha512sum
3abb6677af34ac57c0ca5828fd94f9d886c26ce59a8ce60ecf6778079423dccff1d6f19cb655805d56098e6d38a1a710dee59523eed7511e5a9e4b8ccb3a4686  -
[root@m01 ~]# 

关于{{}}相关的解释

{{ }} 格式用于在ansible调用变量PATH name=xiaoming echo name 

{{ '1' | password_hash('sha512', '135') }}

表示1是密码,经过管道,传递给了password_hash()插件, sha512加密算法,135是随机字符用于生成随机加密后的密码.

ansible 172.16.1.68 -m debug -a "msg='{{ '1' | password_hash('sha512', 'abc135') }}

5.5.2 group模块(了解)

group参数

说明

name

指定用户组名字

gid

指定组的gid
state

present添加

absent 删除

5.6 cron模块

作用:用于管理系统的定时任务.

替代了crontab -e或vi /var/spool/cron/xxx用户功能.

cron模块参数

说明

name

定时任务名字(一定要加上), 对应下面注释的内容
minute

分钟 minute="*/2"

hour

小时

day

日期

month

月份

week

周几
job

指定命令或脚本(定向到空) job="/sbin/ntpdate ntp1.aliyun.com  >/dev/null 2>&1"

state

present 添加定时任务(默认)

absent 删除

每分钟输出主机名,写入到/opt/name.txt

定时任务
 # 创建定时任务
[root@m01 ~]# ansible all -m cron -a 'name="echo_hostname" job="echo hostname >> /opt/name.txt 2>&1" state=present '
172.16.1.69 | CHANGED => {
    "changed": true,
    "envs": [],
    "jobs": [
        "echo_hostname"
    ]
}
172.16.1.67 | CHANGED => {
    "changed": true,
    "envs": [],
    "jobs": [
        "echo_hostname"
    ]
}
172.16.1.68 | CHANGED => {
    "changed": true,
    "envs": [],
    "jobs": [
        "echo_hostname"
    ]
}
[root@m01 ~]# 
[root@m01 ~]# ansible all -a "crontab -l"
[DEPRECATION WARNING]: Ansible will require Python 3.8 or newer on the controller starting with Ansible 2.12. Current version: 3.7.9 (default, Jun 10 2022, 11:25:35) [GCC
 7.3.0]. This feature will be removed from ansible-core in version 2.12. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
172.16.1.67 | CHANGED | rc=0 >>
#1. sync time by xk at 20230101
*/3 * * * * /sbin/ntpdate ntp.aliyun.com  >/dev/null  2>&1
#Ansible: echo_hostname
* * * * * echo hostname >> /opt/name.txt 2>&1
172.16.1.69 | CHANGED | rc=0 >>
#1. sync time by xk at 20230101
*/3 * * * * /sbin/ntpdate ntp.aliyun.com  >/dev/null  2>&1
#Ansible: echo_hostname
* * * * * echo hostname >> /opt/name.txt 2>&1
172.16.1.68 | CHANGED | rc=0 >>
#1. sync time by xk at 20230101
*/3 * * * * /sbin/ntpdate ntp.aliyun.com  >/dev/null  2>&1
#Ansible: echo_hostname
* * * * * echo hostname >> /opt/name.txt 2>&1
[root@m01 ~]# 

# 删除定时任务
[root@m01 ~]# ansible all -m cron -a 'name="echo_hostname"  state=absent'
[DEPRECATION WARNING]: Ansible will require Python 3.8 or newer on the controller starting with Ansible 2.12. Current version: 3.7.9 (default, Jun 10 2022, 11:25:35) [GCC
 7.3.0]. This feature will be removed from ansible-core in version 2.12. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
172.16.1.68 | CHANGED => {
    "changed": true,
    "envs": [],
    "jobs": []
}
172.16.1.67 | CHANGED => {
    "changed": true,
    "envs": [],
    "jobs": []
}
172.16.1.69 | CHANGED => {
    "changed": true,
    "envs": [],
    "jobs": []
}
[root@m01 ~]# 

5.7 mount模块

实现mount命令进行挂载可以修改/etc/fstab实现永久挂载.

mount

说明
src

源地址(nfs服务端共享地址 eg 172.16.1.68/data )

path

注意这里不是dest,挂载点(要把源挂载到哪里)

fstype

filesystem type指定文件系统,xfs,ext4,iso9660,nfs mount命令的-t选项

state

absent            卸载并修改fstab

unmounted    卸载不修改/etc/fstab

present           仅修改/etc/fstab 不挂载

mounted        挂载并修改/etc/fstab

remounted      重新挂载

挂载nfs01已有的共享目录到web01上的/mnt下

ansible web -m mount -a 'fstype=nfs src=172.16.1.68:/data/ path=/mnt/ state=mounted'

卸载/mnt/

ansible 172.16.1.68 -m mount -a 'path=/mnt/ state=absent'

5.8 总结模块

https://www.processon.com/view/link/64783f6097dfee0f88662081

https://docs.ansible.com/ansible/latest/collections/index.html

模块分

模块 对应的命令

命令和脚本模块

command模块 ans默认的模块,执行简单命 ,不支持特殊符号

 
 

shell模块 执行命令,支持特殊符号

 
 

script模块 分发脚本然后执行

 
 

file 创建目录,文件,软连接

touch,mkdir,ln -s,rm
 

copy 远程分发文件,修改权限,所有者,备份

批量scp/rsync
 

lineinfile

修改配置文件

服务

systemd服务管理

systemctl命令服务

开关重启,开机自启动

 

service 服务管理(了解)

 

软件包

yum源 yum_repository  

 

yum模块/apt模块

yum命令/apt命令

 

get_url下载软件

wget命令,下载内容.

其他系统管理

mount模块 挂载 mount挂载命令.

 

cron模块 定时任务

定时任务:crontab -e  编辑定时任务

用户管理

group模块 管理用户组  

 

user模块 管理用户

useradd命令

其他可以研究

压缩解压(unarchive) ,rsync模块(synchronize),

数据库模块(mysql_db,mysql_user)...

 

其他

ansible管理docker k8s zabbix grafana ...

 

用于调试模块

ping 模块检查 ansible与其他节点连通性.

 

 

debug 模块 用于检查/显示 变量

 

 

posted @ 2024-10-16 14:52  老虎死了还有狼  阅读(14)  评论(0编辑  收藏  举报