小白带你学习linux自动化运维ansible

news2024/12/23 13:21:22

目录

一、为什么要用自动化运维软件

二、自动化运维要注意的方面

1、管理机与被管理机之间的连接方式

2、服务器分组(主机清单)

3,、自动化运维的管理分类

三、常见的开源自动化运维软件

1、puppet

2、saltstack

3、ansible

四、自动化运维软件一般安装在哪

五、ansible主机清单

六、ansible模块

1、hostname

2、file

3、stat

4、copy

5、fetch

6、template

7、user

8、group

9、cron

10、yum_repositroy

11yum

12、service

13、script

14、command与shell

七、ansible编排

1、playbook

2、playbook相比于shell的优点

3、roles

八、实验

1、ansible搭建

2、静态IP和主机名及主机名互相绑定

3、ansible模块

3.1查看所有支持的模块

file模块(重点)

stat模块(了解)

copy模块(重点)

fetch模块

user模块

group模块

cron模块

yum_repository模块

yum模块(重点)

service模块(重点)

script模块

command与shell模块

九、playbook

1、YAML格式

2、playbook实例

4、Playbook常见语法

案例: playbook编排vsftpd

5、roles(难点)

6、通过roles实现lamp


Ansible是一种基于开源的自动化运维工具,可以帮助简化IT基础设施管理和应用程序的配置、部署和管理。它具有以下特点和优势:

简单易用:Ansible使用简单的YAML语法来定义配置和任务,无需编写复杂的脚本或程序。它易于理解和上手,使得自动化运维变得简单而直观。

基于SSH协议:Ansible使用SSH协议来与远程主机进行通信,无需在远程主机上安装任何额外的代理程序。这使得Ansible在安全性和兼容性方面有很好的表现,可以管理各种类型的主机和设备。

一、为什么要用自动化运维软件

因为服务器特别多的情况下,我们需要比shell更高效的管理工具

二、自动化运维要注意的方面

1、管理机与被管理机之间的连接方式

2、服务器分组(主机清单)

3,、自动化运维的管理分类

文件目录管理

用户与组管理

软件安装与卸载

服务启停与开机自启动

三、常见的开源自动化运维软件

1、puppet

基于ruby开发

2、saltstack

安装方便,需要维护管理机与被管理机的连接,走的zeromq协议。

优点: 管理机器多,速度快, 效率高

基于python开发

3、ansible

安装与连接方便,直接走ssh协议。

缺点: 管理机器特别多,效率较低

基于python开发

四、自动化运维软件一般安装在哪

 一般安装在跳板机(堡垒机)整合使用

五、ansible主机清单

目的: 对管理的多台服务器进行分组

六、ansible模块

1、hostname

2、file

创建目录,普通文件,软硬链接

修改文件属性

删除文件

3、stat

4、copy

从本地把文件拷贝到远程机器并覆盖

应用:    主要用于统一修改配置文件

5、fetch

6、template

7、user

8、group

9、cron

10、yum_repositroy

11yum

安装与卸载rpm包

12、service

启停服务与开机是否自启动

13、script

远程执行本地脚本

14、command与shell

远程执行命令

七、ansible编排

1、playbook

使用YAML格式

2、playbook相比于shell的优点

幂等性

步骤与错误可视化

跨平台(因为基于python)

3、roles

类似开发语言的函数,将代码与功能封装,方便复用

八、实验

1、ansible搭建

实验准备:三台机器,一台管理两台被管理

2、静态IP和主机名及主机名互相绑定

hostnamectl set-hostname hd1

vim /etc/hosts


cat /etc/hosts



#hd2和hd3 同上类似操作

关闭防火墙, selinux和时间同步

yum -y install epel-release

yum -y install ntp

systemctl stop firewalld

systemctl restart ntpd

systemctl enable ntpd 

#监控机安装ansible

yum install ansible

ansible --version

第2步: 实现master对agent的免密登录,只在master上做。(如果这一步不做,则在后面操作agent时都要加-k参数传密码;或者在主机清单里传密码)

 ssh-keygen

 ssh-copy-id -i 192.168.28.6

 ssh-copy-id -i 192.168.28.7

第3步:在master上定义主机组,并测试连接性

vim /etc/ansible/hosts 

ansible -m ping webserver


ansible -m ping all

服务器分组

ansible通过一个主机清单功能来实现服务器分组。

Ansible的默认主机清单配置文件为/etc/ansible/hosts.

示例:

[nginx]                    组名
apache[1:10].aaa.com    表示apache1.aaa.com到apache10.aaa.com这10台机器
nginx[a:z].aaa.com        表示nginxa.aaa.com到nginxz.aaa.com共26台机器
10.1.1.[11:15]            表示10.1.1.11到10.1.1.15这5台机器

vim /etc/ansible/hosts 

ansible -m ping webserver

示例:

[nginx]
10.1.1.13:2222            表示10.1.1.13这台,但ssh端口为2222

vim /etc/ssh/sshd_config 

systemctl restart sshd

netstat -anptu |grep :2222

这是在被管理机2上面的操作

回管理机

vim /etc/ansible/hosts 


 ansible -m ping nginx1

示例: 利用别名来分组

 vim /etc/ansible/hosts 


nginx1 ansible_ssh_host=192.168.28.6 ansible_ssh_port=2222
nginx2   ansible_ssh_host=192.168.28.7
[web]
nginx1
nginx2



 ansible -m ping web

小结:

主机清单的作用: 服务器分组。

主机清单的常见功能:

可以通过IP范围来分, 主机名名字的范围来分

如果ssh端口不是22的,可以传入新的端口。

没有做免密登录,可以传密码。

不论你用哪种环境(免密或不免密,端口是否22), 请最终将两台被管理机器加入到group1组即可

3、ansible模块

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

ansible支持的模块非常的多,我们并不需要把每个模块都记住,而只需要熟悉一些常见的模块,其它的模块在需要用到时再查询即可。

3.1查看所有支持的模块

ansible-doc -l	


如果要查看ping模块的用法,使用下面命令(其它模块以此类推)
ansible-doc ping

hostname模块

hostname模块用于修改主机名(注意: 它不能修改/etc/hosts文件)

将其中一远程机器主机名修改为agent1.cluster.com

master# ansible 192.168.28.6  -m hostname -a 'name=agent1.cluster.com'
基本格式为: ansible 操作的机器名或组名 -m 模块名 -a "参数1=值1 参数2=值2" argment

file模块(重点)

file模块用于对文件相关的操作(创建, 删除, 软硬链接等)

创建一个目录 、

ansible web -m file -a "path=/test state=directory"

创建一个文件

 ansible nginx1 -m file -a "path=/test/111 state=touch"

去nginx下查看

递归修改owner,group,mode

 ansible nginx1 -m file -a 'path=/test recurse=yes owner=bin group=daemon mode=1777'

这是一个使用Ansible工具在组名为nginx的主机上执行的命令,以递归方式创建一个名为/test的目录,并将其所有权设置为bin用户、daemon组,并设置其访问权限为1777

删除目录 absent 缺席的(连同目录里的所有文件)

 ansible nginx1 -m file -a 'path=/test state=absent'

创建文件并指定owner,group,mode等

 ansible nginx1 -m file -a "path=/tmp/111 state=touch owner=bin group=daemon mode=1777"

删除文件

 ansible nginx1 -m file -a "path=/tmp/111 state=absent"

创建软链接文件

 ansible nginx1 -m file -a 'src=/etc/fstab path=/tmp/fstab state=link'

创建硬链接文件

ansible nginx1 -m file -a 'src=/etc/fstab path=/tmp/fstab2 state=hard'

stat模块(了解)

stat模块类似linux的stat命令,用于获取文件的状态信息。

 ansible nginx1 -m stat -a 'path=/etc/fstab'

copy模块(重点)

copy模块用于对文件的远程拷贝操作(如把本地的文件拷贝到远程的机器上)

在master上准备一个文件,拷贝此文件到web的所有机器上

echo master >/tmp/222

cat /tmp/222

ansible web -m copy -a 'src=/tmp/222 dest=/root/333'

使用content参数直接往远程文件里写内容(会覆盖原内容)

注意:ansible中-a后面的参数里也有引号时,记得要单引双引交叉使用,如果都为双引会出现问题

 ansible web -m copy -a 'content="server\n" dest=/root/333'



去nginx1和nginx2上看


cat 333 

使用force参数控制是否强制覆盖

如果目标文件已经存在,则不覆盖
 ansible web -m copy -a 'src=/tmp/222 dest=/tmp/333 force=no'

 ansible web -m copy -a 'src=/tmp/222 dest=/tmp/333 force=no'


如果目标文件已经存在,则会强制覆盖
 ansible web -m copy -a 'src=/tmp/222 dest=/tmp/333 force=yes'

 ansible web -m copy -a 'src=/tmp/222 dest=/tmp/333 force=yes'

使用backup参数控制是否备份文件

backup=yes表示如果拷贝的文件内容与原内容不一样,则会备份一份
web的机器上会将/tmp/333备份一份(备份文件命名加上时间),再远程拷贝新的文件为/tmp/333

 ansible web -m copy -a 'src=/etc/fstab dest=/tmp/333 backup=yes owner=daemon group=daemon mode=1777'

copy模块拷贝时要注意拷贝目录后面是否带"/"符号

/etc/yum.repos.d后面不带/符号,则表示把/etc/yum.repos.d整个目录拷贝到/tmp/目录下
 

 ansible nginx1 -m copy -a 'src=/etc/yum.repos.d dest=/tmp/'


/etc/yum.repos.d/后面带/符号,则表示把/etc/yum.repos.d/目录里的所有文件拷贝到/tmp/目录下

 ansible nginx1 -m copy -a 'src=/etc/yum.repos.d/ dest=/tmp/'

练习: 在master上配置好所有的yum源,然后拷贝到group1的远程机器上(要求目录内的内容完全一致)

删除yum.repo.d
ansible web -m file -a "path=/etc/yum.repos.d/ state=absent"

添加yum.repo.d
ansible web -m copy -a "src=/etc/yum.repos.d dest=/etc/"

fetch模块

fetch模块与copy模块类似,但作用相反。用于把远程机器的文件拷贝到本地。

第1步: 在两台被管理机上分别创建一个同名文件(但内容不同)

agent1# echo agent1 > /tmp/1.txt
agent2# echo agent2 > /tmp/1.txt

第2步: 从master上fecth文件(因为group1里有2台机器,为了避免同名文件文件冲突,它使用了不同的目录)

 ansible web -m fetch -a 'src=/tmp/1.txt dest=/tmp/'

第3步: 先删除上面fetch过来的, 然后尝试只fetch其中一台机器的,也会使用名称来做子目录区分

rm /tmp/192.168.28.* -rf

ansible 192.168.28.6 -m fetch -a 'src=/tmp/1.txt dest=/tmp/'

注意: fetch模块不能从远程拷贝目录到本地

user模块

user模块用于管理用户账号和用户属性。

创建aaa用户,默认为普通用户,创建家目录

ansible web -m user -a 'name=aaa state=present'

客户机
cat /etc/passwd |grep aaa

创建bbb系统用户,并且登录shell环境为/sbin/nologin

ansible web -m user -a 'name=bbb state=present system=yes  shell="/sbin/nologin"'


 cat /etc/passwd |grep bbb

创建ccc用户, 使用uid参数指定uid, 使用password参数传密码

echo 123456 | openssl passwd -1 -stdin


下一句命令注意一下格式,密码要用双引号引起来,单引号的话验证时会密码不正确

 ansible web -m user -a 'name=ccc uid=2000 state=present password="$1$WDVnVIw9$eSYf4wXr3YUDnsoQA6OaP1"'

创建一个普通用户叫hadoop,并产生空密码 密钥对

ansible nginx1 -m user -a 'name=hadoop generate_ssh_key=yes'

删除aaa用户,但家目录默认没有删除

ansible nginx1 -m user -a 'name=aaa state=absent'


cd /home/


ls

删除bbb用户,使用remove=yes参数让其删除用户的同时也删除家目录

ansible nginx1 -m user -a 'name=bbb state=absent remove=yes'


ls

group模块

group模块用于管理用户组和用户组属性。

创建组

ansible web -m group -a "name=group gid=3000 state=present"

除组(如果有用户的gid为此组,则删除不了)

 ansible web -m group -a "name=group state=absent"

cron模块

cron模块用于管理周期性时间任务

创建一个cron任务,不指定user的话,默认就是root(因为我这里是用root操作的)。 如果minute,hour,day,month,week不指定的话,默认都为*

这是每两分钟穿件一个文件
 ansible web -m cron -a "name='test cron1' user=root job='touch/opt/111 ' minute=*/2"


每小时的30分钟创建一次、

ansible web -m cron -a "name='test cron2' user=root job='touch/opt/222 ' minute=30"


ansible:Ansible命令行工具。
web:在你的Ansible inventory文件中定义的主机组名。这指定了命令将在哪些主机上运行。
-m cron:要使用的Ansible模块。在这里,使用的是"cron"模块,该模块允许您管理cron定时任务。
-a "name='test cron2' user=root job='touch /opt/222' minute=30 hour=*/2":这是使用cron模块的参数。它指定了要创建的定时任务的名称("test cron2"),执行任务的用户(root),要执行的命令(touch /opt/222),以及任务的时间表(每小时的30分钟执行一次)。
因此,这个命令会在名为"web"的主机上配置一个名为"test cron2"的定时任务,以root用户的身份,在每两个小时的30分钟执行一次"touch /opt/222"命令。

 ansible web -m cron -a "name='test cron2' user=root job='touch/opt/222 ' minute=30 hour=*/2"

yum_repository模块

yum_repository模块用于配置yum仓库。

增加一个/etc/yum.repos.d/local.repo配置文件

ansible nginx1 -m yum_repository -a "name=local description=localyum baseurl=fole:///mnt/ enabled=yes gpgcheck=no"

注意:此模块只帮助配置yum仓库,但如果仓库里没有软件包,安装一样会失败。所以可以手动去挂载光驱到/mnt目录

删除/etc/yum.repos.d/local.repo配置文件

 ansible nginx1 -m yum_repository -a "name=local state=absent"

yum模块(重点)

yum模块用于使用yum命令来实现软件包的安装与卸载。

用yum安装一个软件(前提:group1的机器上的yum配置都已经OK)

使用yum安装httpd,httpd-devel软件,state=latest表示安装最新版本

ansible nginx1 -m yum -a "name=httpd,httpd-devel state=present"

使用yum卸载httpd,httpd-devel软件

 ansible nginx1 -m yum -a "name=httpd,httpd-devel state=absent"

、使用yum安装一个软件(前提:group1的机器上的yum配置都已经OK)

 ansible nginx1 -m yum -a "name=vsftpd state=present"

service模块(重点)

service模块用于控制服务的启动,关闭,开机自启动等。

启动vsftpd服务,并设为开机自动启动

 ansible nginx1 -m service -a "name=vsftpd state=started enabled=no"

关闭vsftpd服务,并设为开机不自动启动

 ansible nginx1 -m service -a "name=vsftpd state=stopped enabled=false"

script模块

script模块用于在远程机器上执行本地脚本。

在master上准备一个脚本

vim 1.sh

#!/bin/bash
mkdir /opt/111
touch /opy/hahah{1..10}

在nginx1的远程机器里都执行master上的1.sh脚本(此脚本不用给执行权限)
ansible group1 -m script -a '/1.sh'

ansible nginx1 -m script -a "/root/1.sh"

扩展: 使用shell脚本实现在nginx1的被管理机里的mariadb里创建一个abc库

#!/bin/bash

yum install mariadb-server -y  &> /dev/null

systemctl start mariadb
systemctl enable mariadb

mysql << EOF
create database abc;
quit
EOF

把上面的脚本使用script模块在web被管理机里执行即可

command与shell模块

两个模块都是用于执行linux命令的,这对于命令熟悉的工程师来说,用起来非常high。

shell模块与command模块差不多(command模块不能执行一些类似$HOME,>,<,|等符号,但shell可以)

ansible -m command nginx2 -a "useradd user2"

ansible -m command nginx2 -a "id user2"

ansible -m command nginx2 -a "cat /etc/passwd |wc -l"


 ansible -m shell nginx2 -a "cat /etc/passwd |wc -l"

注意: shell模块并不是百分之百任何命令都可以,比如vim或ll别名就不可以。不建议大家去记忆哪些命令不可以,大家只要养成任何在生产环境里的命令都要先在测试环境里测试一下的习惯就好。

九、playbook

playbook(剧本): 是ansible用于配置,部署,和管理被控节点的剧本。用于ansible操作的编排。

使用的格式为yaml格式(saltstack,elk,docker,docker-compose,kubernetes等也都会用到yaml格式)

1、YAML格式

以.yaml或.yml结尾

文件的第一行以 "---"开始,表明YMAL文件的开始(可选的)

以#号开头为注释

列表中的所有成员都开始于相同的缩进级别, 并且使用一个 "- " 作为开头(一个横杠和一个空格)

一个字典是由一个简单的 键: 值 的形式组成(这个冒号后面必须是一个空格)

==注意: 写这种文件不要使用tab键,都使用空格==

下面看一个官方的示例感受一下

---
# 一位职工记录
name: Example Developer
job: Developer
skill: Elite
employed: True
foods:
    - Apple
    - Orange
    - Strawberry
    - Mango
languages:
    ruby: Elite
    python: Elite
    dotnet: Lame

2、playbook实例

先直接来看一个实例

第1步: 创建一个存放playbook的目录(路径自定义)

master# mkdir /etc/ansible/playbook

第2步: 准备httpd配置文件,并修改成你想要的配置

master# yum install httpd -y


按需要修改你想要的配置(为了测试可以随意改动标记一下)

master# vim /etc/httpd/conf/httpd.conf

第3步: 写一个playbook文件(后缀为.yml或.yaml)

# vim /etc/ansible/playbook/example.yaml
---
- hosts: nginx2
  remote_user: root
  tasks:  
  - name: ensure apache is at the latest version    
    yum: name=httpd,httpd-devel state=latest
    
  - name: write the apache config file        
    copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
    
    notify:
    - restart apache
    
  - name: ensure apache is running (and enable it at boot)
    service: name=httpd state=started enabled=yes
    
  handlers:    
    - name: restart apache
      service: name=httpd state=restarted

第4步: 执行写好的palybook

会显示出执行的过程,并且执行的每一步都有ok,changed,failed等标识

执行如果有错误(failed)会回滚,解决问题后,直接再执行这条命令即可,并会把failed改为changed(幂等性)

ansible-playbook /etc/ansible/playbook/example.yaml

端口修改完成

4、Playbook常见语法

hosts: 用于指定要执行任务的主机,其可以是一个或多个由冒号分隔主机组.

remote_user: 用于指定远程主机上的执行任务的用户.

- hosts: nginx2            
  remote_user: root    

tasks: 任务列表, 按顺序执行任务.

如果一个host执行task失败, 整个tasks都会回滚, 修正playbook 中的错误, 然后重新执行即可.

tasks:
  - name: ensure apache is at the latest version    
    yum: name=httpd,httpd-devel state=latest
    
  - name: write the apache config file        
    copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf

handlers: 类似task,但需要使用notify通知调用。

不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次.

handlers最佳的应用场景是用来重启服务,或者触发系统重启操作.除此以外很少用到了.

 notify:                  
    - restart apache
    
  - name: ensure apache is running (and enable it at boot)
    service: name=httpd state=started enabled=yes
    
  handlers:
  - name: restart apache
    service: name=httpd state=restarted

variables: 变量

定义变量可以被多次方便调用

vim /etc/ansible/playbook/example2.yaml
 

---
- hosts: web
  remote_user: root
  vars:
  - user1: test3
  - user2: test4
  tasks:
  - name: create two account
    shell: useradd "{{user1}}"
  - name: create two account
    command: useradd "{{user2}}"

 ansible-playbook /etc/ansible/playbook/example2.yaml 
 


案例: playbook编排vsftpd

写一个playbook实现

配置yum

安装vsftpd包

修改配置文件(要求拒绝匿名用户登录)

启动服务并实现vsftpd服务开机自动启动

本机安装vsftpd开始写脚本


 

---
- hosts: nginx1
  remote_user: root
  tasks:
  - name: rm yum repository
    file: path=/etc/yum.repos.d/ state=absent

  - name: 同步master上的yum源到group1
    copy: src=/etc/yum.repos.d dest=/etc/

  - name: ensure vsftpd is at the latest version
    yum: name=vsftpd state=latest

  - name: write the apache config file
    copy: src=/etc/vsftpd/vsftpd.conf dest=/etc/vsftpd/vsftpd.conf

    notify:
    - restart vsftpd

  - name: ensure vsftpd is running (and enable it at boot)
    service: name=vsftpd state=started enabled=yes

  handlers:
  - name: restart vsftpd

**playbook编排多个hosts任务**

---                     # ---代表开始(可选项,不写也可以)
- hosts: nginx1
  remote_user: root
  tasks:
  - name: 创建/test1/目录
    file: path=/test1/ state=directory
# 这里不能用---分隔,会报语法错误(后面课程玩k8s编排也写YAML文件,是可以用--->来分隔段落的)
- hosts: nginx2
  remote_user: root
  tasks:
  - name: 创建/test2/目录
    file: path=/test2/ state=directory
...                     # ...代表结束(可选项,不写也可以)
 

ansible-playbook /etc/ansible/playbook/2.hosts 

5、roles(难点)

roles介绍

roles(角色): 就是通过分别将variables, tasks及handlers等放置于单独的目录中,并可以便捷地调用它们的一种机制。

假设我们要写一个playbook来安装管理lamp环境,那么这个playbook就会写很长。所以我们希望把这个很大的文件分成多个功能拆分, 分成apache管理,php管理,mysql管理,然后在需要使用的时候直接调用就可以了,以免重复写。就类似编程里的模块化的概念,以达到代码复用的效果。

files:用来存放由copy模块或script模块调用的文件。
tasks:至少有一个main.yml文件,定义各tasks。
handlers:有一个main.yml文件,定义各handlers。
templates:用来存放jinjia2模板。
vars:有一个main.yml文件,定义变量。
meta:有一个main.yml文件,定义此角色的特殊设定及其依赖关系。

**注意:** 在每个角色的目录中分别创建files, tasks,handlers,templates,vars和meta目录,用不到的目录可以创建为空目录.

6、通过roles实现lamp

需定制三个角色: httpd,mysql,php

第1步: 创建roles目录及文件,并确认目录结构

nginx1 ansible_ssh_host=192.168.28.4 ansible_ssh_port=22
nginx2 ansible_ssh_host=192.168.28.5 ansible_ssh_port=22

[web]

nginx1
nginx2

 

master# cd /etc/ansible/roles/
master# mkdir -p {httpd,mysql,php}/{files,tasks,handlers,templates,vars,meta}
master# touch {httpd,mysql,php}/{tasks,handlers,vars,meta}/main.yml

master# yum install tree -y
master# tree /etc/ansible/roles/

 

/etc/ansible/roles/
├── httpd
│   ├── files
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   │   └── main.yml
│   ├── tasks
│   │   └── main.yml
│   ├── templates
│   └── vars
│       └── main.yml
├── mysql
│   ├── files
│   ├── handlers
│   │   └── main.yml
│   ├── meta
│   │   └── main.yml
│   ├── tasks
│   │   └── main.yml
│   ├── templates
│   └── vars
│       └── main.yml
└── php
    ├── files
    ├── handlers
    │   └── main.yml
    ├── meta
    │   └── main.yml
    ├── tasks
    │   └── main.yml
    ├── templates
    └── vars
        └── main.yml

第2步: 准备httpd服务器的主页文件,php测试页和配置文件等

master# echo "test main page" > /etc/ansible/roles/httpd/files/index.html


master# echo -e "<?php\n\tphpinfo();\n?>" > /etc/ansible/roles/httpd/files/index.php 


master# yum install httpd -y
按需求修改配置文件后,拷贝到httpd角色目录里的files子目录
master# vim /etc/httpd/conf/httpd.conf
master# cp /etc/httpd/conf/httpd.conf /etc/ansible/roles/httpd/files/

第3步: 编写httpd角色的main.yml文件

 vim /etc/ansible/roles/httpd/tasks/main.yml

---
- name: 安装httpd
  yum: name=httpd,httpd-devel state=present

- name: 同步httpd配置文件
  copy: src=/etc/ansible/roles/httpd/files/httpd.conf dest=/etc/httpd/conf/httpd.conf

  notify: restart httpd

- name: 同步主页文件
  copy: src=/etc/ansible/roles/httpd/files/index.html dest=/var/www/html/index.html

- name: 同步php测试页
  copy: src=/etc/ansible/roles/httpd/files/index.php dest=/var/www/html/index.php

- name: 启动httpd并开机自启动
  service: name=httpd state=started enabled=yes
 

第4步: 编写httpd角色里的handler

[root@master tasks]# vim /etc/ansible/roles/httpd/handlers/main.yml
 

---
- name: restart httpd
  service: name=httpd state=restarted

第5步: 编写mysql角色的main.yml文件

vim /etc/ansible/roles/mysql/tasks/main.yml

---
- name: 安装mysql
  yum: name=mariadb,mariadb-server,mariadb-devel state=present

- name: 启动mysql并开机自启动
  service: name=mariadb state=started enabled=yes
 

第6步: 编写php角色的main.yml文件

master# vim /etc/ansible/roles/php/tasks/main.yml

---
- name: 安装php及依赖包
  yum: name=php,php-gd,php-ldap,php-odbc,php-pear,php-xml,php-xmlrpc,php-mbstring,php-snmp,php-soap,curl,curl-devel,php-bcmath,php-mysql state=present

  notify: restart httpd
 

第7步:编写lamp的playbook文件调用前面定义好的三个角色

master执行

 vim lamp.yaml

---
- hosts: nginx1
  remote_user: root
  roles:
    - httpd
    - mysql
    - php


 ansible-playbook /root/lamp.yaml 


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

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

相关文章

【栈与队列面试题】有效的括号(动图演示)

leetcode20.括号匹配问题 前言&#xff1a; &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388;&#x1f4a5; ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上栈与队列的面试OJ题目 目录 leetcode20.括号匹配问题 1.问题描…

2023-9-12 多重背包问题(二)

题目链接&#xff1a;多重背包问题 II #include <iostream> #include <algorithm>using namespace std;const int N 12010, M 2010;int n, m; int v[N], w[N]; int f[M];int main() {cin >> n >> m;// 最后一共转换成多少个物品int cnt 0;for(int i…

Rust通用编程概念(3)

Rust通用编程概念 1.变量和可变性1.执行cargo run2.变量3.变量的可变性4.常量5.遮蔽5.1遮蔽与mut区别1.遮蔽2.mut 2.数据类型1.标量类型1.1整数类型1.2浮点数类型1.3数字运算1.4布尔类型1.5字符类型 2.复合类型2.1元组类型2.2数组类型1.访问数组2.无效的数组元素访问 3.函数3.1…

9月12日作业

作业代码 #include <iostream>using namespace std;class Shape { protected:double cir;double area; public://无参构造Shape() {cout<<"无参构造"<<endl;}//有参构造Shape(double c, double a):cir(c), area(a){cout<<"有参构造&quo…

Maven Helper mvn项目冲突如何解决

一般用这款插件来查看maven的依赖树。 一、安装&#xff1a; File-->setting--->Plugins--->在搜索框中填写Maven Helper然后搜索&#xff0c;单击Install按钮进行安装&#xff0c;装完重启IDE。 二、使用 当Maven Helper 插件安装成功后&#xff0c;打开项目中的p…

【算法基础】时间复杂度和空间复杂度

目录 1 算法的评价 2 算法复杂度 2.1 时间复杂度&#xff08;Time Complexity&#xff09; 2.1.1 如何计算时间复杂度&#xff1a; 2.1.2 常见的时间复杂度类别与示例 2.2 空间复杂度 2.2.1 如何计算空间复杂度 2.2.2 常见的空间复杂度与示例 3 时间复杂度和空间复杂度…

docker 部署 node.js(express) 服务

1、在 express 项目根目录下新增 Dockerfile 文件&#xff0c;内容如下&#xff1a; 创建服务容器的方法&#xff0c;可以根据自己的情况选择&#xff1a; 1、以下示例为宿主机没有安装 node 环境的写法&#xff1b; 2、先在本地构建包含 node 和 express 的基础镜像&#xff0…

【C++】day5学习成果:继承和六个特殊成员函数的代码应用、静态成员 继承 类的关系模型 类的继承步骤的思维导图。

1.代码题&#xff1a;实现一个图形类&#xff08;Shape&#xff09;&#xff0c;包含受保护成员属性&#xff1a;周长、面积&#xff0c; 公共成员函数&#xff1a;特殊成员函数书写 定义一个圆形类&#xff08;Circle&#xff09;&#xff0c;继承自图形类&#xff0c;包含私有…

STC15/8单片机特有的PWM寄存器和普通定时器实现PWM输出

STC15/8单片机特有的PWM寄存器和普通定时器实现PWM输出 🌿主要针对STC15W4型号特有的6通道15位专门的高精度PWM。 🌿STC8系列 ✨STC15W4K32S4系列单片机具有6通道15位专门的高精度PWM(带死区控制)和2通道CCP(利用它的高速脉冲输出功能可实现11~16位PWM);(STC15F/L2K60S2系…

JAVA8接口使用问题

JAVA8接口使用问题 文章目录 JAVA8接口使用问题1、默认方法冲突问题&#xff08;1&#xff09;亲爹优先原则&#xff08;2&#xff09;左右为难 2、常量冲突问题 1、默认方法冲突问题 &#xff08;1&#xff09;亲爹优先原则 当一个类&#xff0c;既继承一个父类&#xff0c;…

助力智能化公路养护,基于YOLOv5s集成SPD-BIFPN-SE开发构建公路开裂检测识别系统

在前文中我们尝试构建了在隧道、涵洞尝尽下的自动智能化养护巡查相关的模型&#xff0c;进行了实地测试评估&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《基于轻量级YOLOv5s开发构建隧道基建裂痕、脱落等缺陷问题检测系统》 本文的想法是相近的&#xff0c;核心…

Linkerd2初探

Linkerd2初探 部署环境Linkerd简介安装Linkerd客户端在k8s上安装Linkerd控制平面&#xff08;服务端&#xff09;实验&#xff1a;数据平面代理注入demo应用安装viz插件&#xff08;可视化面板&#xff09;部署grafana 其他 部署环境 k8s环境: KIND 模拟kubernetes 1.21.1 kub…

页面设计都有哪些好用的工具推荐?

对于设计师来说&#xff0c;方便的页面设计工具和稳定的页面设计灵感也同样重要。 在今天的信息爆炸中&#xff0c;很容易找到页面设计工具&#xff0c;网上搜索有很多建议&#xff0c;但找到合适的页面设计工具并不那么简单。 本文推荐不容错过的9款页面设计工具 即时设计 …

【DevOps核心理念基础】3. 敏捷开发最佳实践

一、敏捷开发最佳实践 1.1 项目管理 1.2 需求管理 1.3 技术架构 1.4 技术开发 1.5 测试 二、敏捷开发最佳实践 2.1 敏捷开发的执行细节 三、全面的DevOps工具链 四、版本控制和协作开发工具 4.1 集中式版本控制工具 4.2 分布式版本控制工具 一、敏捷开发最佳实践 …

mysql的一些知识点或者说踩过的坑和想记住的内容

快速上传数据 这个应该是比inset into values更快的插入数据的办法了。 不过要求挺苛刻的&#xff0c;数据要整理成和表格一致&#xff0c;也就是说每条数据都是完整的一条&#xff0c;而不是一部分。 下面的示例我以***为分割符划分字段&#xff0c;以 \n来分割每条数据。 LO…

【atoi函数的功能介绍及使用与模拟实现——超详细版本】

atoi函数的功能介绍及使用与模拟实现——超详细版本 1.cplusplus网站介绍&#x1f4bb; 1.1atoi函数的功能介绍&#x1f4bb; 它的功能&#xff1a; 解析将其内容解释为整数的 C 字符串&#xff0c;该整数作为 类型的值返回。 该函数首先根据需要丢弃尽可能多的空格字符&…

java复习-eclipse开发工具使用

开发工具使用 项目文件结构 建立完成的项目目录中会自动创建有两个子目录&#xff1a; src&#xff1a;保存所有的 *.java 源文件bin&#xff1a;保存所有编译后的 *.class 程序文件&#xff0c;这些文件会自动进行编译处理 保存文件后&#xff0c;会自动进行编译。 快捷键…

无需专业技能,轻松创建个人博客:Cpolar+Emlog在Ubuntu上的搭建指南

文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总结 前言 博客作为使…

基于轻量级YOLOv5s开发构建隧道基建裂痕、脱落等缺陷问题检测系统

隧道内的定期检查与维护&#xff0c;对于及时发现和消除潜在的安全隐患有着重要的作用&#xff0c;基于人工的传统巡查方式不仅极为低效而且成本很高&#xff0c;将智能化的图像检测识别计数与实际的养护巡查场景相结合&#xff0c;开发构建智能AI检测识别系统是否可行&#xf…

C++QT day 5

实现一个图形类&#xff08;Shape&#xff09;&#xff0c;包含受保护成员属性&#xff1a;周长、面积&#xff0c; 公共成员函数&#xff1a;特殊成员函数书写 定义一个圆形类&#xff08;Circle&#xff09;&#xff0c;继承自图形类&#xff0c;包含私有属性&#xff1a;半…