自动化运维利器Ansible

本文介绍了Ansible自动化工具的基础知识,包括安装配置、工作原理、Ad-Hoc命令使用及多种核心模块的应用,如文件管理、软件包安装等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 、Ansible 介绍及安装

1. 介绍

    Ansible 是一个 IT 自动化工具。它能配置系统、部署软件、编排更复杂的 IT 任务,如连续部署或零停机时间滚动更新。
    Ansible 用 Python 编写,尽管市面上已经有很多可供选择的配置管理解决方案(例如 saltstack、Puppet、Chef等),但它们各有优劣,而Ansible的特点在于它的简洁。让 Ansible 在主流的配置管理系统中与众不同的一点便是,它并不需要你在想要配置的每个节点上安装自己的组件。同时提供的另一个优点,如果需要的话,你可以在不止一个地方控制你的整个基础架构。

2. 工作原理

QQ20180304-112411@2x.png

1、在ANSIBLE 管理体系中,存在"管理节点" 和 “被管理节点” 两种角色。

2、被管理节点通常被称为"资产"

3、在管理节点上,Ansible将 AdHoc 或 PlayBook 转换为Python脚本。

  并通过SSH将这些Python 脚本传递到被管理服务器上。

  在被管理服务器上依次执行,并实时的将结果返回给管理节点。

3. 如何安装

QQ20180304-112731@2x.png

3.1 先决条件

管理节点

确保存在OpenSSH
确保Python 版本 >= 2.6
确保安装ansible

被管理节点

确保存在OpenSSH
确保Python 版本 >= 2.4 //若为2.4 版本,确保安装了python-samplesjson 扩展
不需要安装ansible

3.2 安装Ansible
  • yum 方式
[root@qfedu.com ~]# yum install epel-release
[root@qfedu.com ~]# yum install ansible
  • pip 方式

    这里是使用系统自带的 python2 的环境

    如果系统中安装的 pip ,可以直接使用 pip 安装 ansible

[root@qfedu.com ~]# yum install epel-release
[root@qfedu.com ~]# yum install python2-pip
[root@qfedu.com ~]# pip install ansible
  • 查看版本

    [root@qfedu.com ~]# ansible --version
    ansible 2.9.6
      config file = /etc/ansible/ansible.cfg
      configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
      ansible python module location = /usr/lib/python2.7/site-packages/ansible
      executable location = /usr/bin/ansible
      python version = 2.7.5 (default, Aug  7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
    

二、 管理节点与被管理节点建立SSH 信任关系

管理节点(ansible)中创建密钥对

[root@qfedu.com ~]# ssh-keygen -t rsa -f ~/.ssh/id_rsa  -N ""

将本地的公钥传输到被管理节点

每个被管理节点都需要传递

过程中需要被管理节点(这里是 172.18.0.3)的用户名(这里是 root)及密码

[root@qfedu.com ~]# ssh-copy-id root@172.18.0.3

三、 快速入门

1. 场景假设

管理节点:
172.18.0.2 主机名 qfedu.com

被管理节点(资产):
172.18.0.3
172.17.0.4

且管理节点 和 被管理节点之间的节点已经打通 SSH 信任关系。

2. 场景一

在管理节点上,测试与所有被管理节点的网络连通性。

# ansible all -i 172.18.0.3,172.18.0.4 -m ping
172.18.0.4 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
172.18.0.3 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

注意 -i 参数后面接的是一个列表(List)。因此当为一个被管理节点时,我们后面一定要加一个英文逗号(,),告知是List

# ansible all -i 172.18.0.3, -m ping

3. 场景二

在管理节点上,确保文件 /tmp/a.conf 发布到所有被管理节点

# touch /tmp/a.conf
# ansible all -i 172.18.0.3,172.18.0.4 -m copy -a "src=/tmp/a.conf dest=/tmp/a.conf"

选项参数解释

  • all 在 ansible 中, 将其叫做pattern , 即匹配。我通常称它为资产选择器。就是匹配资产(-i 参数指定) 中的一部分。这里的 all 是匹配所有指定的所有资产。将在下面资产部分详细阐述。
  • -i 指定Ansible 的资产,也就是被管理服务器。
  • -m 指定要运行的模块,比如这里的 ping 模块和 copy 模块
  • -a 指定模块的参数, 这里模块 ping 没有指定参数。 模块 copy 指定了 src 和 dest 参数。

总结一句话

ansible 就是用什么模块,让谁去干什么事情。

四、 Ansible 清单

在快速入门的场景中,我们一共管理了两台服务器。但是在实际场景中,我们要管理的服务器往往要多得多。难道依然要在Ansible 的 -i 参数后面一个个追加IP指定吗? 这显然不合乎常理。

因此这一节我们主要去介绍一下Ansible的资产。

Ansible 的资产分为静态资产和动态资产,动态资产会在后面的高级部分详细阐释。

下面仅介绍静态资产

1. 静态资产

顾名思义它本身是一个文本文件,一个格式类似INI的文件。

默认情况下,Ansible的资产文件位于 /ect/ansible/hosts

用 pip 安装的ansible,默认没有这个文件,创建一个即可。

1.1 自定义资产

这个文件可以自定义,之后使用 -i 参数指定。

下面给出一个自定义的静态资产实例,然后再具体解释其含义。

# cat inventory.ini
1.1.1.1
2.2.2.2
3.3.3.[1:15]
test01.qfedu.com
test03.qfedu.com
test[05:09].qfedu.com

[web_servers]
192.168.1.2
192.168.1.3
192.168.1.5

[db_servers]
192.168.2.2
192.168.2.3
192.168.1.5

[all_servers]
[all_servers:children]
db_servers
web_servers
  1. Ansible 的资产文件中,可以以IP地址的形式或者主机名的形式存在。

  2. Ansible 的资产若连续,可以使用[stat:end] 的形式去表达。

  3. 可以将服务器按照业务场景定义成组,比如db_serversweb_servers

  4. 组和组之间可以存在继承关系,比如db_serversweb_servers 同时继承 all_servers

1.2 如何使用自定义资产

通过 -i 参数指定自定义资产的位置即可(可以是绝对路径,也可以是相对路径)。

# ansible all -i inventory ... // 伪指令,不可执行
1.3 如何验证自定义资产

假如我们刚刚定义的资产为 inventory.ini

  • 列举出所有资产

    # ansible all -i inventory  --list-hosts
      hosts (29):
        1.1.1.1
        2.2.2.2
        3.3.3.1
        ...略...
    
  • 列举出选定资产

    比如这里列举出 web_servers

    # ansible web_servers -i inventory --list-hosts
      hosts (3):
        192.168.2.2
        192.168.2.3
        192.168.1.5
    

    注意这里使用的了资产选择器(pattern),不要慌,将会在下面对他进行详细的阐述

2. 资产选择器

有时操作者希望只对资产中的一部分服务器进行操作,而不是资产中所有服务器。此时可以使用 Ansible 的资产选择器 PATTERN。

下面学习如何通过资产选择器,更灵活的选择想要操作的服务器。

2.1 基本语法格式
ansible PATTERN -i inventory -m module -a argument

选择一台或者几台服务器

# ansible 1.1.1.1 -i inventory --list-hosts
  hosts (1):
    1.1.1.1
# ansible test01.qfedu.com -i inventory --list-hosts
  hosts (1):
    test01.qfedu.com
# ansible 1.1.1.1,2.2.2.2 -i inventory --list-hosts
  hosts (2):
    1.1.1.1
    2.2.2.2

选择一组服务器

# ansible web_servers -i inventory --list-hosts
  hosts (3):
    192.168.1.2
    192.168.1.3
    192.168.1.5

使用 * 匹配

# ansible 3.3.3.1* -i inventory --list-hosts
  hosts (7):
    3.3.3.13
    3.3.3.10
    3.3.3.11
    3.3.3.12
    3.3.3.14
    3.3.3.15
    3.3.3.1

使用逻辑匹配

  • web_servers 和 db_servers 的并集

    两个组内的所有主机

    # ansible 'web_servers:db_servers' -i inventory --list-hosts
      hosts (5):
        192.168.1.2
        192.168.1.3
        192.168.1.5
        192.168.2.2
        192.168.2.3
    
  • web_servers 和 db_servers 的交集

    两个组共有的主机

    # ansible 'web_servers:&db_servers' -i inventory --list-hosts
      hosts (1):
        192.168.1.5
    
  • 排除

    在 web_servers 中,但是不在 db_servers 中

    # ansible 'web_servers:!db_servers' -i inventory --list-hosts
      hosts (2):
        192.168.1.2
        192.168.1.3
    

五、Ansible Ad-Hoc 命令

Ad-hoc 命令是什么呢? 这其实是一个概念性的名字,是相对于写 Ansible playbook 来说的.类似于在命令行敲入shell命令和 写shell scripts两者之间的关系。可以用于执行一些临时命令。

如果我们敲入一些命令去比较快的完成一些事情,而不需要将这些执行的命令特别保存下来, 这样的命令就叫做 ad-hoc 命令。

Ansible提供两种方式去完成任务,一是 ad-hoc 命令,一是写 Ansible playbook(这部分在高级课程中会详细阐释)。

前者可以解决一些简单的任务, 后者解决较复杂的任务,比如做配置管理或部署。

2. 模块类型

Ansible 模块分三种类型: 核心模块(core module)、附加模块(extra module)及用户自定义模块(consume module)。

核心模块是由Ansible 的官方团队提供的。

附加模块是由各个社区提供的。例如: OPENSTACK 社区、DOCKER 社区等等。

当核心模块和附加模块都无法满足你的需求时,用户可以自定义模块。

默认情况下,在安装Ansible 的时候, 核心模块和附加模块都已经安装而无需用户干预。

3. 联机帮助

Ansible 的核心模块和附加模块,数量有3000+ 。这样庞大的模块数量,对于任何一个接触Ansible 的人都不可能将其完全记住、掌握使用。 因此能够顺利使用Ansible 的帮助文档,对我们来说是很有必要的。Ansible 的帮助文档,由它本身提供的命令 ansible-doc 实现。

常用帮助参数

  • 列举出所有的核心模块和附加模块

    # ansible-doc -l
    
  • 查询某个模块的使用方法

    # ansible-doc modulename
    

Example

# ansible-doc yum

4. 常用模块

为了便于演示和操作,现在把之前的测试主机 IP 172.18.0.3172.18.0.4 保存到 当前目录下的 hosts 文件中。

[root@qfedu.com ~]# cat hosts
[dbservers]
172.18.0.3

[webservers]
172.18.0.4
4. 1 command & shell 模块

两个模块都是在远程服务器上去执行命令。

但command模块是ad-hoc的默认模块,在执行ad-hoc时,若不指定模块的名字则默认使用此模块。

# ansible all -i hosts -a "echo 'hello'"
172.18.0.4 | CHANGED | rc=0 >>
hello
172.18.0.3 | CHANGED | rc=0 >>
hello
# ansible all -i hosts -m shell -a "echo 'hello'"
172.18.0.4 | CHANGED | rc=0 >>
hello
172.18.0.3 | CHANGED | rc=0 >>
hello

两个模块的差异

  • shell 模块可以执行SHELL 的内置命令和 特性(比如管道符)。
  • command 模块无法执行SHELL 的内置命令和特性

Example

# ansible all -i hosts -m shell -a "echo 'hello'|grep -o 'e'"
172.18.0.3 | CHANGED | rc=0 >>
e
172.18.0.4 | CHANGED | rc=0 >>
e
# ansible all -i hosts  -a "echo 'hello'|grep -o 'e'"

172.18.0.4 | CHANGED | rc=0 >>
hello|grep -o e
172.18.0.3 | CHANGED | rc=0 >>
hello|grep -o e
4.2 script 模块

将管理节点上的脚本传递到被管理节点(远程服务器)上进行执行。

Example

管理节点上的一个脚本

# cat /root/a.sh
touch /tmp/testfile

执行

[root@qfedu.com ~]# ansible webservers -i hosts -m script -a "/root/a.sh"
172.18.0.4 | CHANGED => {
    "changed": true,
    "rc": 0,
    "stderr": "Shared connection to 172.18.0.4 closed.\r\n",
    "stderr_lines": [
        "Shared connection to 172.18.0.4 closed."
    ],
    "stdout": "",
    "stdout_lines": []
}

验证

[root@qfedu.com ~]# ansible webservers -i hosts -m shell -a "ls -l /tmp/testfile"
172.18.0.4 | CHANGED | rc=0 >>
-rw-r--r-- 1 root root 0 Apr 12 07:17 /tmp/testfile
4.3 copy 模块

copy 模块的主要用于管理节点和被管理节点之间的文件拷贝。

常用参数:

  • src 指定拷贝文件的源地址

  • dest 指定拷贝文件的目标地址

  • owner 指定新拷贝文件的所有者

  • group 指定新拷贝文件的所有组

  • mode 指定新拷贝文件的权限

  • backup 拷贝文件前,若原目标文件发生了变化,则对目标文件进行备份

Example

  • copy 管理节点上的 nginx.repo 到被管理节点上
# cat nginx.repo
[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
ansible webservers -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo"
  • copy 前, 对被管理节点上原文件进行备份
# ansible all -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo backup=yes"
  • copy 文件的同时对文件进行用户及用户组设置
# ansible all -i hosts -m copy -a "src=./nginx.repo  dest=/etc/yum.repos.d/nginx.repo owner=nobody group=nobody"
  • copy 文件的同时对文件进行权限设置
# ansible all -i hosts -m copy -a "src=./nginx.repo dest=/etc/yum.repos.d/nginx.repo mode=0755"
4.4 yum 模块

等同于 Linux 上的YUM 命令, 对远程服务器上RPM包进行管理。

常用参数:

  • name 要安装的软件包名, 多个软件包以英文逗号(,) 隔开
  • state 对当前指定的软件安装、移除操作(present installed latest absent removed)
    支持的参数
    - present 确认已经安装,但不升级
    - installed 确认已经安装
    - latest 确保安装,且升级为最新
    - absent 和 removed 确认已移除

Example

  • 安装一个软件包

    # ansible webservers -i hosts -m yum -a "name=nginx state=present"
    # ansible webservers -i hosts -m yum -a "name=nginx state=installed"
    # ansible webservers -i hosts -m yum -a "name=nginx state=latest"
    
    
  • 移除一个软件包

    # ansible webservers -i hosts -m yum -a "name=nginx state=absent"
    # ansible webservers -i hosts -m yum -a "name=nginx state=removed"
    
  • 安装一个软件包组

    # ansible webservers -i hosts -m yum -a "name='@Development tools' state=present"
    
4.5 systemd 模块

Centos6 之前的版本使用 service 模块。

请使用 ansible-doc service 命令自行查看帮助信息。

管理远程节点上的 systemd 服务,就是由 systemd 所管理的服务。

常用参数:

  • daemon_reload 重新载入 systemd,扫描新的或有变动的单元
  • enabled 是否开机自启动 yes|no
  • name 必选项,服务名称 ,比如 httpd vsftpd
  • state 对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded)

Example

  • 重新加载 systemd
# ansible webservers -i hosts -m systemd -a "daemon_reload=yes"
  • 启动 Nginx 服务
# ansible webservers -i hosts -m systemd -a "name=nginx state=started"
  • 关闭 Nginx 服务
# ansible webservers -i hosts -m systemd -a "name=nginx state=stopped"
  • 重启 Nginx 服务
# ansible webservers -i hosts -m systemd -a "name=nginx state=restarted"
  • 重新加载 Nginx 服务
# ansible webservers -i hosts -m systemd -a "name=nginx state=reloaded"
  • 将 Nginx 服务设置开机自启动
# ansible webservers -i hosts -m systemd -a "name=nginx enabled=yes"
4.6 group 模块

在被管理节点上,对组进行管理。

常用参数:

  • name 组名称, 必须的
  • system 是否为系统组, yes/no , 默认是 no
  • state 删除或这创建,present/absent ,默认是present

Example

  • 创建普通组 db_admin
# ansible dbservers -i hosts -m group -a "name=db_admin"
4.7 user 模块

用于在被管理节点上对用户进行管理。

常用参数:

  • name 必须的参数, 指定用户名

  • password 设置用户的密码,这里接受的是一个加密的值,因为会直接存到 shadow, 默认不设置密码

  • create_home 在创建用户时,是否创建其家目录。默认创建,假如不创建,设置为 no。2.5版本之前使用 createhome

  • group 设置用户的主组

  • groups 将用户加入到多个其他组中,多个用逗号隔开。

                        默认会把用户从其他已经加入的组中删除。
    
  • append 可选值:yes|no, 需要和 groups 配合使用,yes 时,不会把用户从其他已经加入的组中删除

  • state 删除或添加用户, present 为添加,absent 为删除;默认值 present

  • remove 当与 state=absent 一起使用,删除一个用户及关联的目录,比如家目录,邮箱目录。可选的值为: yes 或者 no

Example

  • 创建用户并设置密码

    先生成加密密码

    [root@qfedu.com ~]# pass=$(echo "123456" | openssl passwd -1 -stdin)
    

    执行 ansible 命令 创建用户 foo 并设置密码

    # ansible all -i hosts -m user -a "name=foo password=${pass} state=present"
    
  • 创建用 tom, 并且加入到组 db_admin 中, 不改变用户原有加入的组。

    # ansible dbservers -i hosts -m user -a "name=tom groups=db_admin append=yes"
    

date 命令说明

// 计算 3 小时之后是几点几分
# date +%T -d '3 hours'
// 任意日期的前 N 天,后 N 天的具体日期
# date +%F -d "20190910 1 day"
# date +%F -d "20190910 -1 day"

// 计算两个日期相差天数, 比如计算生日距离现在还有多少天
# d1=$(date +%s -d 20180728)
# d2=$(date +%s -d 20180726)
# echo $(((d1-d2)/86400))
4. 8 file 模块

file 模块主要用于远程主机上的文件操作。

常用参数:

  • owner 定义文件/目录的属主

  • group 定义文件/目录的属组

  • mode 定义文件/目录的权限

  • path 必选项,定义文件/目录的路径

  • recurse 递归的设置文件的属性,只对目录有效 yes 或者 no

  • src 链接(软/硬)文件的源文件路径,只应用于state=link的情况

  • dest 链接文件的路径,只应用于state=link的情况

  • state

    • directory 如果目录不存在,创建目录,比如: state=directory

    • file 文件不存在,则不会被创建,存在则返回文件的信息, 常用于检查文件是否存在。

    • link 创建软链接

    • hard 创建硬链接

    • touch 如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间

    • absent 删除目录、文件或者取消链接文件

Example

// 创建一个文件
# ansible all -i hosts -m file -a "path=/tmp/foo.conf state=touch"
// 改变文件所有者及权限
# ansible all -i hosts -m file -a "path=/tmp/foo.conf owner=nobody group=nobody mode=0644"
// 创建一个软连接
# ansible all -i hosts -m file -a "src=/tmp/foo.conf dest=/tmp/link.conf state=link"
// 创建一个目录
# ansible all -i hosts -m file -a "path=/tmp/testdir state=directory"
// 取消一个连接
# ansible all -i hosts -m file -a "path=/tmp/link.conf state=absent"
// 删除一个文件
# ansible all -i hosts -m file -a "path=/tmp/foo.conf state=absent"
4.9 cron 模块

管理远程节点的CRON 服务。等同于Linux 中的 计划任务。

注意:使用 Ansible 创建的计划任务,是不能使用本地 crontab -e去编辑,否则 Ansible 无法再次操作此计划任务了。

常用参数:

  • name 指定一个cron job 的名字。一定要指定,便于日之后删除。
  • minute 指定分钟,可以设置成(0-59, *, */2 等)格式。 默认是 * , 也就是每分钟。
  • hour 指定小时,可以设置成(0-23, *, */2 等)格式。 默认是 * , 也就是每小时。
  • day 指定天, 可以设置成(1-31, *, */2 等)格式。 默认是 * , 也就是每天。
  • month 指定月份, 可以设置成(1-12, *, */2 等)格式。 默认是 * , 也就是每周。
  • weekday 指定星期, 可以设置成(0-6 for Sunday-Saturday, * 等)格式。默认是 *,也就是每星期。
  • job 指定要执行的内容,通常可以写个脚本,或者一段内容。
  • state 指定这个job的状态,可以是新增(present)或者是删除(absent)。 默认为新增(present)

Example

// 新建一个 CRON JOB 任务
# ansible all -i hosts -m cron -a "name='create new job' minute='0' job='ls -alh > /dev/null'"
// 删除一个 CRON JOB 任务,删除时,一定要正确指定job 的name参数,以免误删除。
# ansible all -i hosts -m cron -a "name='create new job' state=absent" 

登录任何一台管理机验证cron

# crontab -l
#Ansible: create new job
0 * * * * ls -alh > /dev/null
4.10 debug模块

debug 模块主要用于调试时使用,通常的作用是将一个变量的值给打印出来。

常用参数:

  • var 直接打印一个指定的变量的值
  • msg 打印一段可以格式化的字符串

Example

  • 这里是打印出每台主机在 资产清单中的名称,可能是 IP,也可能是 主机名,清单中写什么这里就会显示什么。

    这里 inventory_hostname 就是 ansible 内置的一个变量。

# ansible all -i hosts -m debug -a "var=inventory_hostname"
# ansible all -i hosts -m debug -a "msg='role is {{inventory_hostname}} '"
4.12 lineinfile 模块

在被管理节点上,用正则匹配的方式对目标文件的一行内容修改删除等操作。

如果是在一个文件中把所有匹配到的多行都进行统一处理,请参考replace 模块。

如果想对一个文件进行一次性添加/更新/删除连续多行内容等操作,参考blockinfile模块

常用参数

  • path 被管理节点的目标文件路径, 必须。

  • state 可选值absent 删除 |present 替换(默认值)。

  • regexp 在文件的每一行中查找的正则表达式。

    对于 state=present ,仅找到的最后一行将被替换。

  • line 要在文件中插入/替换的行。需要state=present

  • create 文件不存在时,是否要创建文件并添加内容。yes/no

Example

  • 删除被控节点文件里的某一条内容
# ansible dbservers -i hosts -m lineinfile -a "path=/etc/sudoers regexp='^%wheel' state=absent"
  • 替换某一行
# ansible dbservers -i hosts -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled' state=present"
4.13 ini_file 模块

对 ini 风格的配置文件进行修改。

常用参数

  • path 目标文件路径
  • block 文件中被操作的块内容
  • state 块内容如何处理,absent 删除, present 添加/更新(默认值)
ansible all -i hosts -m ini_file -a "path=/root/a.conf section=mysqld option=port value=3306"
[root@ela2 ~]# cat a.conf

[mysqld]
port = 3306

假如存在,则修改

ansible all -i hosts -m ini_file -a "path=/root/a.conf section=mysqld option=port value=3307"

验证

[root@ela2 ~]# cat a.conf

[mysqld]
port = 3307

再次添加一个

ansible all -i hosts -m ini_file -a "path=/root/a.conf section=mysqld option=enable value='1'"

验证

[root@ela2 ~]# cat a.conf

[mysqld]
port = 3307
enable = 1

安装mysql

#安装wget
[root@zhu ~]# ansible webservers -i /root/hosts -m yum -a "name=wget state=present"

#安装mysql的yum仓库
[root@zhu ~]# ansible webservers -i /root/hosts -a "wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm"
[root@zhu ~]# ansible webservers -i /root/hosts -a "rpm -ivh mysql80-community-release-el7-3.noarch.rpm"
[root@zhu ~]# ansible webservers -i /root/hosts -m yum -a "name=yum-utils state=present"

#配置yum源
[root@zhu ~]# ansible webservers -i /root/hosts -m ini_file -a "path=/etc/yum.repos.d/mysql-community.repo section=mysql57-community option=enabled value=1" 
[root@zhu ~]# ansible webservers -i /root/hosts -m ini_file -a "path=/etc/yum.repos.d/mysql-community.repo section=mysql80-community option=enabled value=0"

# yum-config-manager --enable mysql57-community 将禁用的yum源库启用
# yum-config-manager --disable mysql80-community 将启用的yum源库禁用

#安装数据库
[root@zhu ~]# ansible webservers -i /root/hosts -m yum -a "name=mysql-community-server state=present"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值