这里写自定义目录标题
一、 Ansible介绍
Ansible 是一种 IT 自动化工具。它可以配置管理,部署软件以及协调更高级的 IT 任务, 例如持续部署,滚动更新。 Ansible 适用于管理企业 IT 基础设施,从 几十台到上百台的服务器环境。Ansible 也是一种简单的自动化语言,可以完美 地描述 IT 应用程序基础结构。
官方文档:https://docs.ansible.com
ansible是一种由Python开发的自动化运维工具,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
特点:
- 部署简单
- 默认使用ssh进行管理,基于python里的paramiko模块开发
- 管理端和被管理端不需要启动服务
- 配置简单,功能强大,扩展性强
- 能过playbook(剧本)进行多个任务的编排
二、特点
简单 – 减少学习成本
• 易读的描述语言
• 无需特殊编码技能
• 任务按顺序执行
强大 – 协调应用程序生命周期
• 应用部署
• 配置管理
• 工作流程编排
无代理 – 可预测,可靠和安全
• 无代理架构
• 使用 OpenSSH 通信
• 没有代理维护成本
三、架构
四、核心组件
Inventory:Ansible 管理的主机信息,包括 IP 地址、 SSH 端口、账号、密码 等;
• Modules:任务均有模块完成,也可以自定义模块,例如经常用的脚本;
• Plugins:使用插件增加Ansible 核心功能,自身提供了很多插件, 也可以自
定义插件。例如 connection 插件, 用于连接目标主机。 callback 插件可以将 结果输出到其他地方。vars 插件将定义的比变量注入到Ansible 中运行。
• Playbooks:“剧本”,模块化定义一系列任务,供外部统一调用。Ansible 核心功能。
五、认识自动化运维
问题:
假设我要去1000台服务上做一个操作(如nginx服务器修改配置文件里的某一个参数), 下面两种方法缺点明显:
-
按传统的方法, 一台连着一台服务器的ssh上去手动操作。
缺点:
- 效率太低。
-
写个shell脚本来做。
缺点:
-
管理的机器平台不一致,脚本可能不具备通用性。
-
传密码麻烦(在非免密登录的环境下, 需要expect来传密码)
-
效率较低,循环1000次也需要一个一个的完成,如果用
&
符放到后台执行,则会产生1000个进程。
-
自动化运维: 将日常IT运维中大量的重复性工作,小到简单的日常检查、配置变更和软件安装,大到整个变更流程的组织调度,由过去的手工执行转为自动化操作,从而减少乃至消除运维中的延迟,实现“零延时”的IT运维。
六、主要关注的方面
假如管理很多台服务器,主要关注以下几个方面:
-
管理机与被管理机的连接(管理机如何将管理指令发送给被管理机)
-
服务器信息收集 (如果被管理的服务器有centos7.5外还有其它linux发行版,如suse,ubuntu等。当你要做的事情在不同OS上有所不同,你需要收集信息,并将其分开处理)
-
服务器分组(因为有些时候我要做的事情不是针对所有服务器,可能只针对某一个分组)
-
管理内容的主要分类
-
文件目录管理(包括文件的创建,删除,修改,查看状态,远程拷贝等)
-
用户和组管理
-
cron时间任务管理
-
yum源配置与通过yum管理软件包
-
服务管理
-
远程执行脚本
-
远程执行命令
七、自动化运维工具对比
-
puppet(拓展)
基于ruby语言,成熟稳定。适合于大型架构,相对于ansible和saltstack会复杂些。
-
saltstack(拓展)
基于python语言。相对简单,大并发能力比ansible要好, 需要维护被管理端的服务。如果服务断开,连接就会出问题。
-
ansible
基于python语言。简单快捷,被管理端不需要启服务。直接走ssh协议,需要验证所以机器多的话速度会较慢。
八、Ansible环境搭建
一、实验准备三台机器,一台管理机,两台被管理机
第一台管理机 主机名 hd1 192.168.115.3
第二台被管理机 主机名 hd2 192.168.115.4
第三台被管理机 主机名 hd3 192.168.115.5
所有主机都要配置hosts文件
vim /etc/hosts
二、三台机器的配置
关闭防火墙,图形化,时间同步
systemctl restart ntpd
开机启动
systemctl enable ntpd
三、配置yum源
yum -y install epel-release
管理机上安装ansible
yum install ansible
主服务 输入
ssh-keygen
查看结果
将ssh下的秘钥对分别拷贝到两个被管理服务中
ssh-copy-id -i 192.168.115.4
提示结果如下
来到192.168.115.4 查看验证
同样的方法 上传查看192.168.115.5
ssh-copy-id -i 192.168.115.5
四、更改配置文件并验证
vim /etc/ansible/hosts
ansible -m ping 192.168.115.4
ansible -m ping 192.168.115.5
你Ping ip 他会给你回应一个 Pang
就是 乒乓乒乓 (#.#) !
这里面的验证结果分为三种颜色
绿色说明没有变化
黄色说明更改或者变化成功
红色代表失败
不光只能Ping IP
Ping群组也可以显示成功
ansible -m ping webserver
ansible -m ping all
也可以成功验证
五、主机给主机设置免密
ssh-copy-id -i 192.168.115.3
验证结果
显示成功
批量创建 ip为 115.1 到 115.5 的五台机器
输入
vim /etc/ansible/hosts
进入后更改
ansible -m ping webserver
验证显示三台成功,两台失败
因为只配置了三台机器 分别是 3 4 5
所以 1 2失败
vim /etc/ansible/hosts
进入配置文件更改
到 115.4 更改文件
vim /etc/ssh/sshd_config
将监听端口号改为 2222
重启服务
systemctl restart sshd
查看端口号是否成功启用
netstat -anptu | grep 2222
将 192.168.115.3 这台机器更改别名为nginx1
vim /etc/ansible/hosts
进入后在第一行输入
nginx1 ansible_ssh_host=192.168.115.4 ansible_ssh_port=2222
ping nginx1
ansible -m ping nginx1
如果将配置文件 改为 [web] nginx1 也可以成功ping通
六、ansible模块
查看所有支持的模块
ansible-doc -l
查看ping 模块的使用方法
ansible-doc ping
ansible web -m ping
这个命令是使用Ansible来执行ping模块对名为"web"的主机进行测试连接的操作
七、hostname模块
ansible web -m hostname -a 'name=agent1.com'
八、file模块
一、创建一个目录
注意主机要记得自己给自己做个免密
ssh-copy-id 192.168.115.3
输入命令创建目录
ansible web -m file -a 'path=/test state=directory'
提示三台机器创建成功
二、创建一个文件
ansible web -m file -a 'path=/test/111 state=touch'
显示结果应该是三台机器都是黄色 则表示创建成功
三、递归修改owner,group,mode
ansible group1 -m file -a 'path=/test recurse=yes owner=bin group=daemon mode=1777'
四、删除目录 absent 缺席的(连同目录里的所有文件)
ansible web -m file -a 'path=/test state=absent'
五、创建文件并指定owner,group,mode等
ansible group1 -m file -a 'path=/tmp/111 state=touch owner=bin group=daemon mode=1777'
六、删除文件
ansible group1 -m file -a 'path=/tmp/111 state=absent'
七、创建软链接文件
ansible web -m file -a 'src=/etc/fstab path=/tmp/fstab state=link'
八、创建硬链接
ansible group1 -m file -a 'src=/etc/fstab path=/tmp/fstab2 state=hard'
九、stat模块
stat模块类似linux的stat命令,用于获取文件的状态信息。
获取/etc/fstab文件的状态信息
ansible group1 -m stat -a 'path=/etc/fstab'
显示结果
十、copy模块
copy模块用于对文件的远程拷贝操作(如把本地的文件拷贝到远程的机器上)
一、在master上准备一个文件,拷贝此文件到group1的所有机器上
echo master > /tmp/222
ansible group1 -m copy -a 'src=/tmp/222 dest=/tmp/333'
二、使用content参数直接往远程文件里写内容(会覆盖原内容)
注意:ansible中-a后面的参数里也有引号时,记得要单引双引交叉使用,如果都为双引会出现问题
ansible web -m copy -a 'content="ha ha\n" dest=/tmp/333'
将 ha ha 写入 tmp/333 中 并替换原来333中的内容
三、使用force参数控制是否强制覆盖
如果目标文件已经存在,则不覆盖
ansible group1 -m copy -a 'src=/tmp/222 dest=/tmp/333 force=no'
因为 tmp下已经有333 的文件 所以验证结果是三个绿 查看 tmp下的333没有变化
如果目标文件已经存在,则会强制覆盖
ansible group1 -m copy -a 'src=/tmp/222 dest=/tmp/333 force=yes'
验证
因为覆盖掉了之前tmp下的333,所以,里面内容更改为默认的master
四、使用backup参数控制是否备份文件
backup=yes表示如果拷贝的文件内容与原内容不一样,则会备份一份
group1的机器上会将/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 group1 -m copy -a 'src=/etc/yum.repos.d dest=/tmp/'
将整个yum.repo.d拷贝到tmp下
/etc/yum.repos.d/后面带/符号,则表示把/etc/yum.repos.d/目录里的所有文件拷贝到/tmp/目录下
ansible group1 -m copy -a 'src=/etc/yum.repos.d/ dest=/tmp/'
将yum.repo.d 下的文件拷贝到tmp下
验证
六、练习 1
在master上配置好所有的yum源,然后拷贝到group1的远程机器上(要求目录内的内容完全一致)
ansible group1 -m file -a "path=/etc/yum.repos.d/ state=absent"
ansible web -m copy -a "src=/tmp/yum.repos.d dest=/etc/"
去到另外两台机器查看,可以在etc下成功查看到yum.repos.d及里面的文件
练习2
先在master上修改好/etc/hosts文件,然后使用下面命令拷贝过去覆盖
ansible group1 -m copy -a "src=/etc/hosts dest=/etc/hosts"
十一、fetch模块
fetch模块与copy模块类似,但作用相反。用于把远程机器的文件拷贝到本地。
第1步: 在两台被管理机上分别创建一个同名文件(但内容不同)
echo agent1 > /tmp/1.txt
echo agent2 > /tmp/1.txt
从master上fecth文件(因为group1里有2台机器,为了避免同名文件文件冲突,它使用了不同的目录)
ansible group1 -m fetch -a 'src=/tmp/1.txt dest=/tmp/'
删除在拷贝显示结果是一样的
rm /tmp/10.1.1.* -rf
结果没变化,但是需要操作两次
ansible 192.168.115.4 -m fetch -a 'src=/tmp/1.txt dest=/tmp/'
注意: fetch模块不能从远程拷贝目录到本地
十二、user模块
user模块用于管理用户账号和用户属性
一、创建aaa用户,默认为普通用户,创建家目录
ansible group1 -m user -a ‘name=aaa state=present’
成功创建
二、创建bbb系统用户,并且登录shell环境为/sbin/nologin
ansible web -m user -a 'name=bbb state=present system=yes shell="/sbin/nologin"'
查看创建结果
cat /etc/passwd
三、创建ccc用户, 使用uid参数指定uid, 使用password参数传密码
先输入下方命令生成密码
echo 123456 | openssl passwd -1 -stdin
下一句命令注意一下格式,密码要用双引号引起来,单引号的话验证时会密码不正确
ansible group1 -m user -a 'name=ccc uid=2000 state=present password="生成的密码"'
cat /etc/passwd
查看结果
四、创建一个普通用户叫hadoop,并产生空密码 密钥对
ansible web -m user -a 'name=hadoop generate_ssh_key=yes'
五、删除aaa用户,但家目录默认没有删除
ansible group1 -m user -a 'name=aaa state=absent'
查看用户
cat /etc/passwd
查看家目录
cd /home
六、删除bbb用户,使用remove=yes参数让其删除用户的同时也删除家目录
ansible group1 -m user -a 'name=bbb state=absent remove=yes'
查看结果 成功删除
cat /etc/passwd
查看家目录
cd /home
十三、group模块
group模块用于管理用户组和用户组属性。
创建组
ansible group1 -m group -a 'name=groupa gid=3000 state=present'
查看组
cat /etc/group
删除组(如果有用户的gid为此组,则删除不了)
ansible group1 -m group -a 'name=groupa state=absent'
查看结果 成功删除
十四、cron模块
cron模块用于管理周期性时间任务
创建一个cron任务,不指定user的话,默认就是root(因为我这里是用root操作的)。
如果minute,hour,day,month,week不指定的话,默认都为*
ansible group1 -m cron -a 'name="test cron1" user=root job="touch /tmp/111" minute=*/2'
查看主机所有的cron任务输入
ansible group1 -m shell -a 'crontab -l'
显示结果
删除cron任务
ansible group1 -m cron -a 'name="test cron1" state=absent'
查看结果
ansible group1 -m shell -a 'crontab -l'
在新加一个 cron计划任务
ansible web -m cron -a "name='cron2' user=root job='touch /opt/222' minute=30"
验证
crontab -l
十五、yum_repository模块
yum_repository模块用于配置yum仓库
增加一个/etc/yum.repos.d/local.repo配置文件
ansible group1 -m yum_repository -a "name=local description=localyum baseurl=file:///mnt/ enabled=yes gpgcheck=no"
注意:此模块只帮助配置yum仓库,但如果仓库里没有软件包,安装一样会失败。所以可以手动去挂载光驱到/mnt目录
#mount /dev/cdrom /mnt
验证
cd /etc/yum.repo.d
cat local.repo
删除/etc/yum.repos.d/local.repo配置文件
ansible group1 -m yum_repository -a "name=local state=absent"
再次验证
说明成功删除
十六、yum模块
yum模块用于使用yum命令来实现软件包的安装与卸载。
使用yum安装一个软件(前提:group1的机器上的yum配置都已经OK)
ansible group1 -m yum -a 'name=vsftpd state=present'
此命令是将三台机器都安装vsftpd
验证成功
使用yum安装httpd,httpd-devel软件,state=latest表示安装最新版本
ansible group1 -m yum -a 'name=httpd,httpd-devel state=latest'
验证 三台机器应该都成功安装httpd 和 httpd-server
验证成功
使用yum卸载httpd,httpd-devel软件
ansible group1 -m yum -a 'name=httpd,httpd-devel state=absent'
验证 卸载成功
十七、service模块
service模块用于控制服务的启动,关闭,开机自启动等。
启动vsftpd服务,并设为开机自动启动
ansible group1 -m service -a 'name=vsftpd state=started enabled=on'
关闭vsftpd服务,并设为开机不自动启动
ansible group1 -m service -a 'name=vsftpd state=stopped enabled=false'
十八、script模块
script模块用于在远程机器上执行本地脚本。
在master上准备一个脚本
vim /tmp/1.sh
里面输入
#!/bin/bash
mkdir /tmp/haha
touch /tmp/haha/{1..10}
在group1的远程机器里都执行master上的/tmp/1.sh脚本(此脚本不用给执行权限)
运行脚本
ansible group1 -m script -a '/tmp/1.sh'
查看结果
cd /tmp/haha/
成功查看创建的10个文件
使用shell脚本实现在group1的被管理机里的mariadb里创建一个abc库
vim 2.sh
脚本内容
#!/bin/bash
yum install mariadb-server -y &> /dev/null
systemctl start mariadb
systemctl enable mariadb
mysql << EOF
create database abc;
quit
EOF
运行
ansible 192.168.115.3 -m script -a "/root/2.sh"
ansible 192.168.115.4 -m script -a "/root/2.sh"
ansible 192.168.115.5 -m script -a "/root/2.sh"
验证 成功创建
十九、command与shell模块
两个模块都是用于执行linux命令的,这对于命令熟悉的工程师来说,用起来非常high。
shell模块与command模块差不多(command模块不能执行一些类似$HOME,>,<,|等符号,但shell可以)
每个上面创建一个user2
ansible web -m command -a " useradd user2"
查看
cat /etc/passwd
想知道 每一个服务的ip
输入命令
ansible web -m command -a "ifconfig ens33"
显示结果为ip地址
查看内存剩余的情况
ansible web -m command -a "free -m"
更细致的显示每台机器的ip输入下方命令
ansible -m shell group1 -a "cat /etc/passwd |wc -l"
ansible -m shell group1 -a "cd $HOME;pwd"
查看单机IP
ifconfig ens33 | grep netmask | awk '{print $2}'
显示结果
注意: shell模块并不是百分之百任何命令都可以,比如vim或ll别名就不可以。不建议大家去记忆哪些命令不可以,大家只要养成任何在生产环境里的命令都要先在测试环境里测试一下的习惯就好。
九、playbook
playbook(剧本): 是ansible用于配置,部署,和管理被控节点的剧本。用于ansible操作的编排。
参考:https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html
使用的格式为yaml格式(saltstack,elk,docker,docker-compose,kubernetes等也都会用到yaml格式)
一、YMAL格式
- 以.yaml或.yml结尾
- 文件的第一行以 "—"开始,表明YMAL文件的开始(可选的)
- 以#号开头为注释
- 列表中的所有成员都开始于相同的缩进级别, 并且使用一个
"- "
作为开头(一个横杠和一个空格) - 一个字典是由一个简单的
键: 值
的形式组成(这个冒号后面必须是一个空格) - 注意: 写这种文件不要使用tab键,都使用空格
参考: https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html#yaml-syntax
例子
---
# 一位职工记录
name: Example Developer 名字
job: Developer 工作是一名开发者
skill: Elite 水平精通
employed: True 在职状态
foods: 喜欢的食物
- Apple 苹果
- Orange 橙子
- Strawberry 草莓
- Mango 芒果
languages: 掌握的语言
ruby: Elite ruby精通
python: Elite python精通
dotnet: Lame dotnet差劲
二、playbook实例
更改主监控的httpd 配置文件,任意添加一些内容,然后所有机器都同时安装和分发配置,开机自启和结果验证要一致
第1步: 创建一个存放playbook的目录(路径自定义)
mkdir /etc/ansible/playbook
第2步: 准备httpd配置文件,并修改成你想要的配置
yum install httpd -y
按需要修改你想要的配置(为了测试可以随意改动标记一下)
vim /etc/httpd/conf/httpd.conf
第3步: 写一个playbook文件(后缀为.yml或.yaml)
---
- hosts: web
remote_user: root
tasks:
- name: #安装httpd
yum: name=httpd,httpd-devel state=latest
- name: #分发配置
copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify:
- restart apache
- name: #启动服务并设置开机启动
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
验证 每台机器上都有httpd.conf这个配置文件并且内容和更改一致
三、playbook常见语法(上面实例的解析)
hosts: 用于指定要执行任务的主机,其可以是一个或多个由冒号分隔主机组.
remote_user: 用于指定远程主机上的执行任务的用户.
tasks: 任务列表, 按顺序执行任务.
-
如果一个host执行task失败, 整个tasks都会回滚, 修正playbook 中的错误, 然后重新执行即可.
-
handlers: 类似task,但需要使用notify通知调用。 -
不管有多少个通知者进行了notify,等到play中的所有task执行完成之后,handlers也只会被执行一次.
-
handlers最佳的应用场景是用来重启服务,或者触发系统重启操作.除此以外很少用到了.
-
练习:修改httpd的端口为8080,在执行playbook测试
首先更改httpd配置文件
vim /etc/httpd/conf/httpd.conf
将监听端口号改为 8080
重启httpd服务
systemctl restart httpd
填写 playbook文件
---
- hosts: web
remote_user: root
tasks:
- name: #安装httpd
yum: name=httpd,httpd-devel state=latest
- name: #分发配置
copy: src=/etc/httpd/conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify:
- restart apache
- name: #启动服务并设置开机启动
service: name=httpd state=started enabled=yes
handlers:
- name: restart apache
service: name=httpd state=restarted
填写完成后 执行
ansible-playbook /etc/ansible/playbook/example.yaml
去两个被监听服务的配置文件查看监听端口,成功改变
四、案例: 编排nfs搭建与客户端挂载
1, 在master上准备nfs配置文件
vim /etc/exports
里面内容填写
/share *(ro)
2, 编写yaml编排文件
vim /etc/ansible/playbook
vim 2.yaml
添加内容
---
- hosts: 192.168.115.3
remote_user: root
tasks:
- name: 安装nfs服务相关软件包
yum: name=nfs-utils,rpcbind,setup state=latest
- name: 创建共享目录
file: path=/share/ state=directory
- name: 同步nfs配置文件
copy: src=/etc/ansible/playbook/exports dest=/etc/exports
notify: restart nfs
- name: 启动rpcbind服务,并设置为开机自启动
service: name=rpcbind state=started enabled=on
- name: 启动nfs服务,并设置为开机自启动
service: name=nfs state=started enabled=on
handlers:
- name: restart nfs
service: name=nfs state=restarted
- hosts: 192.168.115.4
remote_user: root
tasks:
- name: 安装nfs客户端软件包
yum: name=nfs-utils state=latest
- name: 挂载nfs服务器的共享
shell: mount 192.168.115.3:/share /mnt
执行剧本
``bash
cd /etc/ansible/playbook
ansible-playbook 2.yaml
十、roles(难点)
一、roles介绍
roles(角色): 就是通过分别将variables, tasks及handlers等放置于单独的目录中,并可以便捷地调用它们的一种机制。
假设我们要写一个playbook来安装管理lamp环境,那么这个playbook就会写很长。所以我们希望把这个很大的文件分成多个功能拆分, 分成apache管理,php管理,mysql管理,然后在需要使用的时候直接调用就可以了,以免重复写。就类似编程里的模块化的概念,以达到代码复用的效果。
创建roles的目录结构
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目录,用不到的目录可以创建为空目录.
二、通过roles实现lamp
需定制三个角色: httpd,mysql,php
第1步: 创建roles目录及文件,并确认目录结构
cd /etc/ansible/roles/
mkdir -p {httpd,mysql,php}/{files,tasks,handlers,templates,vars,meta}
touch {httpd,mysql,php}/{tasks,handlers,vars,meta}/main.yml
安装 tree
yum install tree -y
以树形结构显示/etc/ansible/roles/目录及其子目录和文件。
tree /etc/ansible/roles/
显示结果
第2步: 准备httpd服务器的主页文件,php测试页和配置文件等
echo "test main page" > /etc/ansible/roles/httpd/files/index.html
echo -e "<?php\n\tphpinfo();\n?>" > /etc/ansible/roles/httpd/files/test.php
安装httpd
yum install httpd -y
按需求修改配置文件后,拷贝到httpd角色目录里的files子目录
vim /etc/httpd/conf/httpd.conf
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/test.php dest=/var/www/html/test.php
- name: 启动httpd并开机自启动
service: name=httpd state=started enabled=yes
第4步: 编写httpd角色里的handler
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文件
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文件调用前面定义好的三个角色
vim /etc/ansible/playbook/lamp.yaml
---
- hosts: group1
remote_user: root
roles:
- httpd
- mysql
- php
ls -ld /etc/ansible/roles/
显示目录/etc/ansible/roles/的详细信息,包括权限、所有者、大小、时间戳等
stat /etc/ansible/roles/
“stat /etc/ansible/roles/” 的意思是获取位于 “/etc/ansible/roles/” 路径下的目录的详细信息。
第8步: 执行lamp的playbook文件
ansible-playbook /etc/ansible/playbook/lamp.yaml
查看验证结果
剧本执行成功
三、通过roles实现lnmp
和lamp一样,先制定三个角色:nginx,mysql,php
第1步: 创建roles目录及文件,并确认目录结构
cd /etc/ansible/roles/
mkdir -p {nginx,mysql,php}/{files,tasks,handlers,templates,vars,meta}
touch {nginx,mysql,php}/{tasks,handlers,vars,meta}/main.yml
yum install tree -y
tree /etc/ansible/roles/
查看树状显示结果
第2步: 准备nginx服务器的主页文件,php测试页和配置文件等
echo "test main page" > /etc/ansible/roles/nginx/files/index.html
echo -e "<?php\n\tphpinfo();\n?>" > /etc/ansible/roles/nginx/files/test.php
安装nginx
yum -y install nginx
按需求修改配置文件后,拷贝到httpd角色目录里的files子目录
vim /etc/httpd/conf/httpd.conf
cp /etc/httpd/conf/httpd.conf /etc/ansible/roles/httpd/files/
第3步: 编写nginx角色的main.yml文件
vim /etc/ansible/roles/nginx/tasks/main.yml
进入后下方内容
---
- name: 安装nginx
yum: name=nginx state=present
- name: 同步nginx配置文件
copy: src=/etc/ansible/roles/nginx/files/nginx.conf dest=/etc/nginx/nginx.conf
notify: restart nginx
- name: 同步主页文件
copy: src=/etc/ansible/roles/nginx/files/index.html dest=/usr/share/nginx/html/index.html
- name: 同步php测试页
copy: src=/etc/ansible/roles/nginx/files/test.php dest=/usr/share/nginx/html/test.php
- name: 启动nginx并开机自启动
service: name=nginx state=started enabled=yes
第4步: 编写nginx角色里的handler
vim /etc/ansible/roles/nginx/handlers/main.yml
添加下方内容
---
- name: restart nginx
service: name=nginx state=restarted
第5步: 编写mysql角色的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文件
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 nginx
第7步:编写lamp的playbook文件调用前面定义好的三个角色
vim /etc/ansible/playbook/lamp.yaml
---
- hosts: web
remote_user: root
roles:
- nginx
- mysql
- php
第8步: 执行lamp的playbook文件
注意,因为我是从lamp的基础上直接做的lnmp,会存在端口号被占用的情况,如果安装时报错一定要查看是否端口号占用的问题存在的报错
ansible-playbook /etc/ansible/playbook/lamp.yaml
结果验证
十一、结语
相比于很基础的操作来说,Ansible批量的更改,安装卸载,远程读取,运行脚本都是很便捷且方便的操作,如果有错误的地方也欢迎大家及时指正,本人虚心接受并改正,希望可以帮助到大家,嘻嘻