linux系统ansible工具中的剧本playbook基础内容

playbook

playbook

playbook 是 ansible 用于配置,部署,和管理被控节点的剧本。

通过playbook的详细描述,执行其中的一系列tasks,可以让远端主机达到预期的状态
playbook就像Ansible控制器给被控节点列出的的一系列to-do-list,而被控节点必须要完成
在Ansible中,由计算机进行表演,由计算机安装,部署应用,提供对外服务,以及组织计算机处理各种各样的事情。

使用场景

执行一些简单的任务,使用ad-hoc命令可以方便的解决问题,但是有时一个设施过于复杂,需要大量的操作时候,执行的ad-hoc命令是不适合的,这时最好使用playbook

不过playbook有自己的语法格式。使用playbook可以方便的重用这些代码,可以移植到不同的机器上面,像函数一样,最大化的利用代码。

在使用Ansible的过程中,将所处理的大部分操作都是编写playbook。可以把常见的应用都编写成playbook,之后管理服务器会变得十分简单

核心元素

Hosts:主机组
Tasks:任务列表
Variables:变量,设置方式有四种,vars
Templates:包含了模板语法的文本文件
Handlers:由特定条件触发的任务
remote_user:在远程主机上执行任务的用户

某任务的状态在运行后为changed时,可通过"notify"通知给相应的handlers
任务可以通过"tags"打标签,而后可在ansible-playbook命令上使用-t或者--tags指定进行调用

剧本格式

文件的第一行应该以 "---" (三个连字符)开始,表明YMAL文件的开始。   
在同一行中,#之后的内容表示注释,类似于shell,python和ruby。   
YMAL中的列表元素以"-"开头然后紧跟着一个空格,后面为元素内容。   
同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理。   
play中hosts,variables,roles,tasks等对象的表示方法都是键值中间以":"分隔表示,":"后面还要增加一个空格。

host部分:使用hosts指示使用哪个主机或主机组来运行下面的tasks,每个playbook都必须指定hosts,hosts也可以使用通配符格式。在运行清单文件的时候,--list-hosts选项会显示那些主机将会参与执行task的过程中。

remote_user:指定远端主机中的哪个用户来登录远端系统,在远端系统执行task的用户,可以任意指定,也可以使用sudo,但是用户必须要有执行相应task的权限。 

tasks:指定远端主机将要执行的一系列动作。tasks的核心为 ansible 的模块,前面已经提到模块的用法。tasks包含name和要执行的模块,name是可选的,只是为了便于用户阅读,不过还是建议加上去,模块是必须的,同时也要给予模块相应的参数。

运行剧本

运行剧本的方式
ini 复制代码
ansible-playbook 剧本名                 //运行剧本

ansible-playbook 剧本名 --syntax-check  //检查剧本语法正确与否

ansible-playbook 剧本名 --list-task     //列出所有任务

ansible-playbook 剧本名 --list-hosts    //列出在那些机器执行

ansible-playbook --tags=标签名  剧本名   //只运行标签语句
ansible-playbook -t=标签名 剧本名        //只运行标签语句
playbook查看执行命令过程
ini 复制代码
ad-hoc:点对点运行可以看到命令执行结果

playbook:只能看到命令是否执行成功
如果需要查看执行过程的数据需要添加模块

tasks
- name:xxx
  模块:执行名令
  register: result      register:变量名
- name: debug
  debug 
  Var: 变量名["对变量名进行裁剪"]

角色roles

介绍
ini 复制代码
roles 用于层次性、结构化地组织playbook。

roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等。

使用roles只需要在playbook中使用include指令即可。roles就是通过分别将变量(vars)、文件(file)、任务(tasks)、模块(modules)及处理器(handlers)放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,也是用于构建守护进程等场景中。
角色创建
ini 复制代码
ansible-galaxy init 角色名字      //在当前所在目录下创建角色文件
角色创建后的目录
ini 复制代码
defaults:用于设定默认变量;

files:存放剧本所需文件

handlers:用于定义各handler;其它的文件需要由main.yml进行"包含"调用; 

meta:定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行"包含"调用; 

README.md:说明书

tasks:用于定义各task;其它的文件需要由main.yml进行"包含"调用;

templates:存储由template模块调用的模板文本;

tests:用于存放测试文件的目录

vars:用于定义各variable;其它的文件需要由main.yml进行"包含"调用;
角色使用
ini 复制代码
和角色同级创建 执行剧本文件.yaml,文件内编写执行主机、执行用户、执行角色
---
- hosts: 主机
  remote_user: root
  roles:
    - 角色名字
ini 复制代码
运行角色剧本
ansible-playbook 执行剧本文件.yaml

变量定义

facts调用
ini 复制代码
直接调用setup收集的信息,这个模块就是通过调用facts组件来实现的。这里的variables也可以直接调用facts组件。具体的facters可以使用setup模块来获取,然后直接放入剧本中调用即可。
ini 复制代码
ansible_all_ipv4_addresses:仅显示ipv4的信息==》显示ipv4所有的信息
ansible_ens33['ipv4']['address']:仅显示ipv4的信息==》ens33的ip地址
ansible_devices:仅显示磁盘设备信息
ansible_distribution:显示是什么系统,例:centos,suse等
ansible_distribution_version:仅显示系统版本
ansible_machine:显示系统类型,例:32位,还是64位
ansible_eth0:仅显示eth0的信息
ansible_hostname:仅显示主机名
ansible_kernel:仅显示内核版本
ansible_lvm:显示lvm相关信息
ansible_memtotal_mb:显示系统总内存
ansible_memfree_mb:显示可用系统内存
ansible_memory_mb:详细显示内存情况
ansible_swaptotal_mb:显示总的swap内存
ansible_swapfree_mb:显示swap内存的可用内存
ansible_mounts:显示系统磁盘挂载情况
ansible_processor:显示cpu个数(具体显示每个cpu的型号)
ansible_processor_vcpus:显示cpu个数(只显示总的个数)
ansible_python_version:显示python版本
批量修改主机 host 文件
ini 复制代码
---
- hosts: web  
  vars:        
    IP: "{{ ansible_eth0['ipv4']['address'] }}"  
  tasks:        
  - name: 将原有的hosts文件备份          
    shell: mv /etc/hosts /etc/hosts_bak        
  - name: 将ansible端的hosts复制到各自机器上          
    copy: src=/etc/hosts dest=/etc/ owner=root group=root mode=0644        
  - name: 在新的hosts文件后面追加各自机器内网ip和hostname          
    lineinfile: dest=/etc/hosts line="{{ IP }}  {{ ansible_hostname }} "
自定义变量
命令行传入
ini 复制代码
执行剧本时,-e 变量名=变量值
ansible-playbook 剧本名 -e 变量名=变量值

{{ 变量名 }}    //调用变量
playbook中定义
ini 复制代码
在playbook中定义
vars:
- 变量名: 变量值

{{ 变量名 }}    //调用变量
roles定义变量
ini 复制代码
创建角色后,在角色的目录下的vars/main.yml里面定义变量

变量名: 变量值
主机清单定义
ini 复制代码
主机清单定义:/etc/ansible/hosts
向不同的主机传递不同的变量
ini 复制代码
[主机组]
主机1
主机2

[主机1]
主机变量名=主机变量值

[主机2]
主机变量名=主机变量值
向组中的主机传递相同的变量
ini 复制代码
[主机组]
主机
主机

[主机主:vars]
变量名=变量值
主机清单定义内置参数
参数 用途
ansible ssh host 定义 hosts ssh 地址
ansible ssh port 定义 hosts ssh 端口
ansible ssh user 定义 hosts ssh 认证用户
ansible ssh pass 定义 hosts ssh 认证密码
ansible sudo 定义 hosts sudo 用户
ansible sudo pass 定义 hosts sudo 密码
ansible sudo exe 定义 hosts sudo 路径
ansible connection 定义 hosts 连接方式
ansible ssh private key file 定义 hosts 私钥
ansible ssh shell type 定义 hosts shell 类型
ansible python interpreter 定义 hosts 任务执行python路径
ansible * interpreter 定义 hosts 其它语言解析路径

when语句

- name: Task Name
  ansible.builtin.command: /bin/reboot
  when: ansible_facts['os_family'] == "RedHat"

ansible_when语句的格式是
when: condition
其中condition是一个布尔表达式,如果为真,则执行该任务。

with循环

ini 复制代码
tasks:
- name: unstall web packages
  yum: name={{ item }} state=absent
  with_items:
  - httpd
  - php
  - php-mysql
ini 复制代码
现在模块也支持多次运行

tasks:
- name: unstall web packages
  yum: name=httpd,php,php-mysql state=absent

字典

多个with是字典

- name: install some packages
  yum: name={{ item }} state=present
  with_items:
    - nginx
    - memcached
    - php-fpm
- name: add some groups
  group: name={{ item }} state=present
  with_items:
    - group11
    - group12
    - group13
- name: add some users
  user: name={{ item.name }} group={{ item.group }} state=present
  with_items:
    - { name: 'user11', group: 'group11' }
    - { name: 'user12', group: 'group12' }
    - { name: 'user13', group: 'group13' }
相关推荐
陈苏同学1 分钟前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
Ambition_LAO7 分钟前
解决:进入 WSL(Windows Subsystem for Linux)以及将 PyCharm 2024 连接到 WSL
linux·pycharm
Pythonliu723 分钟前
茴香豆 + Qwen-7B-Chat-Int8
linux·运维·服务器
你疯了抱抱我24 分钟前
【RockyLinux 9.4】安装 NVIDIA 驱动,改变分辨率,避坑版本。(CentOS 系列也能用)
linux·运维·centos
追风赶月、25 分钟前
【Linux】进程地址空间(初步了解)
linux
栎栎学编程26 分钟前
Linux中环境变量
linux
我是哈哈hh39 分钟前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝
郭二哈43 分钟前
C++——模板进阶、继承
java·服务器·c++
挥剑决浮云 -1 小时前
Linux 之 安装软件、GCC编译器、Linux 操作系统基础
linux·服务器·c语言·c++·经验分享·笔记
立秋67891 小时前
Python的defaultdict详解
服务器·windows·python