Day03-Ansible playbook

Day03-Ansible playbook

  • 1. Ansible Playbook基本概述
    • 1.1 什么是playbook?
    • 1.2 Ansible playbook与AD-Hoc的关系
    • 1.3 Ansible Playbook书写格式
    • 1.4 Ansible Playbook练习实验
      • 1.4.1 playbook剧本初使用
      • 1.4.2 playbook剧本-部署配置nfs
      • 1.4.3 playbook剧本-部署配置lnmp

1. Ansible Playbook基本概述

1.1 什么是playbook?

playbook翻译过来就是“剧本”,那playbook组成如下
playbook:定义一个文本文件,以yml为后缀结尾 (翻译: 我有一个剧本)
yaml格式
play:定义的是主机的角色(翻译: 找哪个大腕明星)
task:定义的是具体执行的任务(翻译: 大腕每一集拍什么)
总结::playbook是由一个或多个play组成,一个play可以包含多个task任务。
可以理解为::使用不同的模块来共同完成一件事情。

在这里插入图片描述

1.2 Ansible playbook与AD-Hoc的关系

1.playbook是对AD-Hoc的一种编排方式。
2.playbook可以持久运行(重复),而Ad-Hoc只能临时运行。
3.playbook适合复杂的任务,而Ad-Hoc适合做快速简单的任务(检查,查询,巡检)。
4.playbook能控制任务执行的先后顺序。

  • ad-hoc 用于检查,测试,临时获取数据
  • playbook剧本适用于,重复性操作(部署环境、服务,初始化操作(优化))

1.3 Ansible Playbook书写格式

playbook是由yaml语法书写,结构清晰,可读性强,所以必须掌握yml基础语法

语法描述
缩进YAML使用固定的缩进风格表示层级结构,每个缩进由两个空格组成, 不能使用tabs
冒号以冒号结尾的除外,其他所有冒号后面所有必须有空格
短横线表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一列表。

1.下面我们一起来编写一个playbook文件,playbook起步
host:对哪些主机进行操作
remote_user:我要使用什么用户执行
tasks:具体执行什么任务

---
- hosts: all
tasks:
- name: yum安装软件
yum: xxxxxxxxx
- name: 服务启动
systemd: xxxxxx
#人生中第1个剧本 查询所有主机的主机名
# ansible ad-hoc
ansible all -m command -a 'hostname' -i hosts
# ansible playbook
[root@m01 /server/playbook]# cat 01_hostname.yml
---
- hosts: all
tasks:
- name: show hostname
command: hostname
[root@m01 /server/playbook]# ansible-playbook
01_hostname.yml -i hosts
PLAY [all]
**********************************************************
***********
TASK [Gathering Facts]
*********************************************************
ok: [172.16.1.51]
ok: [172.16.1.5]
ok: [172.16.1.6]
ok: [172.16.1.41]
ok: [172.16.1.31]
ok: [172.16.1.7]
ok: [172.16.1.8]
ok: [172.16.1.9]
ok: [172.16.1.10]
TASK [show hostname]
**********************************************
changed: [172.16.1.51]
changed: [172.16.1.41]
changed: [172.16.1.6]
changed: [172.16.1.31]
changed: [172.16.1.5]
changed: [172.16.1.8]
changed: [172.16.1.7]
changed: [172.16.1.10]
changed: [172.16.1.9]
PLAY RECAP
**********************************************************
**********************************************************
*******
172.16.1.10 : ok=2 changed=1
unreachable=0 failed=0 skipped=0 rescued=0
ignored=0

172.16.1.31 : ok=2 changed=1
unreachable=0 failed=0 skipped=0 rescued=0
ignored=0
172.16.1.41 : ok=2 changed=1
unreachable=0 failed=0 skipped=0 rescued=0
ignored=0
172.16.1.5 : ok=2 changed=1
unreachable=0 failed=0 skipped=0 rescued=0
ignored=0
172.16.1.51 : ok=2 changed=1
unreachable=0 failed=0 skipped=0 rescued=0
ignored=0
172.16.1.6 : ok=2 changed=1
unreachable=0 failed=0 skipped=0 rescued=0
ignored=0
172.16.1.7 : ok=2 changed=1
unreachable=0 failed=0 skipped=0 rescued=0
ignored=0
172.16.1.8 : ok=2 changed=1
unreachable=0 failed=0 skipped=0 rescued=0
ignored=0
172.16.1.9 : ok=2 changed=1
unreachable=0 failed=0 skipped=0 rescued=0
ignored=0

2.执行playbook,注意观察执行返回的状态颜色:
红色:表示有task执行失败,通常都会提示错误信息。
黄色:表示远程主机按照编排的任务执行且进行了改变。
绿色:表示该主机已经是描述后的状态,无需在次运行。

1.4 Ansible Playbook练习实验

  • 目标
  • 自动部署某个服务nfs
  • 自动部署lnmp
  • 任务:自动部署系统的基础优化

1.4.1 playbook剧本初使用

mkdir -p /server/playbook/
cd /server/playbook/
cp /etc/ansible/hosts .   
[root@m01 playbook]# cat show.yml 
- hosts: all
  tasks:
    - name: show ip addr 
      shell: hostname -I  >/tmp/ip.txt

[root@m01 playbook]# ansible-playbook  -i hosts -C show.yml

PLAY [all] ***************************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************
ok: [172.16.1.41]
ok: [172.16.1.7]
ok: [172.16.1.31]
ok: [172.16.1.51]

TASK [show ip addr] ******************************************************************************************************
skipping: [172.16.1.7]
skipping: [172.16.1.41]
skipping: [172.16.1.31]
skipping: [172.16.1.51]

PLAY RECAP ***************************************************************************************************************
172.16.1.31                : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0
172.16.1.41                : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0
172.16.1.51                : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0
172.16.1.7                 : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

[root@m01 playbook]# ansible-playbook  -i hosts  show.yml 
vim show.yml 
cat  show.yml 
yum install -y cowsay 
ansible-playbook  -i hosts show.yml 

[root@m01 playbook]# tree /server/playbook/
/server/playbook/
├── hosts
└── show.yml

0 directories, 2 files

1.4.2 playbook剧本-部署配置nfs

  • 目标
    • 配置nfs服务端-backup,共享目录/playbook-backup/ 共享172.16.1.0/24 all_squash访问
    #01书写剧本流程 
	##1) 把对应的过程翻译为命令
	a)安装nfs	 
	yum install -y  nfs-utils  
	
    b)配置nfs服务端
	/playbook-backup/     172.16.1.0/24(rw,sync,all_squash)
	mkdir -p /playbook-backup 
	chown  -R nfsnobody.nfsnobody  /playbook-backup
	
	c)启动与开机自启动
	systemctl enabled nfs rpcbind 
	systemctl start  rpcbind nfs 
	
	d)本地挂载
	mount -t nfs   172.16.1.41:/playbook-backup   /mnt 
	
	##2) 找出命令对应模块 
	a) yum 安装nfs
	-m yum -a 'name=nfs-utils state=installed'
	b) 配置nfs 服务端
	   copy 
	-m copy -a 'dest=/etc/exports   content="/playbook-backup/     172.16.1.0/24(rw,sync,all_squash)" '   
	   
	   file 
	-m file -a 'path=/playbook-backup  state=directory owner=nfsnobody  group=nfsnobody '  
	
	c)启动与开机自启动
	   systemd 
	-m systemd  -a 'name=rpcbind enabled=yes state=started ' 
	-m systemd  -a 'name=nfs enabled=yes state=started ' 
	
	d)本地挂载
		mount 
	-m 	mount  -a 'fstype=nfs src=172.16.1.41:/playbook-backup   dest=/mnt  state=mounted '
	
	##3) 根据模块书写剧本 
	[root@m01 playbook]# vim 02-nfs.yml 
  
- hosts: backup
  tasks:
    - name: install nfs rpcbind
      yum:  name=nfs-utils state=installed

    - name: configure nfs exports file
      copy: dest=/etc/exports   content="/playbook-backup/     172.16.1.0/24(rw,sync,all_squash)"

    - name: mkdir chown
      file: path=/playbook-backup  state=directory owner=nfsnobody  group=nfsnobody

    - name: start && enable  rpc
      systemd:  name=rpcbind enabled=yes state=started
    - name: start && enable  nfs
      systemd:  name=nfs  enabled=yes state=started

    - name: mount test
      mount: fstype=nfs src=172.16.1.41:/playbook-backup   path=/mnt  state=mounted
                                                                                      
	##4) 调试剧本
	ansible-playbook -i hosts -C 02-nfs.yml
	##5) 正式使用
	ansible-playbook -i hosts 02-nfs.yml
	
[root@m01 playbook]# ansible -i hosts backup -a 'df -h'
172.16.1.41 | CHANGED | rc=0 >>
文件系统                      容量  已用  可用 已用% 挂载点
devtmpfs                      2.0G     0  2.0G    0% /dev
tmpfs                         2.0G     0  2.0G    0% /dev/shm
tmpfs                         2.0G   12M  2.0G    1% /run
tmpfs                         2.0G     0  2.0G    0% /sys/fs/cgroup
/dev/sda3                      43G  2.5G   41G    6% /
/dev/sda1                    1014M  161M  854M   16% /boot
tmpfs                         394M     0  394M    0% /run/user/0
172.16.1.41:/playbook-backup   43G  2.5G   41G    6% /mnt
[root@m01 playbook]# ansible -i hosts backup -a 'ls -l /playbook-backup -d'
172.16.1.41 | CHANGED | rc=0 >>
drwxr-xr-x 2 nfsnobody nfsnobody 6 326 19:59 /playbook-backup
[root@m01 playbook]# ansible -i hosts backup -a 'cat /etc/exports'
172.16.1.41 | CHANGED | rc=0 >>
/playbook-backup/     172.16.1.0/24(rw,sync,all_squash)

#如何在剧本中把 一行的-a 变化为 多行 	
- name: install nfs rpcbind
  yum:  name=nfs-utils state=installed	
  
- name: install nfs rpcbind
  yum:  
    name: nfs-utils 
    state: installed	 

1.4.3 playbook剧本-部署配置lnmp

#1台机器

#01书写剧本流程 
##1) 把对应的过程翻译为命令 
a) 部署yum源nginx源,php源 webtatic 
b) 安装nginx,php7 
c) 配置nginx (www.conf) copy
d) 配置 php(php-www.conf) copy  
e) 传输代码(index.php)  copy 
f) 启动nginx,php-fpm 
	
##2) 找出命令对应模块 
##3) 根据模块书写剧本
[root@m01 playbook]# cat 03-lnp.yml 
- hosts: backup
  tasks:
    - name: add nginx repo 
      yum_repository:  
        file: nginx
        name: nginx  
        description: "ngx repo"  
        baseurl: "http://nginx.org/packages/centos/$releasever/$basearch/"  
        enabled: yes 
        gpgcheck: no
        state: present
    - name: add php repo 
      yum_repository:
        file: php
        name: php 
        description: "php repo" 
        baseurl: "http://us-east.repo.webtatic.com/yum/el7/x86_64/"      
        enabled: no  
        gpgcheck: no
        state: present

    - name: install nginx && php pack 
      yum:
        name: nginx,php71w,php71w-cli,php71w-common,php71w-devel,php71w-embedded,php71w-gd,php71w-mcrypt,php71w-mbstring,php71w-pdo,php71w-xml,php71w-fpm,php71w-mysqlnd,php71w-opcache,php71w-pecl-memcached,php71w-pecl-redis,php71w-pecl-mongodb
        enablerepo: php
        state: installed


    - name: copy nginx conf 
      copy: 
        src: nginx-php-www.conf
        dest: /etc/nginx/conf.d/www.conf
        backup: yes 

    - name: copy php conf 
      copy: 
        src: php-www.conf
        dest: /etc/php-fpm.d/www.conf
        backup: yes       
    
    - name: create code  dir 
      file:
        path: /data/www-play/ 
        owner: nginx 
        group: nginx 
        state: directory 
       
    - name: copy code  
      copy: 
        src: web-index.php
        dest: /data/www-play/index.php
        owner: nginx 
        group: nginx 
        backup: yes
        
    - name: start nginx 
      systemd: 
        name: nginx 
        enabled: yes 
        state: restarted
        
    - name: start php  
      systemd: 
        name: php-fpm  
        enabled: yes 
        state: restarted        
        

[root@m01 playbook]# cat nginx-php-www.conf 
server  {
   listen 80 default_server;
   server_name www.etiantian.org;
   root /data/www-play;
   location  /  {
   index index.php  index.html;
   }
   

   location  ~*  \.php$  {
   fastcgi_pass 127.0.0.1:9000;
   fastcgi_index index.php;
   fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
   include fastcgi_params;	
   }

}

[root@m01 playbook]# cat php-www.conf 
[www]
user = nginx
group = nginx 
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[soap.wsdl_cache_dir]  = /var/lib/php/wsdlcache
[root@m01 playbook]# cat web-index.php 
<?php
phpinfo();
?>
##4) 调试剧本
[root@m01 playbook]# ansible-playbook -i hosts -C 03-lnp.yml
 _______________
< PLAY [backup] >
 ---------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

 ________________________
< TASK [Gathering Facts] >
 ------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

ok: [172.16.1.41]
 _______________________
< TASK [add nginx repo] >
 -----------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

changed: [172.16.1.41]
 _____________________
< TASK [add php repo] >
 ---------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

changed: [172.16.1.41]
 __________________________________
< TASK [install nginx && php pack] >
 ----------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

fatal: [172.16.1.41]: FAILED! => {"changed": false, "msg": "Repository php not found."} 
# 正常,调试没有正式安装环境,等正式安装环境就没问题了
 ____________
< PLAY RECAP >
 ------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

172.16.1.41                : ok=3    changed=2    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0


##5) 正式使用
[root@m01 playbook]# ansible-playbook -i hosts 03-lnp.yml
# 检查playbook语法
[root@m01 playbook]# ansible-playbook 03-lnp.yml --syntax-check

playbook: 03-lnp.yml

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多线程学习-线程池

目录 1.线程池的作用 2.线程池的实现 3.自定义创建线程池 1.线程池的作用 当我们使用Thread的实现类来创建线程并调用start运行线程时&#xff0c;这个线程只会使用一次并且执行的任务是固定的&#xff0c;等run方法中的代码执行完之后这个线程就会变成垃圾等待被回收掉。如…

7(8)-2-CSS 盒子模型

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 CSS 盒子模型1 盒子模型&#xff08;Box Model&#xff09;组成2 边框&#x…

传统海外仓的管理模式有什么缺点?使用位像素海外仓系统的海外仓有什么优势?

传统的海外仓管理模式主要需要大量的人工操作和相对简单的信息化手段进行仓库的日常运营。因此&#xff0c;传统海外仓的运作比较依赖仓库员工的手工记录、核对和处理各种仓储和物流信息。 然而&#xff0c;传统海外仓管理模式通常存在一些缺点&#xff1a; 效率低下 因为需…

LLMOps快速入门,轻松开发部署大语言模型

大家好&#xff0c;如今我们能够与ChatGPT进行轻松互动&#xff1a;只需输入提示&#xff0c;按下回车&#xff0c;就能迅速得到回应。然而&#xff0c;这个无缝互动的底层&#xff0c;是一系列复杂而有序的自动执行步骤&#xff0c;即大型语言模型运营&#xff08;LLMOps&…

postgresql数据库|

概述 Oracle_fdw 是一种postgresql外部表插件&#xff0c;可以读取到Oracle上面的数据。是一种非常方便且常见的pg与Oracle的同步数据的方法 配置Oracle环境 Oracle_fdw 的编译依赖pg_config和Oracle的客户端环境 pg_config 是什么呢&#xff1f;其实就是postgresql的一个可执…

OpenFOAM学习笔记

OpenFOAM 计算流体力学&#xff1a;用计算机求解流体控制方程&#xff0c;来模拟真实情况下&#xff0c;流体的流动状态OpenFOAM的离散方法&#xff1a;有限体积法&#xff0c;将整个空间划分成若干个控制体OpenFOAM使用的网格系统&#xff1a;同位网格&#xff08;Collocated…

动态属性的响应式问题和行内编辑的问题

动态属性的响应式问题 通过点击给目标添加动态数据&#xff0c;该数据不具备响应式特性 如下图&#xff1a; 点击编辑&#xff0c;前面的数据框会变成输入框&#xff0c;点取消会消失 // 获取数据 async getList () {const res await xxxthis.list res.data.rows// 1. 获…

跨国网络通信挑战与解决方案:优化越南工厂与中国总部连接的网络质量

在全球化不断深入的今天&#xff0c;越来越多的中国企业走出国门&#xff0c;在世界各地设立分支机构和生产基地。然而&#xff0c;随之而来的是跨国网络通信的挑战。最近&#xff0c;客户位于越南的工厂与中国总部之间的网络连接出现了问题&#xff0c;直接影响了企业的日常运…

Windows启动项管理器Autoruns

文章目录 AutoRunsVirusTotalAutorunsc AutoRuns AutoRuns用于启动程序管理&#xff0c;可显示系统启动或登录时的各种自动启动行为&#xff0c;并扩展和加载各种系统进程&#xff0c;要比任务管理器中的自启动管理高级得多&#xff0c;其界面如下&#xff0c;列出了所有开机启…

阿里云幻兽帕鲁多人联机服务器多少钱?4核16G或8核32G配置

2024阿里云幻兽帕鲁专用服务器价格表&#xff1a;4核16G幻兽帕鲁专用服务器26元一个月、149元半年&#xff0c;默认10M公网带宽&#xff0c;8核32G幻兽帕鲁服务器10M带宽价格90元1个月、271元3个月。阿里云提供的Palworld服务器是ECS经济型e实例&#xff0c;CPU采用Intel Xeon …

c++11 标准模板(STL)本地化库 - 平面类别 - (std::ctype) 定义字符分类表(五)

本地化库 本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析&#xff0c;以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C 标准库的其他组件的行为。 平面类别 定义字符分类表 std::ctype template< class CharT > clas…

159 Linux C++ 通讯架构实战14,epoll 函数代码实战

ngx_epoll_init函数的调用 //&#xff08;3.2&#xff09;ngx_epoll_init函数的调用&#xff08;要在子进程中执行&#xff09; //四章&#xff0c;四节 project1.cpp&#xff1a;nginx中创建worker子进程&#xff1b; //nginx中创建worker子进程 //官方nginx ,一个…

卫星遥感影像统计农业产量、作物分类及面积

卫星遥感技术的广泛应用为农业领域带来了巨大的变革&#xff0c;其中&#xff0c;卫星遥感影像在农业产量估算方面的应用正成为一项关键技术。通过高分辨率的遥感数据&#xff0c;农业生产者可以更准确、及时地了解农田状况&#xff0c;实现精准农业管理&#xff0c;提高产量和…

零基础如何闯入IT的神秘大门?

前言 随着信息技术的飞速发展&#xff0c;IT行业成为了许多有志之士梦寐以求的职业领域。但对于零基础的人来说&#xff0c;如何成功进入这个行业却是一个不小的挑战。下面&#xff0c;我将结合自身的C语言专业知识&#xff0c;为大家详细阐述一条可行的学习路径&#xff0c;并…

canvas画图,画矩形、圆形、直线可拖拽移动,可拖拽更改尺寸大小

提示&#xff1a;canvas画图&#xff0c;画矩形&#xff0c;圆形&#xff0c;直线&#xff0c;曲线可拖拽移动 文章目录 前言一、画矩形&#xff0c;圆形&#xff0c;直线&#xff0c;曲线可拖拽移动总结 前言 一、画矩形&#xff0c;圆形&#xff0c;直线&#xff0c;曲线可拖…

LLM大语言模型(九):LangChain封装自定义的LLM

背景 想基于ChatGLM3-6B用LangChain做LLM应用&#xff0c;需要先了解下LangChain中对LLM的封装。本文以一个hello world的封装来示例。 LangChain中对LLM的封装 继承关系&#xff1a;BaseLanguageModel——》BaseLLM——》LLM LLM类 简化和LLM的交互 _call抽象方法定义 ab…

教你快速认识Java中的抽象类和接口

目录 引言 抽象类&#xff08;Abstract Class&#xff09; 抽象类的概念 抽象类的图标 抽象类的语法 抽象类的特点 接口&#xff08;Interface&#xff09; 接口的概念 接口的图标 接口的语法 接口的特点 接口的使用 接口的意义 抽象类与接口的区别 Object类 结…

idea开发 java web 高校学籍管理系统bootstrap框架web结构java编程计算机网页

一、源码特点 java 高校学籍管理系统是一套完善的完整信息系统&#xff0c;结合java web开发和bootstrap UI框架完成本系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 前段主要技术 css jq…

最优算法100例之33-数据流的中位数

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。 例如, [2,3,4] 的中位数是 3 [2,3] 的中位…

对PAC的侧信道攻击

PAC存不存在安全性问题&#xff1f;侧信道攻击&#xff1f;本博客探讨这些问题。