运维必备 | 使用 ansible 自动化批量执行工具,提升企业运维工作效率

news2025/1/18 10:04:52

e0efe789be01fa800e2961d329f1d998.jpeg 各位亲爱的读者,现在公众号更改了推送规则,如果您需要第一时间看到我们推送的好内容。

一定要记得给公众号星标,经常点赞、在看、转发、分享和留下您的评论 !

0ff980bc16f724a56440a643e0ac05df.gif

关注回复【学习交流群】加入【安全开发运维】答疑交流群

请朋友们【多多点击文中的广告】,支持作者更新更多文章


目录:

8adc8fb5152720fe80fcd039587a7a82.png

0x00 快速入门

什么是 ansible?

答:Ansible是一种开源的自动化工具,用于配置管理、应用程序部署、编排和远程任务执行。它基于Python语言开发,使用SSH协议进行通信,可实现对大型IT基础架构的自动化管理。Ansible具有简单易用、轻量级、可扩展性强、跨平台等特点,被广泛用于自动化部署、配置管理和持续集成等领域。

简单的说:它是一个Linux系统上的"自动化运维工具",类似一个"配置管理工具";

ansible 能做什么?

正如其他配置管理工具一样,ansible可以帮助我们完成一些批量任务,或者完成一些需要经常重复的工作。

  • 比如:同时在100台服务器上安装nginx服务,并在安装后启动它们。

  • 比如:将某个文件一次性拷贝到100台服务器上。

  • 比如:每当有新服务器加入工作环境时,你都要为新服务器部署redis服务,也就是说你需要经常重复的完成相同的工作。

ansible 优秀的特性

  • "幂等性":可以保证我们重复的执行同一项操作时得到的结果是一样的。

    • 举个例子:你想把一个文件拷贝到目标主机的某个目录上,但是你不确定此目录中是否已经存在此文件,当你使用ansible完成这项任务时,就非常简单了,因为如果目标主机的对应目录中已经存在此文件,那么ansible则不会进行任何操作,如果目标主机的对应目录中并不存在此文件,ansible就会将文件拷贝到对应目录中;

    • ansible是"以结果为导向的",我们指定了一个"目标状态",ansible会自动判断,"当前状态"是否与"目标状态"一致,如果一致,则不进行任何操作,如果不一致那么就将"当前状态"变成"目标状态"

  • 剧本

  • 模板

  • 角色

其他的一些运维配置管理工具还有puppet或者saltstack而ansible相比较于他们的优点:

  • 使用puppet管理100台主机,就要在这100台主机上安装puppet对应的agent(客户端代理程序),比较繁琐;

  • 不同之处在于ansible只需要依赖ssh即可正常工作,不用在受管主机上安装agent,也就是说只要你能通过ssh连接到对应主机,你就可以通过ansible管理对应的主机。

  • 为了好分辨后面将Ansible主机就是管理主机,受管理的主机叫做受控主机;

参考文档帮助:https://docs.ansible.com/ansible/latest/index.html


0x01 安装部署

1.Ansible 安装

环境设置:采用VMWARE-player模拟环境实现;

10.10.107.222  Master-Ansible管理端
10.10.107.234  Slave-Ansible 受控端(Ubuntu)
10.20.172.235  Slave-Ansible 受控端(Centos)

(1) CentOS下Ansible安装:

#Step1.我使用yum源的方式安装ansible,因为安装ansible需要epel源,所以我配置了阿里的epel源和centos7系统镜像源,
$ pwd
/etc/yum.repos.d
 
# cat aliBase.repo
[aliBase]
name=aliBase
baseurl=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/RPM-GPG-KEY-CentOS-$releasever
 
# cat aliEpel.repo
[aliEpel]
name=aliEpel
baseurl=https://mirrors.aliyun.com/epel/$releasever\Server/$basearch/
enabled=1
gpgcheck=0


#Step2.yum源配置完成后,安装ansible
yum install ansible  #此时yum源中对应的版本为ansible-2.8.1-1.el7.noarch.rpm

#Step3.验证安装
$ansible 127.0.0.1 -m ping  #使用ansible去ping本机,
127.0.0.1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

安装成功后如果想要通过ansible管理某主机,使用ansible管理必须同时满足两个最基本的条件如下

  • 条件一、ansible所在的主机可以通过ssh连接到受管主机。

  • 条件二、受管主机的IP地址等信息已经添加到ansible的"管理清单"中,如果清单中没有的主机无法通过ansible进行配置管理;

ansible提供一个默认的"清单"文件 /etc/ansible/hosts并且采用ini风格里面有默认的配置示例使用提示;

#由于ansible工作方式,需要将受管主机的IP地址、ssh端口号等信息添加到一个被称作为"清单(Inventory)"的配置文件中
# ansible_port 用于配置对应主机上的sshd服务端口号默认的22号端口,
# ansible_user 用于配置连接到对应主机时所使用的用户名称。
# ansible_ssh_pass 用于配置对应用户的连接密码。
echo "10.10.107.234 ansible_port=22 ansible_user=root ansible_ssh_pass=ubuntu" >> /etc/ansible/hosts  #通过ansible主机管理234主机

#当为主机配置别名时,主机的IP地址必须使用anible_host关键字进行指明,否则ansible将无法正确的识别对应的主机。
echo "test ansible_host=10.20.172.104 ansible_port=22 ansible_user=root ansible_ssh_pass=2019" >> /etc/ansible/hosts  #设置别名的方式

#注意:上述配置参数都是ansible2.0版本以后的写法,2.0版本之前,应遵从如下写法
ansible_port #应该写成ansible_ssh_port
ansible_user #应该写成ansible_ssh_user/pass
ansible_host #应该写成ansible_ssh_host


#验证清单配置(两台机器都是OK的)
$ansible 10.10.107.234 -m ping
10.10.107.234 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

ansible test -m ping
test | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

ansible主控端如何采用密匙来登录受控端?

#首先,生成默认格式的密钥对,私钥与公钥。
ssh-keygen
#然后将生成的公钥加入到10.10.107.234的认证列表
ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.10.107.234
#好了公钥认证的相关操作配置完成,此刻,我们已经可以通过ansible主机免密码连接到主机60中了。

因为配置了密钥认证,所以可以实现免密码创建ssh连接,既然已经能够免密码创建ssh连接,那么在配置"主机清单"时,就没有必要再提供对应主机的用户名与密码了,所以在完成了密钥认证的相关配置后,我们可以将清单中的配置精简为如下格式。

10.10.107.234 ansible_port=22 #精简模式(默认也是的22号端口,所以可以忽略)
test ansible_host=10.10.107.234 ansible_port=22 #别名模式

安装总结:

  • 在上面我们使用的是ssh账号密码登录,但是在生产环境中为了提高安全性,我们通常会基于密钥进行ssh认证甚至会禁用密码认证;

  • 在接入之前需要将受控端的公匙写入ansible的kown_hosts中;


偷偷的告诉你哟?极客全栈修炼】微信小程序已开放

【全栈工程师修炼指南】小程序

可直接在微信里面直接浏览博主文章哟,后续将上线更多有趣的小工具。


(2) Ubuntu下Ansible安装:

安装方式:

# 1.官网安装方式(要有梯子)
$ sudo apt update
$ sudo apt install software-properties-common
$ sudo apt-add-repository --yes --update ppa:ansible/ansible
$ sudo apt install ansible


# 2.我们将使用默认的Ubuntu存储库安装(版本可能非最新)
sudo apt update  # 首先使用以下命令刷新系统的软件包索引完成此更新后您可以使用以下方法
sudo apt install ansible # 安装Ansible软件:

# 3.安装后版本查看
ansible --version
ansible 2.9.6
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/weiyigeek/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.8.5 (default, Jul 28 2020, 12:59:40) [GCC 9.3.0]

至此现在,您的Ansible控制节点具有管理主机所需的所有软件;


2.Ansible 配置清单

描述:该清单文件包含有关你会Ansible管理的主机信息

  • 清单文件中包括从一到数百台服务器的任何位置,并且可以将主机组织为组和子组。

  • 清单文件通常还用于设置仅对特定主机或组有效的变量,以便在剧本和模板中使用。

我们可以在ansible提供的清单配置文件中进行配置我们以该文件进行讲解

$vim /etc/ansible/hosts
# This is the default ansible 'hosts' file.
# It should live in /etc/ansible/hosts

# 示例1.清单支持"分组"功能,我们可以将某些主机分为一组,然后通过组名去管理组内的所有主机。
# 比如,主机234和主机235都属于A模块的服务器,主机221属于B模块的服务器,我们则可以在清单中进行如下配置
[A]
10.10.107.234
10.10.107.235

[B]
10.10.107.221


# 示例2.如果两台主机的IP地址是连续的我们可以使用更简洁的方法,配置A组中的受管主机,示例如下
[A]
10.10.107.[234:235]

[B]
10.10.107.221


# 示例3. 使用主机名配置受管主机的前提是ansible主机可以正确解析对应的主机名,比如,我们想要通过主机名配置两台主机,示例如下。
[A]
db01.weiyigeek.net
db02.weiyigeek.net

[B]
db0[1:2].weiyigeek.net


# 示例4.为了更加的灵活的管理受管主机,可能需要在组内嵌套组。
#比如,服务器环境从大类上可以分为"生产环境"和"测试环境",把主机分成了两组生产组和测试组,但是生产环境又包含很多业务模块,
#比如,A模块生产组、B模块生产组,同理测试环境中也会有同样的问题,比如A模块测试环境组,B模块测试组,这时我们就需要更加细化的进行分组,示例如下
[testA]
10.10.107.1

[testB]
10.10.107.2

#而master组中包含"子组",没错,"children"关键字表示当前组中存在子组就是testA组和testB组
[Master:children]
test[A:B]


# 示例4.分组与子组与组的变量声明
[manager]
admin ansible_host=10.10.107.202 ansible_port=20211 ansible_user=WeiyiGeeker ansible_sudo_pass='123456'

[master]
k8s-master-1 ansible_host=10.10.107.210 ansible_port=20211
k8s-master-2 ansible_host=10.10.107.211
k8s-master-3 ansible_host=10.10.107.212

[node]
k8s-node-1 ansible_host=10.10.107.213
k8s-node-2 ansible_host=10.20.172.220
k8s-node-3 ansible_host=10.20.172.221

# k8s 组包含的 子组
[k8s:children]
master
node

# k8s 组内所共享的局部变量设置优先级高(全局设置在`/etc/ansible/ansible.cfg`)
[k8s:vars]
ansible_port=20211
ansible_user=WeiyiGeeker
ansible_become=true
ansible_become_method=sudo
ansible_become_pass='123456'

[all:vars]
ansible_python_interpreter=/usr/bin/python3

验证配置结果:

#验证1.A组中包含主机60与61,B组中包含主机70,经过上述配置后,我们可以通过组名去管理组内的所有主机,示例如下。
ansible A -m ping
ansible B -m ping
ansible all -m ping #将配置文件中所有的主机进行ping操作

#验证4.如我们需要针对生产环境中的所有主机进行操作时,调用master组即可
ansible Master -m ping

#验证5.通过执行以下命令查看包含清单文件中定义的自己的服务器基础结构
$ansible-inventory --list -y
all:
  children:
    k8s:
      children:
        master:
          hosts:
            k8s-master-1:
              ansible_become: 'true'
              ansible_become_method: sudo
              ansible_become_pass: 123456
              ansible_host: 10.10.107.210
              ansible_port: 20211
              ansible_python_interpreter: /usr/bin/python3
              ansible_user: WeiyiGeeker
            k8s-master-2:
              ansible_become: 'true'
              ansible_become_method: sudo
              ansible_become_pass: 123456
              ansible_host: 10.10.107.211
              ansible_port: 20211
              ansible_python_interpreter: /usr/bin/python3
              ansible_user: WeiyiGeeker
            k8s-master-3:
              ansible_become: 'true'
              ansible_become_method: sudo
              ansible_become_pass: 123456
              ansible_host: 10.10.107.212
              ansible_port: 20211
              ansible_python_interpreter: /usr/bin/python3
              ansible_user: WeiyiGeeker
        node:
          hosts:
            k8s-node-1:
              ansible_become: 'true'
              ansible_become_method: sudo
              ansible_become_pass: 123456
              ansible_host: 10.10.107.213
              ansible_port: 20211
              ansible_python_interpreter: /usr/bin/python3
              ansible_user: WeiyiGeeker
            k8s-node-2:
              ansible_become: 'true'
              ansible_become_method: sudo
              ansible_become_pass: 123456
              ansible_host: 10.20.172.220
              ansible_port: 20211
              ansible_python_interpreter: /usr/bin/python3
              ansible_user: WeiyiGeeker
            k8s-node-3:
              ansible_become: 'true'
              ansible_become_method: sudo
              ansible_become_pass: 123456
              ansible_host: 10.20.172.221
              ansible_port: 20211
              ansible_python_interpreter: /usr/bin/python3
              ansible_user: WeiyiGeeker
    manager:
      hosts:
        admin:
          ansible_host: 10.10.107.202
          ansible_port: 20211
          ansible_python_interpreter: /usr/bin/python3
          ansible_sudo_pass: 123456
          ansible_user: WeiyiGeeker
    ungrouped: {}
fe55316b18eb827bbb73f5541596d84d.png
weiyigeek.top-验证1

其实Ansible的清单文件/etc/ansible/hosts不仅能够识别INI的配置语法还能够识别"YAML"的配置语法。注意,为了使缩进显得更加明显,此处每次缩进使用两个空格

$vim /etc/ansible/hosts
#使用YAML语法配置的主机清单非常简单下面就是他的配置示例

#示例1.所有受管理组演示
all:   #管理清单中的所有主机的一个组,这里的"all:"就是这个含义
 hosts:  #第二行开头使用一个空格作为缩进,使用hosts关键字,表示hosts属于all的下一级,(后面的都是采用两个空格)
   10.10.107.1
   10.10.107.2
#上例相当于如下INI配置
10.1.1.60
10.1.1.61


#示例2.ini风格对比yaml
#先看一个INI风格的配置表示当前清单中有3台受管主机,主机61不属于任何组,主机60属于test1组,主机70属于test2组
10.1.1.61

[test1]
10.1.1.60

[test2]
10.1.1.70

#使用YAML语法进行同等效果的配置如下
#当直接在清单中创建组时,需要在all关键字内使用children关键字,而定义每个组时,有必须使用hosts关键字,指明组内的主机
all:
  hosts:
    10.1.1.61:
  children:  #分组都是children
    test1:
      hosts:
        10.1.1.60:
    test2:
      hosts:
        10.1.1.70:
#从上例可以看出,

组中嵌套时候:

#仍然先写出INI风格的示例以作对比,如下
[proA]
10.1.1.60

[proB]
10.1.1.70

[pro:children]
proA
proB

#对应YAML格式的配置如下pro组有两个子组,分别为proA组和proB组,而这两个组分别有自己组内的主机。
all:
  children:
    pro:
      children:
        proA:
          hosts:
            10.1.1.60
        proB:
          hosts:
            10.1.1.70

当我们使用YAML语法配置清单时,无非是使用hosts、children等关键字与我们的自定义名称进行排列组合罢了。

认证管理yaml配置:

#ini格式如下:
10.1.1.6
test7 ansible_host=10.1.1.7 ansible_port=22
localhost ansible_connection=local

#yaml的配置语法
all:
  hosts:
    10.1.1.6
    test7:
      ansible_host: 10.1.1.7 #注意冒号后都有空格,注意yaml语法
      ansible_port: 22
    localhost:
      ansible_connection: local

补充,使用将变量分配给多台机器:对变量进行分组

# In INI:
[atlanta]
host1
host2

[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com

# In YAML:
atlanta:
  hosts:
    host[1:50] # host1,host2,...,host3...host50
  vars:
    ansible_host: 20211
    ntp_server: ntp.atlanta.example.com
    proxy: proxy.atlanta.example.com

综合示例:

#以下是如何立即部署到创建的容器的示例
- name: create jenkins container
  docker_container:
    docker_host: myserver.net:4243
    name: my_jenkins
    image: jenkins

- name: add container to inventory
  add_host:
    name: my_jenkins
    ansible_connection: docker
    ansible_docker_extra_args: "--tlsverify --tlscacert=/path/to/ca.pem --tlscert=/path/to/client-cert.pem --tlskey=/path/to/client-key.pem -H=tcp://myserver.net:4243"  #设置守护进程
    ansible_user: jenkins
  changed_when: false

- name: create directory for ssh keys
  delegate_to: my_jenkins
  file:
    path: "/var/jenkins_home/.ssh/jupiter"
    state: directory

参考absible的yaml语法:https://docs.ansible.com/ansible/2.4/intro_inventory.html#id7


0x02 Ansible 常用命令

描述:主要讲解ansible命令以及子命令和ansible-doc命令参数使用,通过一些简单的命令进行absible 基础学习。

Ansible是一种自动化运维工具,可以用来简化系统配置、应用程序部署、任务执行等操作。下面是一些常用的Ansible命令:

  1. ansible:执行Ansible命令的主要命令。可以用于执行各种操作,如执行任务、部署应用程序、更新配置等。

  2. ansible-playbook:执行Ansible剧本的命令。剧本是一种用于定义和执行复杂操作的脚本。

  3. ansible-galaxy:用于管理Ansible角色和集合的命令。可以用于搜索、安装、创建和发布Ansible角色和集合。

  4. ansible-config:用于查看和修改Ansible配置的命令。可以用于设置全局配置、主机配置、角色配置等。

  5. ansible-doc:用于查看Ansible模块文档的命令。可以用于查找模块的使用方法、参数说明等。

  6. ansible-vault:用于加密和解密Ansible剧本中的敏感数据的命令。可以用于保护剧本中的密码、证书等敏感信息。

  7. ansible-pull:用于从远程版本控制库(如Git)中拉取Ansible剧本并执行的命令。可以用于实现反向控制,让目标主机主动拉取剧本并执行。

这些只是一些常用的Ansible命令,还有很多其他命令和选项可供使用。你可以使用"ansible --help"来查看所有可用的命令和选项。


ansible 命令

语法参数:

ansible [主机] [选项] [主机连与认证]

-e 指定参数变量以供模块使用。
-i INVENTORY:指定主机清单文件。
-m MODULE_NAME:指定要使用的模块。
-a 'MODULE_ARGS':指定模块的参数。
-u REMOTE_USER:指定远程用户。
-b:以特权用户(如root)执行操作。
-K:使用sudo密码。
-l SUBSET:指定要操作的主机子集。

示例演示:

# 示例1.所有主机执行Ansible的ping模块任务。
ansible all -m ping

ansible-config 命令

描述:此命令主要用于查看和修改Ansible配置文件。

示例演示:

# 1.命令查看Ansible配置文件
ansible-config view

ansible-doc 命令

描述: 此命令主要用于模板帮助以及模块命令作用查看。

语法参数:

ansible-doc

# 参数
MODULE_NAME:查看指定模块的帮助文档。
-l,--list 模块简介与全部模块
-s 模块详情

语法参数:

# 示例1.用于查看ping模块的文档。
ansible-doc ping

ansible-playbook 命令

描述:此命令主要是运行剧本配置文件脚本。

语法参数:

# 语法
ansible-playbook 

# 参数
PLAYBOOK:指定要运行的Playbook文件。
-i INVENTORY:指定主机清单文件。
-e EXTRA_VARS:传递额外的变量。
-u REMOTE_USER:指定远程用户。
-b:以特权用户(如root)执行操作。
-K:使用sudo密码。
-l SUBSET:指定要操作的主机子集
--syntax-check #语法验证 
--check   #模拟验证执行 
--list-tags #概览一下playbook中都有哪些标签
--tags [tagname]  #指定执行tagname的任务
--skip-tags [tagname]  #跳过执行tagname的任务而执行其他任务;
-e,--extra-vars           #指定在play中使用的变量传入多/单个变量,还可以通过json字符串形式传入;

示例演示

示例:用于执行Ansible剧本。
ansible-playbook playbook.yml

#ansible-playbook进行yml配置语法检查
ansible-playbook --syntax-check test.yml

#ansible-playbook进行yml配置模拟执行
ansible-playbook --check test.yml

#只有标签对应的任务会被执行,其他任务都不会被执行
ansible-playbook --tags task1 test.yml

#指定"不执行的任务",task1标签的任务将不被执行
ansible-playbook --skip-tags task1 test.yml

#指定在play中使用的变量(传入单个变量 / diphenhydramine变量)
ansible-playbook cmdvar.yml --extra-vars "pass_var=cmdline pass var"
ansible-playbook cmdvar.yml -e 'pass_var="test"  pass_var1="test1"'
ansible-playbook cmdvar.yml -e '{"testvar":"test","testvar1":"test1"}'
ansible-playbook cmdvar.yml -e '{"countlist":["one","two","three","four"]}' #获取值使用如下两种语法引用变量 {{countlist[0]}} 或者 {{countlist.0}}

0x03 Ansible 模块使用说明

描述:当我们使用ansible完成实际任务时,需要依靠ansible的各个模块,比如前的ping模块,此时我们可以举一反三配置使用其他ansible模块。

模块搜寻与使用帮助

# ping模块使用
$ansible all -m ping

ansible-doc -l #获取到的模块信息比较概括(查看absible当前所有模块)
ansible-doc -s ping #ping模块的详细使用
ansible-doc -s fetch #我们需要将受管主机中的文件拉取到ansible主机时则可以使用此模块

比如:查看fetch模块的使用帮助

# ansible-doc -s fetch
- name: Fetch files from remote nodes
  fetch:
      dest:  # (required - 必须参数) 指定存入到ansible主机上文件路径
      src:   # (required - 必须参数) 指定远程主机文件路径
      validate_checksum: #Verify checksums
      fail_on_missing: #默认yes,只有再文件不存在的时候失败
      flat:  #文件重写覆盖

亲,文章就要看完了,不关注一下【全栈工程师修炼指南】吗?

ea2f8a25779485fe9348786c759ebe9a.jpeg

基础示例

#主机清单-yaml文件
all:
  hosts:
    local:
      ansible_host: 10.10.107.222
      ansible_user: root
      ansible_ssh_pass: root@2019
  children:
    ops:
      children:
        testA:
          hosts:
            10.10.107.221
        testB:
          hosts:
            10.20.172.179


#示例:拉取ops组中所有主机的/etc/fstab文件拉取到本地
ansible ops -m fetch -a "src=/etc/fstab dest=/tmp/ansible/"  #初次拉取
#黄色提示,并且发生改变
10.10.107.221 | CHANGED => {
    "changed": true,  #关键点
    "checksum": "2b8323413e9c5a3067f61c27ca5ea21378bae582",  #远程MD5校验
    "dest": "/tmp/ansible/10.10.107.221/etc/fstab",  #(会以主机名称建立文件夹,然后再存入)
    "md5sum": "edf31ba4fd10068f6310f4343855af89",  #本地MD5
    "remote_checksum": "2b8323413e9c5a3067f61c27ca5ea21378bae582",  #远程MD5校验
    "remote_md5sum": null
}
9881f706e83c707bb08e86c9bff9520f.png
weiyigeek.top-fetch

返回提示颜色来看幂等性

  • 当返回信息为绿色时,"changed"为false,表示ansible没有进行任何操作,没有"改变什么"。

  • 当返回信息为黄色时,"changed"为true,表示ansible执行了操作,"当前状态"已经被ansible改变成了"目标状态"。

比如:这时候我把10.10.107.221的fstab进行更改

echo " " >> /etc/fstab

#再次进行文件拉取查看效果
10.10.107.221 | CHANGED => {  #对比点
    "changed": true,  #对比点 (Yellow)
    "checksum": "e0719b31dd9445c5da3dd5e04f13ed44855aacd0",
    "dest": "/tmp/ansible/10.10.107.221/etc/fstab",
    "md5sum": "631e37410fac691ead3c90e6938494ef",
    "remote_checksum": "e0719b31dd9445c5da3dd5e04f13ed44855aacd0",  #比对点
    "remote_md5sum": null
}
10.20.172.179 | SUCCESS => {
    "changed": false, # 由于终端的问题我是白色的(Green)
    "checksum": "39ffc633a100c2b2d06a3d9d0e625dff1ca7043c",
    "dest": "/tmp/ansible/10.20.172.179/etc/fstab",
    "file": "/etc/fstab",
    "md5sum": "c63b434a7a09baea8b7b59fce8cb807b"
}
3e3b63ad79d7fb79e025713d9d9d2959.png
weiyigeek.top-幂等性差别

总结:

  • 注释中包含 "required" 字样则表示使用模块中的参数必须要设置;

  • 注意幂等性的区别点,以及yaml配置受管主机清单


本文至此完毕,更多技术文章,尽情等待下篇好文!

原文地址: https://blog.weiyigeek.top/

【 如果此篇文章对你有帮助,请你将它分享给更多的人! 】

4db4242771884d7a88b80d9197615f6e.gif

13dab07bd49008e597345739e4de2332.png 学习书籍推荐 往期发布文章 88fbde5629bd043f2e9da3c41e4f6d7f.png

回复【0014】获取【Nginx学习之路汇总】

回复【0015】获取【Jenkins学习之路汇总】

回复【10005】获取【adb工具刷抖音赚米】

回复【0011】获取【k8S二进制安装部署教程】

回复【10001】获取【WinServer安全加固脚本】

回复【0008】获取【Ubuntu22.04安装与加固脚本】

回复【10006】获取【CentOS8安全加固脚本】

回复【10002】获取【KylinOS银河麒麟安全加固脚本】

 热文推荐  

  • 运维必学 | 初识介绍-从零开始学Windows批处理(Batch)编程系列教程

  • 运维必学 | 基础脚本示例-从零开始学Windows批处理(Batch)编程系列教程

  • 运维必学 | 工作实践示例-从零开始学Windows批处理(Batch)编程系列教程

  • 全栈之路-前端篇 | 第一讲.基础前置知识【浏览器内核与网络知识】学习笔记

  • 全栈之前端 | 1.HTML基础必备知识学习篇

  • 12.HTML5下一代的HTML标准介绍与初识尝试

  • 开发必备 | 新手如何快速掌握VSCode编辑器?

  • GitOps实践 | 企业生产环境Jenkins流水线分享,从Gitlab到镜像构建到部署测试以及企业微信消息通知

  • GitOps实践 |  云原生Tekton CI流水线,从Gitlab到镜像构建以及企业微信消息通知

按(扫描)二维码 关注 【全栈工程师修炼指南】(^U^)ノ~YO

446a355acecb432b6b4ab9f08401d007.gif

欢迎添加作者微信【weiyigeeker】,一起入坑吧!

关注回复【学习交流群】即可加入【安全开发运维沟通交流群

     点击【"阅读原文"】获取更多有趣的知识

若有帮助请点个【在看 赞 】吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/997767.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

买卖股票的最佳时机含冷冻期

题目链接 买卖股票的最佳时机含冷冻期 题目描述 注意点 卖出股票后,无法在第二天买入股票 (即冷冻期为 1 天)不能同时参与多笔交易(必须在再次购买前出售掉之前的股票)可以尽可能地完成更多的交易(多次买卖一支股票&#xff09…

l8-d11 TCP连接管理与UDP协议

一、三次握手 TCP 建立连接的过程叫做握手。 采用三报文握手:在客户和服务器之间交换三个 TCP 报文段,以防止已失效的连接请求报文段突然又传送到了,因而产生 TCP 连接建立错误。 二、四次挥手 TCP 连接释放过程比较复杂。 数据传输结束后…

2、k-means聚类算法sklearn与手动实现

本文将对k-means聚类算法原理和实现过程进行简述 算法原理 k-means算法原理较简单,基本步骤如下: 1、假定我们要对N个样本观测做聚类,要求聚为K类,首先选择K个点作为初始中心点; 2、接下来,按照距离初始中…

蓝桥杯官网填空题(三角形的面积)

题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 已知三角形三个顶点在直角坐标系下的坐标分别为: txt (2.3, 2.5) (6.4, 3.1) (5.1, 7.2) txt 求该三角形的面积。 注意,要提交的是一个小…

解决ROS2 humble版本源码编译中resdep init及rosdep update失败的问题

网上有在/etc/hosts中添加ip地址的方法,使用了不成功,具体做法如下,仅供参考: a.打开查询ip的网址: https://site.ip138.com b.输入:raw.githubusercontent.com c.执行sudo vi /etc/hosts 将获取到的ip添…

docker系列(3) - 常用软件安装

文章目录 3. docker安装常用软件3.1 安装nginx3.2 安装redis3.3 安装mysql3.4 部署springboot程序3.4.1 编写dockerfile3.4.2 构建镜像3.4.3 启动镜像 3. docker安装常用软件 3.1 安装nginx docker pull nginx#挂载启动 docker run -it -d \ --namenginx \ --networkpub_netw…

L2 数据仓库和Hive环境配置

1.数据仓库架构 数据仓库DW主要是一个用于存储,分析,报告的数据系统。数据仓库的目的是面向分析的集成化数据环境,分析结果为企业提供决策支持。-DW不产生和消耗数据 结构数据:数据库中数据,CSV文件 直接导入DW非结构…

2023高教杯数学建模2:DE题+参考论文、代码

2023高教杯数学建模2:DE题 写在最前面E题D题2014C题优秀论文笔记问题一(求解母猪年均产仔量以达到或超过盈亏平衡点)问题二(求解小猪选为种猪的比例和母猪的存栏数)问题三(确定最佳经营策略,计算…

docker系列(4) - docker镜像制作

文章目录 4. docker镜像4.1 联合文件系统(UnionFS)4.2 Docker镜像加载原理4.3 docker commit(扩展镜像)(非常重要)4.3.1 案例4.3.1.1 下载ubuntu镜像4.3.1.2 安装vim4.3.1.3 commit新的镜像4.3.1.3 验证新的镜像 4. docker镜像 4.1 联合文件系统(UnionFS) Union文件系统(Unio…

树树树树树

//先序遍历 void PreOrder(BiTree T){if(T!NULL){printf("%c",T->data);PreOrder(T->lchild);PreOrder(T->rchild);} } //后序遍历 void PostOrder(BiTree T){if(T!NULL){PostOrder(T->lchild);PostOrder(T->rchild);printf("%c",T->dat…

美国星链再迎挑战,中国最有钱的通信企业争夺卫星互联网服务

随着一家手机企业发布5G卫星手机,卫星互联网服务的热度大增,业界人士指出目前能提供卫星互联网服务的仅有中国电信,但是中国移动已不甘落后,正在测试低轨道卫星互联网服务,这也是中国与美国星链竞争的序幕。 据了解日前…

表的约束类型

空属性约束 mysql有空属性和非空属性:null和not null 数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算 所以我们在设计数据库表的时候,一定要在表中进行限制&…

嵌入式:驱动开发 Day2

作业&#xff1a;字符设备驱动&#xff0c;完成三盏LED灯的控制 驱动代码&#xff1a; mychrdev.c #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h> #include &q…

oracle表空间释放

oracle表空间释放 1&#xff09;查询表空间信息2&#xff09;查询指定表空间下各个表的表空间使用情况3-1&#xff09;可以直接释放3-2) 可以move3-3&#xff09;重新排列 1&#xff09;查询表空间信息 selecta.tablespace_name as "表空间名",total as "表空间…

初识Java 7-1 多态

目录 向上转型 难点 方法调用绑定 产生正确的行为 可扩展性 陷阱&#xff1a;“重写”private方法 陷阱&#xff1a;字段与静态方法 构造器和多态 构造器的调用顺序 继承和清理 构造器内部的多态方法行为 协变返回类型 使用继承的设计 替换和扩展 向下转型和反射…

Java开发之Mysql【面试篇 完结版】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、知识体系二、Mysql-优化1. 优化-如何定位慢查询① 问题引入② 解决方案③ 问题总结④ 实战面试 2. 优化-sql执行很慢&#xff0c;如何解决① 问题引入② 解…

AI项目五:结印动作识别

若该文为原创文章&#xff0c;转载请注明原文出处。 感谢恩培大佬对项目进行了完整的实现&#xff0c;并将代码进行开源&#xff0c;供大家交流学习。 恩培大佬开源地址&#xff0c;有兴趣的可以去复现一下。GitHub - enpeizhao/CVprojects: computer vision projects | 计算机…

计算机网路学习-time_wait过多

四次挥手 调试命令 netstat -an|awk ‘/tcp/ {print $6}’|sort|uniq -c netstat -an 列出系统中所有处于活动状态的网络连接信息&#xff0c;包括 IP 地址、端口号、协议等。 其中&#xff0c;第六列是tcp的状态。 Proto Recv-Q Send-Q Local Address Foreign Addr…

Aidlux工业视觉缺陷检测

Aidlux工业视觉缺陷检测 1. AidLux简介 AidLux是成都阿加犀智能科技有限公司自主研发的融合架构平台&#xff0c;提供Android&#xff0f;鸿蒙&#xff0b;Linux融合系统&#xff0c; 双系统既能独立使用又能相互通信。 阿加犀致力于人工智能核心技术持续创新&#xff0c; 独…

CSS元素浮动

概述 浮动简介 在最初&#xff0c;浮动是用来实现文字环绕图片效果的&#xff0c;现在浮动是主流的页面布局方式之一。 元素浮动后的特点 脱离文档流。不管浮动前是什么元素&#xff0c;浮动后&#xff0c;默认宽与高都是被内容撑开的&#xff08;尽可能小&#xff09;&am…