1.Ansible的概念:

  • 什么是Ansible:
    • Ansible是近年越来越火的基于python开发的一款运维自动化工具
    • 主要帮助运维实现IT工作的自动化、降低人为操作失误、提高业务自动化率、提高运维工作效率
    • Ansible是基于模块来运行,它本身没有任何批量部署的能力,Ansible主要是提供一种批量部署的框架
    • 常用于软件部署自动化、配置自动化、管理自动化、系统化系统任务、持续集成、零宕机平滑升级等
    • ansible可以批量修改服务器密码,批量安装软件包,批量修改配置
  • 为什么选择Ansible:
    • 方便对Ansible的二次开发
    • Ansible丰富的内置模块
    • 在Ansible去中心化概念
    • Agentless(无客户端)
  • Ansible优点:
    • 轻量级,他不需要去客户端安装agent,更新时,只需要在操作机上进行一次更新即可
    • 批量任务执行可以写成脚本,而且不用分发到远程就可以执行
    • 使用python编写的,维护更简单
    • 支持sudo
  • Ansible缺点:对于几千台、上万台机器的操作,还不清楚性能、效率情况如何,需要进一步了解

2.Ansible应用领域:

-

3.Ansible架构模式:

  • Ansible 管理方式:

    • Ansible 是一个模型驱动的配置管理器, 支持多节点发布、 远程任务执行

    • 默认使用SSH 进行远程连接。 无需在被管节点上安装附加软件, 可使用各种编程语言进行扩展

    • 图示:

      image-20230216223814116

  • Ansible系统架构:

    • Ansible 是基于模块工作的, 本身没有批量部署的能力;真正具有批量部署的是 Ansible 所运行的模块, Ansible只是提供一种框架

    • Ansible组成图示:

      image-20230217091403862

    • Ansible 由以下各部分组成:

      • 核心引擎:即 Ansible,执行工具;一次性或者临时执行的操作都是通过该命令进行。
      • 剧本(playbook):定义Ansible任务的配置文件,可以将多个任务定义在一个剧本中,Ansible自动执行,剧本执行支持多个任务,可以由控制主机运行多个任务,同时对多台远程主机进行管理。
      • 主机清单(host inventory):定义Ansible管理的主机策略,默认是在Ansible的hosts配置文件中定义被管节点
      • 核心模块(core modules ):这些都是Ansible自带的模块。
      • 自定义模块(custom modules):如果核心模块不足以完成某种功能,可以添加自定义模块。
      • 插件(plugins):完成模块功能的补充,借助于插件完成记录日志,邮件等功能。
      • 连接插件(connectior plugins):Ansible 基于连接插件连接到各个主机上,负责和被管节点实现通信。
    • Ansible的作用对象,不仅是Linux和非Linux操作系统的主机,同样也可以作用于各类公/私有云、商业/非商业设备的网络设施

4.Ansible执行过程:

  • 过程图示:

    image-20230217091819425

  • 使用者使用ansible或ansible-playbook(会额外读取playbook文件)时,在服务器终端输入ansible的ad-hoc命令集或playbook后,ansible会遵循预先编排的规则将playbooks逐条拆解为play,再将play组织成ansible可识别的任务(task)。

  • 随后调用任务涉及的所有模块(module)和插件(plugin),根据inventory中定义的主机列表通过ssh将任务集以临时文件或命令的形式传输到远程客户端执行并返回执行结果,如果临时文件执行完毕则自动删除.

5.Ansible的特性:

  • 应用代码自动化部署。
  • 系统管理配置自动化。
  • 支持持续交付自动化。
  • 支持云计算 、大数据平台( 如 AWS、 OpenStack 、 CloudStack 、 VMWare 等) 环境。
  • 轻量级, 无需在客户端安装 agent, 更新时只需在控制机上进行一次更新即可。
  • 批量任务执行可以写成脚本, 不用分发到远程就可以执行。
  • 使用 Python 编写,维护更简单, Ruby 语法过于复杂。
  • 支持非 root 用户管理操作, 支持 sudo。

6.Ansible安装与配置:

1.环境配置:

角色 主机名 ip地址
控制主机 quruixiang.com 192.168.178.101
受控主机/被管节点 wangxuan.com 192.168.178.151
受控主机/被管节点 zhanglin.com 192.168.178.201
  • 三个主机配置从服务器的ip

    1
    2
    nmcli connection modify ens160 ipv4.addresses 172.25.178.201/24
    nmcli connection up ens160
  • 三个主机关闭防火墙和selinux

    1
    2
    3
    4
    5
    systemctl stop firwalld
    systemctl disable firwalld
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
    setenforce 0
    shutdown -r
  • 三个主机配置主机名:

    1
    hostnamectl set-hostname [主机名]
  • anbile主机(控制主机)生成秘钥对,复制到其他主机(受控主机)上,实现免密登录:

    1
    2
    3
    4
    5
    6
    7
    ssh-keygen -t rsa -b [字节数]
    # ~/.ssh/id_rsa私钥文件
    # ~/.ssh/id_rsa.pub公钥文件
    # 方式一复制:
    scp [本地的公钥文件路径] root@[IP地址]:/root/.ssh/authorized_keys # 复制公钥
    # 方式二复制:
    ssh-copy-id -i ~/.ssh/id_rsa.pub student@192.168.178.151
  • 在anbile主机(控制主机)的hosts配置域名解析:

    1
    2
    3
    4
    vim /etc/hosts
    # 添加内容
    [IP地址] [域名]
    ......
  • 设置三个节点时间同步:

    1
    2
    3
    4
    5
    6
    7
    8
    yum install -y chrony
    vim /etc/chrony.conf
    # 主服务器修改内容
    server ntp.aliyun.com iburst # 配置网络同步时间服务器地址,阿里云
    allow 192.168.178.0/24 # 允许同步的客户端地址范围
    local stratum 10 # 也在向其他服务器提供时间服务
    # 从服务器修改内容
    server quruixiang.com iburst # 配置网络同步时间服务器地址,主服务器地址
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    systemctl restart chronyd
    systemctl enable chronyd
    tiemdatectl status # 查看时间同步状态
    timedatectl set-ntp true # 开启网络时间同步
    chronyc sources -v # 查看 ntp_servers,-v 详细信息
    # 显示内容
    .-- Source mode '^' = server, '=' = peer, '#' = local clock.
    / .- Source state '*' = current best, '+' = combined, '-' = not combined,
    | / 'x' = may be in error, '~' = too variable, '?' = unusable.
    || .- xxxx [ yyyy ] +/- zzzz
    || Reachability register (octal) -. | xxxx = adjusted offset,
    || Log2(Polling interval) --. | | yyyy = measured offset,
    || \ | | zzzz = estimated error.
    || | | \
    MS Name/IP address Stratum Poll Reach LastRx Last sample
    ===============================================================================
    ^- ns.gmgnet.ch 2 7 377 122 +5684us[+5803us] +/- 127ms
    ^- 44.190.5.123 2 7 77 125 -1062us[ -933us] +/- 89ms
    ^- lithium.constant.com 2 7 177 127 +7536us[+7663us] +/- 166ms
    ^- nux.hackeriet.no 2 7 377 127 -30ms[ -30ms] +/- 128ms
    ^* quruixiang.com 3 6 377 1 +28us[ +53us] +/- 23ms

2.安装:

  • 必须清空/etc/yum.repos.d目录下的所有仓库文件

  • 导入Centos-Stream.repo仓库文件:

    1
    2
    链接:https://pan.baidu.com/s/11O4n1d6IZHVBab-dCVy44A 
    提取码:icde
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    # 如下文件仓库内容
    [base]
    name=CentOS-8-stream - Base - mirrors.aliyun.com
    baseurl=https://mirrors.aliyun.com/centos/8-stream/BaseOS/$basearch/os/
    gpgcheck=1
    gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-Official

    #additional packages that may be useful
    [extras]
    name=CentOS-8-stream - Extras - mirrors.aliyun.com
    baseurl=https://mirrors.aliyun.com/centos/8-stream/extras/$basearch/os/
    gpgcheck=1
    gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-Official

    #additional packages that extend functionality of existing packages
    [centosplus]
    name=CentOS-8-stream - Plus - mirrors.aliyun.com
    baseurl=https://mirrors.aliyun.com/centos/8-stream/centosplus/$basearch/os/
    gpgcheck=1
    enabled=0
    gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-Official

    [PowerTools]
    name=CentOS-8-stream - PowerTools - mirrors.aliyun.com
    baseurl=https://mirrors.aliyun.com/centos/8-stream/PowerTools/$basearch/os/
    gpgcheck=1
    enabled=0
    gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-Official

    [AppStream]
    name=CentOS-8-stream - AppStream - mirrors.aliyun.com
    baseurl=https://mirrors.aliyun.com/centos/8-stream/AppStream/$basearch/os/
    gpgcheck=1
    gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-Official
  • 验证是否安装成功:

    1
    yum repolist
  • Ansible仓库默认不在yum仓库中,因此需要使用下面的命令启用epel仓库

    1
    2
    3
    yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
    sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
    sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
  • 安装Ansible工具:

    1
    yum install -y ansible
  • 是否安装成功:

    1
    ansible –-version

7.清单文件指定受管主机:

1.概念:

  • 清单中定义ansible将要管理的一批主机,这些主机也可以分配到组中,以进行集中管理。组中也可以包含子组,一台主机也可以是多个组中的成员。清单还可以设置应用到它所定义的主机和组的变量。
  • 定义主机清单的两种方式:
    • 静态主机清单:可以通过文本文件定义
    • 动态主机清单:可以根据需要使用外部信息提供程序通过脚本或其他程序生成。

2.静态文件清单:

  • 默认安装ansible匹配的主机清单文件是/etc/ansible/hosts

  • 修改/etc/ansible/hosts文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    vim /etc/ansible/hosts
    # 修改类型1:直接添加主机名
    wangxuan.com
    zhanglin.com
    # 修改类型2:使用主机组
    [webservers]
    wangxuan.com
    zhanglin.com
    # 修改类型3:使用嵌套主机组
    [webservers:gourp1]
    wangxuan.com
    zhanglin.com
    # 修改类型3:使用范围指定 [start:end]
    node[1:3].com
    1
    2
    3
    # 完整格式:
    wangxuan.com ansible_ssh_port=[ssh端口] ansible_ssh_user=[用户] ansible_ssh_pass=[登录密码] ansible_sudo_pass=[sudo密码]
    192.168.178.151 ansible_ssh_port=[ssh端口] ansible_ssh_user=[用户] ansible_ssh_pass=[登录密码] ansible_sudo_pass=[sudo密码]
  • 验证清单:

    1
    2
    3
    4
    5
    6
    7
    8
    # 方式一:
    ansible [主机组名] --list-hosts
    # 参数:
    # [主机组名] 指定清单文件的主机组名
    # "匹配字段" 指定清单文件的主机组名
    # all 主机组含有清单中明确列出的每一个主机
    # ungrouped 主机组含有清单中明确列出、但不属于任何其他组的每一个主机

    1
    2
    # 方式二:图形化查看所有主机
    ansible-inventory --graph

3.自定义静态主机清单:

  • 在某个工作目录下创建一个名为inventory的自定义静态主机清单文件

    1
    2
    mkdir deploy-inventory 
    cd deploy-inventory
    1
    2
    3
    4
    vim inventory
    # 修改内容如下:
    [web]
    192.168.178.51
  • 验证清单:

    1
    ansible all -i [自定义清单文件路径]   --list-hosts
  • 测试连通性:

    1
    ansible -i [自定义清单文件路径] -m ping

8.管理ansible的配置文件:

  • 查看当前ansible使用的配置文件:

    1
    ansible --version
  • 修改默认的配置文件:

    1
    vim /etc/ansible/ansible.cfg
  • 配置文件详情:

    配置文件由几部分组成,每部分含有以键值对形式定义的设置。部分的标题以方括号括起。重点需要了解以下两部分

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [defaults]
    inventory = ./inventory #主机列表配置文件(如果没有自定义就不用配置)
    library = /usr/share/my_modules #库文件存放目录
    forks = 5 #默认并发数5 (同时可以处理5个命令--同时有20个节点主机5个主机执行在5个执行)
    sudo_user = root #默认的sudo用户 root
    ask_sudo_pass = ture #每次sudo是否提示咨询密码,
    ask_pass = false #每次执行命令是否询问ssh密码(对方用户的密码),为true一定咨询,可以通过-k指定
    remout_port = 22
    host_key_checking = false #检查被控节点的host_key,如果配置了免密就false此属性
    log_path = /var/log/ansible.log #ansible日志文件
    module_name = command #默认模块,可以改为shell
    remote_user = user #要在受管主机上登录的用户名称,没有指定则是当前用户(受管、管控、托管主机的用户名)
    remote_tmp = ~/.ansible/tmp; #临时的py命令文件存放在远程主机目录
    1
    2
    3
    4
    5
    6
    #特权升级,控制主机执行特权命令不需要指定sudo命令 
    [privilege_escalation]
    become = true #连接后是否在受管主机上切换用户,默认会切换到root下
    become_method = sudo #如何切换用户
    become_user = root #受管主机切换到的用户
    become_ask_pass = false #是否为become_method提示输入密码,默认为false

9.ansible-hoc命令:

  • 概念:

    • Ad-hoc是指ansible下临时执行的一条命令,并且不需要保存的命令对于复杂的命令会使用playbook
    • Ad-hocd的执行依赖于模块
  • 参数:

    首个参数 说明
    [主机组名] 指定清单文件的主机组名
    “匹配字段” 指定清单文件的主机组名
    all 主机组含有清单中明确列出的每一个主机
    ungrouped 主机组含有清单中明确列出、但不属于任何其他组的每一个主机
    其他参数 说明
    -m(module) 指定使用的模块,默认使用” command “
    -i 指定ansible自定义清单文件的路径
    -v(verbose) 如果命令执行成功,输出详细的结果
    -u (user) ssh连接的用户名,默认用root,ansible.cfg中可以配置
    -a 指定module模块的参数(命令)
    -k 提示输入ssh登录密码,当使用密码验证的时候用
    –list-host 只打印有哪些主机会执行这个命令,不会实际执行
    1
    ansible [主机组名] -a "uptime"    # 检查ansible被管理节点的cpu负载
    1
    ansible [主机组名] -a "useradd student"     # 给ansible被管理节点增加用户
    1
    ansible [主机组名] -a "grep root /etc/passwd"     # 查看被控结点中的/etc/passwd文件的内容
    1
    ansible [主机组名] -a "ls -l /"     # 查看被控结点中根目录下的文件
    1
    ansible webservers -a "echo This is world"     # 在被控节点控制台输出语句
    匹配字段通配符 说明
    * 任意字符或多个字符
    [主机组名1:主机组名2] 组1和组2的并集
    [主机组名1:&主机组名2] 组1和组2的交集
    [主机组名1:!主机组名2] 属于组1但不属于组2
    ~ 表示开始正则匹配
    \ 转义
    1
    ansible "wangxuan*" -a "ls -l /"      # 查看被控结点中匹配wangxuanh后跟任意多个字符的主机根目录下的文件

10.案例:

1.使用普通用户连接:

  • 通过ansible批量创建用户:

    1
    ansible -a "useradd student" webservers
  • 通过ansible批量修改用户密码:

    1
    ansible -a "echo '123456' | passwd --stdin student" webservers
  • 通过ansible批量删除root用户的authorized_keys文件:

    1
    ansible -a "rm -rf /root/.ssh/authorized_keys" webservers
  • 修改配置文件:

    1
    2
    3
    4
    5
    6
    vim /etc/ansible/ansilbe.cfg
    # 修改内容
    [defaults]
    inventory=/etc/ansible/hosts # 必须指定默认的清单文件,不让还是root用户
    remote_user=student # 指定默认连接到被控节点的用户
    ask_pass=false # 每次执行ansible命令是否询问ssh密码

2.关闭主机秘钥验证:

  • 在受管主机中通过ssh远程连接方式(没有配置免密登录)以student用户身份执行,并验证密码;如果ask_pass为false 则可以通过-k 来指定密码

  • 修改配置文件:

    1
    2
    3
    4
    vim /etc/ansible/ansilbe.cfg
    # 修改内容
    [defaults]
    host_key_checking = False #检查对应服务器的host_key,建议取消注释

3.远程用户sudo提权:

  • 在受管主机中需要通过管理员身份运行命令则配置sudo

    1
    2
    3
    vim /etc/sudoers
    # 修改内容,如果配置了NOPASSWD: ALL,配置ask_sudo_pass = ture 是不咨询密码的
    student ALL=(ALL) NOPASSWD: ALL

11.ansible-doc模块:

ansible-doc 详细参数
-l(list) 列出所有的模块列表
-s 查看指定模块的参数
[模块] 查看具体模块的具体帮助
1
ansible-doc -l | grep yum      # 查看yum模块
1
ansible-doc ping 	
1
2
ansible-doc yum_repository
# 使用/EXAM查询此模块剧本的例子

12.ansible执行颜色:

颜色 说明
绿色 执行成功并且不需要做出任何改变
黄色 执行成功并且对目标主机做出变更
红色 执行失败
蓝色 显示详细过程
紫色 显示警告

13.ansible的模块:

1.四个命令模块:

  • 应尽量避免使用这三个模块来执行命令,因为其他模块大部分都是幂等性的可以自动进行更改跟踪。command、shell、raw不具备幂等性

  • 注: 幂等性:简单来讲,就是输入相同,输出相同,无论多少次比如说,确认接口,如果传入订单号,返回确认OK,如果已经确认过了,再次调用确认接口,返回如果还是确认OK,那么这个接口就是满足幂等性.

  • 三者的区别:

    • 相同点:要求受管主机上安装Python。
    • 不同点:
      • command可以在受管主机上执行shell命令,但是不支持环境变量和操作符(例如 ‘|’, ‘<’, ‘>’, ‘&’)
      • shell模块调用的/bin/sh指令执行,用法和command基本一致,所以shell可以执行任何命令,推荐使用。
      • script模块将本机文件放到远程主机执行,不需要复制文件
      • raw模块不需要受管主机上安装Python,直接使用远程shell运行命令,通常用于无法安装Python的系统(例如网络设备等)。
  • command模块:

    • 模块参数:

      名称 必选 备注
      chdir no 运行command命令前先cd到这个目录
      creates no 如果这个参数对应的文件存在,就不运行command
      free_form yes 需要执行的脚本(没有真正的参数为free_form)只是一种参数模式name=value
      executable no 改变用来执行命令的shell,应该是可执行文件的绝对路径。
      removes no 如果这个参数对应的文件存在,就运行command,与creates参数的作用相反
      stdin(2.4后新增) no 将命令的stdin设置为指定的值
      1
      2
      # 查看当前目录下的文件时,先切换到/usr/qv123的目录下
      ansible webservers -a "ls -l chdir=/usr/qv123"
      1
      2
      # 因为creates的文件在root目录下不存在,所以执行命令
      ansible test -m command -a "ls /root creates=test.sh"
      1
      2
      # 因为removes的文件在root目录下不存在,所以不执行命令
      ansible webservers -a "ls / removes=test.sh"
      1
      ansible webservers -a "cd /usr/qv123;ls -l"
  • shell模块:

    • 让远程主机在shell进程下执行命令,从而支持shell的特性,如管道等。与command模块几乎相同,但在执行命令的时候使用的是/bin/sh。

    • 模块参数:

      名称 必选 备注
      chdir no 运行command命令前先cd到这个目录
      creates no 如果这个参数对应的文件存在,就不运行command
      executable no 改变用来执行命令的shell,应该是可执行文件的绝对路径。
      free_form yes 需要执行的脚本(没有真正的参数为free_form)只是一种参数模式name=value
      removes no 如果这个参数对应的文件存在,就运行command,与creates参数的作用相反
      stdin(2.4后新增) no 将命令的stdin设置为指定的值
      1
      ansible webservers -m shell -a "sudo ./test.sh chdir=/usr/qv123"
      1
      ansible webservers -a "cd /usr/qv123;ls -l"
  • script模块:

    • 在远程主机上执行主控主机上的脚本(不需要将文件复制到远程主机)

    • 模块参数:

      名称 必选 备注
      chdir no 运行command命令前先cd到这个目录
      creates no 如果这个参数对应的文件存在,就不运行command
      executable no 改变用来执行命令的shell,应该是可执行文件的绝对路径。
      free_form yes 需要执行的脚本(没有真正的参数为free_form)只是一种参数模式name=value
      removes no 如果这个参数对应的文件存在,就运行command,与creates参数的作用相反
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      [root@quruixiang myShell]# ansible webservers -m script -a "./test.sh"
      wangxuan.com | CHANGED => {
      "changed": true,
      "rc": 0,
      "stderr": "Shared connection to wangxuan.com closed.\r\n",
      "stderr_lines": [
      "Shared connection to wangxuan.com closed."
      ],
      "stdout": "我被执行了。。。。。。\r\n",
      "stdout_lines": [
      "我被执行了。。。。。。"
      ]
      }
  • raw模块:

    • raw模块主要用于执行一些低级的,脏的SSH命令,而不是通过command模块。

    • raw模块只适用于下列两种场景,第一种情况是在较老的(Python 2.4和之前的版本)主机上,另一种情况是对任何没有安装Python的设备(如路由器)。 在任何其他情况下,使用shell或command模块更为合适。

    • 就像script模块一样,raw模块不需要远程系统上的python

    • 模块参数:

      名称 必选 备注
      executable no 改变用来执行命令的shell,应该是可执行文件的绝对路径。
      free_form yes 需要执行的脚本(没有真正的参数为free_form)
      1
      ansible webservers -m raw -a "pwd"

2.八个文件模块:

  • file模块:

    • file模块可以帮助我们完成一些对文件的基本操作,比如,创建文件或目录、删除文件或目录、修改文件权限等

    • 模块参数:

      参数 必选 说明
      path yes 用于指定要操作的文件或目录
      state yes 取值:touch普通文件,directory目录,link软连接,hard硬连接,absent删除;指定对文件操作的类型
      src no 当state设置为link或者hard时,指定软硬连接的链接源
      force no 当state=link的时候,如果源文件不存在,或者链接文件与其他文件同名时,强制覆盖同名文件或者创建链接文件。
      owner no 用于指定被操作文件的属主,属主对应的用户必须在远程主机中存在,否则会报错
      group no 用于指定被操作文件的属组,属组对应的组必须在远程主机中存在,否则会报错。
      mode no 用于指定被操作文件的权限,如”rw-r-x—“为mode=650
      recurse no 当要操作的文件为目录,将recurse设置为yes,可以递归的修改目录中文件的属性。
    • 创建文件:

      1
      2
      # 在student家目录下创建一个文件,如果testfile文件已经存在,则会更新文件的属性
      ansible webservers -m file -a "path=/home/student/test2.sh state=touch"
      1
      2
      # 在student家目录下创建一个目录,如果testdir目录已经存在,则不进行任何操作
      ansible webservers -m file -a "path=/home/student/test state=directory"
      1
      2
      # 在student家目录下创建一个软连接文件
      ansible webservers -m file -a "path=./test3.sh state=link src=./test2.sh"
      1
      2
      # 在student家目录下创建一个硬连接文件
      ansible webservers -m file -a "path=./test4.sh state=hard src=./test2.sh"
      1
      2
      # 在student家目录下创建一个连接文件,链接源不存在,强制创建
      ansible webservers -m file -a "path=./test5.sh state=link src=./test6.sh force=yes"
    • 删除文件:

      1
      2
      # 在student家目录下删除一个文件
      ansible webservers -m file -a "path=./test3.sh state=absent"
    • 修改文件所属主和所属组:

      1
      2
      # 通过root用户修改所属文件的所属主
      ansible webservers -u root -k -m file -a "path=/home/student/test state=touch owner=root"
      1
      2
      # 通过root用户修改所属文件的所属组
      ansible webservers -u root -k -m file -a "path=/home/student/test state=touch group=root"
    • 修改文件权限:

      1
      2
      # 在创建文件时或直接,修改文件的权限
      ansible webservers -m file -a "path=/home/student/test7.sh state=touch mode=774"
      1
      2
      # 在创建目录时或直接,修改目录的权限,递归的修改目录下的文件权限
      ansible webservers -m file -a "path=/home/student/test state=touch mode=774 recurse=true"
  • copy模块:

    • 将ansible主机上的文件拷贝到远程主机中

    • 模块参数:

      参数 必须 说明
      src no 用于指定需要copy的文件或目录,src与content两个参数必有其一,否则会报错。
      dest yes 用于指定文件将被拷贝到远程主机的哪个目录中
      content no 指定文件内容,src与content两个参数必有其一,否则会报错。
      force no 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否强制覆盖,默认值为yes
      backup no 当远程主机的目标路径中已经存在同名文件,并且与ansible主机中的文件内容不同时,是否对远程主机的文件进行备份(备份为原文件名+修改时间的格式)
      owner no 指定文件拷贝到远程主机后的属主
      group no 指定文件拷贝到远程主机后的属组
      mode no 指定文件拷贝到远程主机后的权限,如”rw-r-x—“为mode=650
    • 复制,并覆盖:

      1
      2
      # 复制ansible主机上的文件到远程主机上
      ansible webservers -m copy -a "src=test1.sh dest=./"
    • 复制,并不覆盖:

      1
      2
      # 复制ansible主机上的文件到远程主机上,同名且内容不相同时不覆盖
      ansible webservers -m copy -a "src=test1.sh dest=./ force=no"
    • 创建 / 直接覆盖文件编辑内容:

      1
      2
      # 在远程主机上创建文件,并复制内容到文件中;如果存在文件内容则覆盖
      ansible webservers -m copy -a "content='this\nis\nworld' dest=./test8.sh"
    • 文件存在且内容不同时,备份文件再复制:

      1
      2
      # 将原文件重命名为其他名字后,再复制ansible主机的文件
      ansible webservers -m copy -a "src=test8.sh dest=./ backup=yes"
    • 复制文件时,改变远程被复制文件的所属主和所属组:

      1
      ansible webservers -m copy -a "src=test8.sh dest=./ owner=root"
    • 复制文件时,改变远程被复制文件的权限:

      1
      ansible webservers -m copy -a "src=test8.sh dest=./ mode=774"
  • fetch模块:

    • 将远程主机上的文件拉取到ansible主机中

    • 模块参数:

      参数 必选 说明
      dest yes 保存在本机主机的文件路径,如果是多个远程主机将以主机名形式分开保存
      src yes 远程主机的文件路径,会保存src指定的整个路径
      flat no yes不按照src的指定的路径来创建目录,默认no
    • 示例:

      1
      2
      # 保存远程主机中主机名/home目录下的文件到本机
      ansible webservers -uroot -k -m fetch -a "src=/home/student/test4.sh dest=/root/test"
      1
      2
      # 保存远程主机找中test4.sh文件的文件到本机
      ansible webservers -uroot -k -m fetch -a "src=/home/student/test4.sh dest=/root/test/
  • synchronize模块:

    • synchronize 基于rsync命令批量同步文件;使用这个模块的时候,必须保证远程服务器上有rsync这个命令

    • 作用是推送和拉取,相当于copy模块和fetch模块的集合

    • 模块参数:

      参数 必选 说明
      src yes 指定源文件路径
      dest yes 指定目标文件路径
      archive no 是否采用归档模式同步,保证源文件和目标文件属性一致
      rsync_opts no 使用rsync参数
      mode no synchronize的类型,pull拉取,push推送;默认push
      –exclude=*.log no 此处为忽略什么的文件,必须和rsync_opts一起使用
      delete no 删除不存在的文件(⽬标端如果⽐源端⽂件多,则删除这些多出来的⽂件),默认no
    • 安装rsync:

      1
      ansible all -m yum -a 'name=rsync state=present'
    • 从远端拉去文件:

      1
      ansible webservers -m synchronize -a "src=/etc/hosts dest=/root/test mode=pull"
    • 将本地某目录下的文件,除去.txt结尾的文件且保持文件见属性一致的同步到远程主机上

      1
      ansible webservers -u root -k -m synchronize -a "src=/root/test/ dest=/home/student/test archive=yes delete=yes rsync_opts=--exclude=*.txt"
  • blockinfile模块:

    • blockinfile模块可以帮助我们在指定的文件中插入”一段文本”,这段文本是被标记过的

    • 换句话说就是,我们在这段文本上做了记号,以便在以后的操作中可以通过”标记”找到这段文本,然后修改或者删除它.

    • 模块参数:

      参数 必选 说明
      path yes 指定要操作的文件
      block yes 此参数用于指定我们想要操作的那”一段文本”,别名叫”content”
      marker no 自定义”标记”,格式marker=#{mark}test,效果# BEGIN test和# END test
      state no present执行插入操作或更新操作,absent:从文件中删除对应标记的段落,默认present
      insertafter no 值BOF:指定插入某一行后面的行数;也可插入某一个正则表达式行的后面
      insertbefore no 值EOF:指定插入某一行前面的行数,也可插入某一个正则表达式行的前面
      backup no 是否在修改文件之前对文件进行备份
      create no 当要操作的文件并不存在时,是否创建对应的文件
    • 在远程主机的文件内容末尾添加一行文本,使用默认标记

      1
      2
      3
      4
      5
      ansible webservers -m blockinfile -a "path=./test/hosts block='8.130.17.95 www.qv123.top'"
      # 文件内容
      # BEGIN ANSIBLE MANAGED BLOCK
      8.130.17.95 www.qv123.top
      # END ANSIBLE MANAGED BLOCK
    • 在远程主机的文件内容末尾添加一行文本,使用自定义标记

      1
      2
      3
      4
      5
      6
      ansible webservers -m blockinfile -a "path=./test/hosts block='systemctl restart httpd\nsystemctl restart chrony' marker='#{mark} test1'"
      # 文件内容
      #BEGIN test1
      systemctl restart httpd
      systemctl restart chrony
      #END test1
    • 当文本块标记已存在,但再次编辑内容不同时,会覆盖原标记中的内容

      1
      ansible webservers -m blockinfile -a "path=~/test/hosts block='systemctl restart redis' marker='#{mark} test1'"
    • 删除对应标记文本块

      1
      ansbile webservers -m blockinfile -a "path=~/test/hosts  marker='#{mark} test1' state=absent"
    • 将文本块插入到文档的开头,可以使用insertbefore参数,将其值设置为BOF,BOF表示Begin Of File

      1
      ansible webservers -m blockinfile -a "path=~/test/hosts block='192.168.152 wangxuan2.com' marker='#{mark} test2' insertbefore=BOF"
    • 如果使用如下命令,表示将文本块插入到文档的结尾,与默认操作相同,将insertafter参数设置为EOF表示End Of File

      1
      ansible webservers -m blockinfile -a "path=~/test/hosts block='192.168.152 wangxuan2.com' marker='#{mark} test2' insertafter=EOF"
    • 使用如下命令表示使用正则表达式匹配行,将文本块插入到 “以#END test2开头的行 “ 之后

      1
      ansible webservers -m blockinfile -a "path=~/test/hosts block='192.168.152 wangxuan2.com' marker='#{mark} test3' insertbefore='^#END test2'"
    • 使用backup参数,可以在操作修改文件之前,对文件进行备份,备份的文件会在原文件名的基础上添加时间戳

      1
      ansible webservers -m blockinfile -a "path=~/test/hosts block='192.168.152 wangxuan2.com' marker='#{mark} test4' backup=yes"
    • 使用create参数,如果指定的文件不存在,则创建它

      1
      ansible webservers -m blockinfile -a "path=~/test/hosts block='192.168.152 wangxuan2.com' marker='#{mark} test4' create=yes"
  • lineinfile模块:

    • lineinfile模块,确保”某一行文本“存在于指定的文件中,或者确保从文件中删除指定的”文本”(即确保指定的文本不存在于文件中),还可以根据正则表达式,替换”某一行文本”。

    • 模块参数:

      参数 必选 说明
      path yes 指定要操作的文件
      line no 指定文本内容
      regexp no 使用正则表达式匹配对应的行,当替换文本时,多行文本被匹配,则最后面被匹配到的行文本被替换;当删除文本时,多行文本被匹配,这些行都会被删除。
      state no present执行插入操作或更新操作,absent:从文件中删除对应标记的段落,默认present
      backrefs no backrefs=yes表示开启后向引用
      insertafter no 插入到“指定的行”之后,EOF插入到文档的末尾,正则表达式表示将文本插入到匹配的行之后,默认EOF
      insertbefore no 插入到“指定的行”之前,BOF插入到文档的头部,正则表达式表示将文本插入到匹配的行之后
      backup no 是否在修改文件之前对文件进行备份。
      create no 当要操作的文件并不存在时,是否创建对应的文件
    • 文档尾插入内容:

      1
      ansible webservers -m lineinfile -a "path=~/test/hosts line='this is world1'"
    • regexp支持正则符匹配可以将匹配的行进行替换,匹配到多行时,最后面被匹配到的行文本被替换;当没有匹配到内容时,插入文档末尾。

      1
      ansible webservers -m lineinfile -a "path=~/test/hosts regexp='^#' line='zhanglin is dead'"
    • backrefs=yes,当没有匹配到指定行则不做任何更改

      1
      ansible webservers -m lineinfile -a "path=~/test/hosts regexp='^#' line='zhanglin is dead' backrefs=yes"
    • 匹配指定内容的行删除(若多行匹配全部删除)

      1
      ansible webservers -m lineinfile -a "path=~/test/hosts regexp='^#' state=absent"
  • unarchive模块:

    • 作用:解包和解压缩

    • 模块参数:

      参数 必选 说明
      copy no yes将ansible主机上的压缩包传到远程主机后解压缩至特定目录,no将远程主机上的某个压缩包解压缩到指定路径下;默认yes
      remote_src no yes表示在远程主机不在ansible主机,no表示文件在ansible主机上
      src yes 源路径,可以是ansible主机上的路径;也可以是远程主机上的路径,如果是远程主机上的路径,则需要设置copy=no
      dest yes 远程主机上的目标路径
      mode no 设置解压缩后的文件权限
    • 解压远程主机上的压缩文件到指定目录:

      1
      ansible webservers -m unarchive -a "src=./myShell.tar.gz dest=./ copy=no"
    • 将ansible主机上的压缩包上传到远程主机后并解压到指定目录,修改压缩后的文件权限;上传的压缩文件将被删除。

      1
      2
      ansible webservers -m unarchive -a "src=./myShell.tar.gz dest=./ mode=774"
      ansible webservers -m unarchive -a "src=./myShell.tar dest=./ mode=774"
  • Archive模块:

    • 作用:打包和压缩

    • 将远程主机上的文件压缩,并修改所属主和文件权限

      1
      ansible webservers -m archive -a "path=./myShell dest=./myShell.tar.gz owner=root mode=777"

3.计划任务模块:cron模块

  • 模块参数:

    参数 必选 说明
    backup 对远程主机上的原任务计划内容修改之前做备份
    cron_file 如果指定该选项,则用该文件替换远程主机上的cron.d目录下的用户的任务计划
    day 天,取值范围(1-31,/2)
    hour 小时,取值范围(0-23,/2)
    minute 分钟,取值范围(0-59,*, */2)
    month 月,取值范围(1-12,/2)
    weekday
    job 要执行的任务,依赖于state=present
    name 该任务的描述
    special_time 指定什么时候执行,参数:reboot,yearly(每年),annually,monthly,weekly,daily,hourly
    state 确认该任务计划是创建还是删除,prsent创建,absent删除;默认pr
    user 以哪个用户的身份执行
  • 创建任务:

    1
    2
    # 内天1点5分查看一下家目录
    ansible webservers -m cron -a "name=ll minute=5 hour=1 job='ls -l ./'"
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 修改计划之前备份
    ansible dong -m cron -a "name=ll minute=5 hour=3 job='ls -l ./' backup=yes"
    192.168.169.162 | CHANGED => {
    "ansible_facts": {
    "discovered_interpreter_python": "/usr/bin/python"
    },
    "backup_file": "/tmp/crontabh5DeZQ", # 备份文件路径
    "changed": true,
    "envs": [],
    "jobs": []
    }
  • 查看任务:

    1
    ansible webservers -m shell -a "crontab -l"
  • 删除任务:

    1
    ansible webservers -m cron -a "name=ll state=absent"

4.两个用户模块:

  • user模块:

    • 实现用户账号管理。

    • 模块参数:

      参数 必选 说明
      name yes 指定操作用户名
      uid no 指定用户的uid
      group no 所属组
      groups no 附加组
      state no 状态,prsent创建,absent删除;默认prsent
      home no 指定用户家目录
      remove no yes是否删除家目录,no不删除家目录;默认no
      password no 指定密码(为用python的crypt命令加密后的值)
      shell no shell类型,/sbin/nologin不能登录,默认是bash
    • 创建用户tom,密码为123 (密码需要使用双引号引用)

      1
      2
      3
      4
      5
      6
      7
      8
      [root@quruixiang ~]# python3
      Python 3.6.8 (default, Sep 9 2021, 07:49:02)
      [GCC 8.5.0 20210514 (Red Hat 8.5.0-3)] on linux
      Type "help", "copyright", "credits" or "license" for more information.
      >>> import crypt
      >>> crypt.crypt('123')
      '$6$GM1DTS2hFMz68Vuh$WLxu57RzlUgZBqdnfwJb6AKJmw8Aq1HC6WwvrsFwNStaOWJZoP299AXphfQcFP8Xo98MXecYOtPYvp1wGVpds.'
      [root@quruixiang ~]# ansible webservers -u root -k -m user -a 'name=tom password="$6$GM1DTS2hFMz68Vuh$WLxu57RzlUgZBqdnfwJb6AKJmw8Aq1HC6WwvrsFwNStaOWJZoP299AXphfQcFP8Xo98MXecYOtPYvp1wGVpds."'
    • 创建用户bob,指定所属组和附加组

      1
      ansible webservers -u root -k -m user -a "name=test8 group=tom groups=test1"
    • 删除用户,连同家目录一起:

      1
      ansible webservers -u root -k -m user -a "name=test2 state=absent remove=yes"
    • 为bob用户生成密钥对

      1
      ansible webservers -u root -k -m user -a "name=test8 generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa"
  • group模块:

    • 管理用户组

    • 模块参数:

      参数 必选 说明
      name yes 用于指定要操作的组名称
      state no 用于指定组的状态,present创建,absent删除,默认为present,
      gid no 用于指定组的gid
      system no 系统组
    • 创建一个用户组,并指定gid:

      1
      ansible webservers -u root -k -m group -a "name=wangxuan gid=2000"
    • 删除一个用户组:

      1
      ansible webservers -u root -k -m group -a "name=wangxuan state=absent"

5二个软件包管理模块:

  • yum_repository模块:

    • yum_repository 模块可以帮助我们管理远程主机上的 yum 仓库

    • 模块参数:

      参数 必选 说明
      name yes 用于指定要操作的唯一的仓库ID,也就是”.repo”配置文件中每个仓库对应的”中括号”内的仓库ID。
      baseurl no 此参数用于设置 yum 仓库的 baseurl
      description no 此参数用于设置仓库的注释信息,也就是”.repo”配置文件中每个仓库对应的”name字段”对应的内容。
      file no 此参数用于设置仓库的配置文件名称,默认名name
      enabled no 此参数用于设置是否激活对应的 yum 源,默认yes激活
      gpgcheck no 此参数用于设置是否开启 rpm 包验证功能,默认值为 no
      gpgkey no 当 gpgcheck 参数设置为 yes 时,需要使用此参数指定验证包所需的公钥
      state no absent,表示删除对应的 yum 源;默认值为 present表示创建或修改
    • 向远程主机上添加yum源文件:

      1
      ansible webservers -u root -k -m yum_repository -a "name='mongodb' description='mongodb' baseurl='https://mirrors.aliyun.com/mongodb/yum/redhat/8Server/mongodb-org/4.4/x86_64/' gpgcheck=no file=mongo"
    • 删除远程主机上的yum源文件:

      1
      ansible webservers -u root -k -m yum_repository -a "name=mongodb file=mongo state=absent"
  • yum模块:

    • 安装软件包

    • 模块参数:

      参数 必选 说明
      name yes 用于指定需要管理的软件包
      state no 用于指定软件包的状态,present安装,latest安装最新版,installed已安装,absent删除;默认present
      enablerepo 用于指定安装软件包时临时启用的 yum 源
      disablerepo 用于指定安装软件包时临时禁用的 yum 源
      disable_gpg_check yes为禁用对 rpm 包的公钥 gpg 验证。默认值为 no
    • 通过yum安装httpd服务器

      1
      ansible webservers -m yum -a "name=httpd disable_gpg_check=yes"
    • 在 ansible-demo3 主机上安装 telnet 时,多个源中都有 telnet,安装时临时禁用 local 源

      1
      ansible all -m yum -a 'name=telnet disable_gpg_check=yes  disablerepo=local'
    • 在 ansible-demo3 主机上安装 telnet 时,不确定 local 源是否启用,安装时临时启用 local 源

      1
      ansible all -m yum -a 'name=telnet disable_gpg_check=yes  enablerepo=local' 

6.服务进程模块:Service/systemd模块

  • 用于操作服务进程

  • 模块参数:

    参数 必选 说明
    name 此参数用于指定需要操作的服务名称
    state 指定服务的状态,started启动,stopped停止,restarted重启,reloaded重载配置
    enabled yes将服务设置为开机 启动项,默认no
    arguments 给命令提供一些选项
    runlevel 运行等级
  • 重启httpd服务:

    1
    ansible webservers -m service -a "name=httpd state=restarted"
  • 启动httpd服务并设置开机重启:

    1
    ansible webservers -m service -a "name=httpd state=started enabled=yes"
  • 查看服务:

    1
    ansible webservers -u root -a "systemctl status redis"

7.两个防火墙模块:

  • firewalld 模块:

    • 控制流量的进出

    • 模块参数:

      参数 可选 说明
      service 指定服务
      state 指防火墙策略状态,present添加,absent删除,enable开机启动,disable开机禁止
      immediate 立即启用
      port 端口
      permanent 是否永久生效
      rich_rule 富规则
      source
    • 防火墙必须选启动

    • 允许http协议服务通过,永久有效,立刻生效,开机自启:

      1
      ansible webservers -m firewalld -a "service=http permanent=true immediate=true state=enabled"
    • 允许80/tcp端口通过,永久有效,立刻生效,开机自启:

      1
      ansible webservers -m firewalld -a "port=80/tcp permanent=true immediate=true state=enabled"
    • 富规则:允许源地址192.168.150.0/24网段http服务通过,永久有效,立刻生效,开机自启

      1
      ansible webservers -m firewalld -a 'rich_rule="rule family=ipv4 source address=192.168.150.0/24 service name=http accept" permanent=true immediate=true state=enabled'
    • 富规则:将443端口的数据转发到8443端口上,,永久有效,立刻生效,开机自启

      1
      ansible webservers -m firewalld -a 'rich_rule="rule family=ipv4 forward-port port=443 protocol=tcp to-port=8443" permanent=true immediate=true state=enabled'
  • selinux模块:

    • 管理远端主机的 SELINUX ;

    • 模块参数:

      参数 可选 说明
      state enforcing禁止模式、permissive宽容模式、disabled关闭
      policy targeted针对网络服务限制较多,针对本机限制较少,是默认的策略;strict限制方面较为严格
    • 将setlinux设置为enforcing,策略为targeted

      1
      ansible webservers -m selinux -a 'state=enforcing policy=targeted'

8.配置网络模块:nmcli模块

  • nmcli模块支持管理网络连接和设备,此模块支持配置网络接口组合和绑定,以及ipv4和ipv6寻址

  • 模块参数:

    参数 必选 描述
    conn_name 必选 配置连接的网卡名称
    autoconnect 启用在引导时自动激活连接
    dns4 配置iPV4的dns服务器(最多3个)
    gw4 为接口配置ipv4网关
    Ifname 要绑定到连接的接口
    Ip4 接口的ip地址
    State present启用或absent禁用网络接口
    Type 设备或网络链接的类型
  • 给网卡ens160修改IP地址

    1
    ansible webservers -u root -k -m nmcli -a "conn_name=ens160 ip4='192.168.178.151/24,192.168.178.152/24' state=present type=ethernet"

9.主机名模块:hostname模块

  • 修改主机名

    1
    ansible 192.168.100.18 -m hostname -a 'name=node18.magedu.com'

10.两个上传下载模块:

  • get_url 模块:

    • 该模块主要用于从http、ftp、https服务器上下载文件(类似于wget)

    • 模块参数:

      参数 可选 说明
      url yes 下载的URL
      dest yes 下载到的路径位置
      sha256sum true下载完成后进行sha256 check
      timeout 载超时时间,默认10s
      urlpassword、urlusername 主要用于需要用户名密码进行验证的情况
      use_proxy 是否使用代理,代理需事先在环境变更中定义
      owner 指定属主
      group 指定属组
    • 从网站上下载文件,并修改文件的属主和属组:

      1
      ansible webservers -u root -k -m get_url -a "dest=/home/student/test url=http://rpmfind.net/linux/epel/8/Everything/x86_64/Packages/s/sl-5.02-1.el8.x86_64.rpm owner=root group=root"
  • uri模块:

    • 如同curl命令

    • curl命令是一个网络工具,其主要作用是通过http、https、ftp等方式下载/上传文件

    • 模块参数:

      参数 可选 说明
      url 指明请求的url的路径
      user 如果请求的url需要认证,则认证的用户名是什么
      password 如果请求的url需要认证,则认证的密码是什么
      method 指明请求的方法,如GET、POST…
      body 指明报文中实体部分的内容,一般是POST方法或PUT方法时用到
      HEADER 自定义请求报文中的添加的首部
      return_content 是否将返回主体作为字典中的”content”值返回
      validate_certs 如果“否”,则不会验证 ssl 证书
      Forcebasicauth
    • 访问百度,并能获取到百度源码

      1
      ansible webservers -m uri -a "url=https://www.baidu.com return_content=yes"

11.四个磁盘管理模块:

  • parted模块:

    • 事先关机添加一块10G新磁盘

    • 在新硬盘上创建主分区编号1,空间2GB

      1
      ansible webservers -u root -k -m parted -a "device=/dev/nvme0n2 number=1 part_end=2GiB state=present"
  • lvg模块:

    • 给nvme0n2p1主分区创建卷组vg1

      1
      ansible webservers -u root -k -m lvg -a "pvs=/dev/nvme0n2p1 vg=vg1"
    • 使用vgs查看卷组:

      1
      vgs
  • lvol模块:

    • 创建逻辑卷512M大小

      1
      ansible localhost -m lvol -a 'vg=vg1 lv=lv1 size=512'
    • 对/dev/nvme0n2p3创建512M的逻辑卷

      1
      ansible localhost -m lvol -a 'vg=vg1 lv=lv2 size=512  pvs=/dev/nvme0n2p3'
  • fillesystem模块:

    • 创建ext4文件系统 /dev/sdb1

      1
      ansible localhost -m filesystem -a 'dev=/dev/nvme0n2p2  fstype=ext4  force=yes'
    • 对逻辑卷lv1创建xfs文件系统

      1
      ansible localhost -m filesystem -a 'dev=/dev/vg1/lv1 fstype=xfs  force=yes'
  • mount模块:

    • 配置挂载点

    • 模块参数:

      参数 必选 说明
      fstype yes 挂载文件的类型
      path yes 挂载点
      opts 传递给mount命令的参数
      src yes 要挂载的文件系统
      state yes
      unmounted 卸载
    • 挂载光盘到/media/cdrom:mount /dev/cdrom /media/cdrom

      1
      ansibleansible webservers -u root -k -m mount -a "src=/dev/cdrom path=/media/cdrom state=present fstype=iso9660"
      1
      2
      # 查看是否成功
      ansible webservers -u root -k -a "tail -1 /etc/fstab"