Ansible自动化运维(三)Playbook 模式详解

👨‍🎓博主简介

  🏅云计算领域优质创作者
  🏅华为云开发者社区专家博主
  🏅阿里云开发者社区专家博主
💊交流社区:运维交流社区 欢迎大家的加入!
🐋 希望大家多多支持,我们一起进步!😄
🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏 ⭐️ 加关注+💗


文章目录

  • 一、Ansible 中的 Playbook 模式
    • 1.1 Playbook 的优势
    • 1.2 Playbook 的组成
    • 1.3 Playbook 命令
    • 1.4 Playbook 的语法
    • 1.5 Playbook 中的变量
    • 1.6 变量注册
    • 1.7 debug 模块:将上一步任务执行的结果打印出来
    • 1.8 facts 缓存
  • 二、Playbook 中的流程控制
    • 2.1 条件
    • 2.2 循环
    • 2.3 异常处理
    • 2.4 tags 标签
  • 三、Playbook 中常用的模块使用
  • 四、相关文章

一、Ansible 中的 Playbook 模式

  Playbook不同于使用单个模块操作远程服务器,Playbook的功能更加强大。如果说单个模块执行类似于Linux系统中的命令,那么Playbook就类似于shell脚本,将多个模块组合起来实现一组的操作。

Playbook还是会用到ad-hoc模式中的模块及参数,只不过Playbook与ad-hoc的写法不一样。

1.1 Playbook 的优势

  • 功能比ad-hoc更全
  • 能很好的控制先后执行顺序, 以及依赖关系
  • 语法展现更加的直观
  • ad-hoc无法持久使用,playbook可以持久使用

1.2 Playbook 的组成

play:一个完整的部署任务,并且必须包含以下前两项:

  hosts:定义对哪些主机进程操作

  tasks:定义的是具体执行的任务

  become:表示是否要以特权用户(通常是root)身份执行任务。如果设置为yes,则任务会以特权身份执行。

playbook: 由一个或多个play组成,一个play可以包含多个task任务

说明:Ansible 中的 Playbook 文件结尾为.yml 格式

示例httpd.yml:安装httpd;

---
- name: apachehosts: webbecome: yestasks:- name: Install httpd Serveryum:name: httpdstate: present

解析:

name:定义一个Playbook的名称,用于标识Playbook的用途;

hosts:指定要在哪个主机上执行,也是写主机或主机组名,需要提前在/etc/ansible/hosts中配置好;

become:yes表示使用特权用户;

tasks:属于是一个任务列表,主要写具体执行什么的(可以有多个);

  name:每个任务的名称,用于描述干什么的;上述yml中则是安装httpd服务

  yum:表示使用哪个模块来进行操作;模块的参数可以看ad-hoc中的,用的都是一样的,写法不一样就是;

    name:要安装的服务名称,我们这里是httpd:

    state:要进行的操作,可以是安装、卸载、更新;

其实tasks就是Ansible的模块以YAML语法写入到playbook中。

生产环境中为了可读性与可维护性通常一个playbook中只编写一个play,如果某些主机需要执行多个play,那么可以使用include关键字在一个playbook中导入其他的playbook。

1.3 Playbook 命令

格式:

ansible-playbook [选项] playbook.yml 

常用选项:

选项/参数选项/参数 解析
-T建立SSH连接的超时时间
-i指定Inventory文件
-f并发执行的进程数,默认为5
- -list-hosts匹配的服务器列表
- -list-tasks列出任务列表
- -step每执行一个任务后停止,等待用户确认
- -syntax-check语法检测
- -list-tags列出此yml文件中的所有tag标签
- -skip-tags执行–skip-tags之外的标签任务
-C检查当前这个Playbook是否会修改受控端,模拟执行

1.4 Playbook 的语法

  • 权限

remote_user指定playbook运行时的用户身份,可以写在hosts下,也可以每个tasks做定义;

become 该选项为布尔值,当等于yes表示以管理员身份通常与become_method一起使用;

become_method:su或sudo

# 指定使用哪个用户执行此任务
remote_user: root# 是否使用特权用户
become: yes
  • 通知与触发

notify 如果指定的操作执行了,会触发handlers的操作,指定的是handler的名称;

handlersnotify指定的名称必须相同,否则无法触发。

handlers 中需要- name指定名称 ,handlers只会在所有的tasks执行完后执行,并且,即便一个handlers被触发多次,也只会执行一次。 handlers是一种特殊的tasks

  • handlers(触发事件)
notify: 触发
handlers:触发的动作
# 两者的名称一定要相同,否则无法触发。

使用上场景:一般都是修改配置文件时

正常情况时handlers是不会执行的,除非触发任务,才会执行

- hosts: webtasks:- name: installredisyum: name=redis- name: copyfiletemplate: src=redis.conf dest=/etc/redis.conftags: copyfilenotify: restart		# 触发:触发名称- name: startservice:name: redisstate: startedenabled: yeshandlers:				# 触发动作- name: restartservice:name: redisstate: restarted

1.5 Playbook 中的变量

  变量提供了便捷的方式来管理Ansible playbook的每一个项目中的动态值,比如nginx-1.6.3这个软件包的版本,在其它地方或许会反复使用,那么如果将此值设置为变量,然后再在其他的playbook中调用,会方便许多。如此一来还方便维护,减少维护的成本。

  • 变量的定义方式

1.通过命令行进行变量定义

2.在play文件中进行变量定义

3.通过Inventory主机信息文件中进行变量定义

变量读取的优先级为: 命令行 > playbook文件 > Inventory文件

  • 通过vars定义变量
---
- name: LAMPhosts: webvars:packages_name:- httpd- mariadb-server- php- php-mysqltasks:- name: install LAMPyum:name: "{{packages_name}}"state: present

执行此yml:

# 语法校验
ansible-playbook --syntax-check LAMP.yml# 执行yml
ansible-playbook LAMP.yml(定义的yml文件名)
  • 通过vars_files定义变量

当变量较少时,使用vars定义没有问题,当变量较多时,可以将变量保存到一个独立的文件中;

需要多个yml文件,一个主文件,需要调用其他yml独立文件,主要是最后运行的;其他是定义包名的yml文件。

#定义阶段
# my_vars.yml
---
httpd_package: httpd
mariadb_package: mariadb-server#调用阶段
# apache.yml
---
- name: apachehosts: webbecome: yesvars_files:- my_vars.yml  # 引入变量文件tasks:- name: Install httpdyum:name: "{{ httpd_package }}"state: presentbecome: yes- name: Install mariadb-serveryum:name: "{{ mariadb_package }}"state: presentbecome: yes

执行此yml:

# 语法校验
ansible-playbook --syntax-check apache.yml# 执行yml
ansible-playbook apache.yml(定义的yml文件名)
  • 官方推荐定义变量方法

之前的几种变量定义都不是很好用,比较好用的是在Ansible项目目录下创建两个变量目录:

host_vars

group_vars

目录名字一定要一致,不能做任何修改。

  理解如何设置和使用host_varsgroup_vars可以使你的Ansible管理更加灵活和有组织。以下是更详细的步骤,从设置目录结构到创建Playbook的执行:

  1. 目录结构
    在你的Ansible项目目录下,确保设置以下目录结构:

    your_ansible_project/
    ├── group_vars/
    │   └── web-servers.yml
    ├── host_vars/
    │   └── web-server.yml
    ├── playbook.yml
    └── inventory.ini
    
    • group_vars目录用于存放组级别的变量定义。
    • host_vars目录用于存放主机级别的变量定义。
    • playbook.yml是你的Ansible Playbook。
    • inventory.ini是Ansible的主机清单文件,其中列出了你的主机和主机组。
  2. 清单文件 (inventory.ini)
    确保在清单文件中定义了你的主机和主机组。例如:

    vim /etc/ansible/inventory.ini

[web-servers]
172.16.11.209 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=‘123123’


3. **组级别变量 (`group_vars/web-servers.yml`)**:
在`group_vars`目录下创建一个YAML文件,例如`web-servers.yml`,并在其中定义组级别的变量,如:`mkdir -p /etc/ansible/group_vars && vim /etc/ansible/group_vars/web-servers.yml````yaml
# group_vars/web-servers.yml
---
httpd_package: httpd
mariadb_package: mariadb-server
  1. 主机级别变量 (host_vars/web-server.yml)
    host_vars目录下创建一个YAML文件,例如web-server.yml,并在其中定义主机级别的变量,如:

    mkdir -p /etc/ansible/host_vars && vim /etc/ansible/host_vars/web-servers.yml

    # host_vars/web-server.yml
    ---
    http_port: 80
    
  2. Playbook (playbook.yml)
    创建你的Ansible Playbook,例如:

    vim /etc/ansible/playbook.yml

    ---
    - name: Configure Web Serverhosts: web-serversbecome: yestasks:- name: Install HTTPdyum:name: "{{ httpd_package }}"state: present- name: Start HTTPdservice:name: httpdstate: started
    
  3. 运行Playbook
    使用以下命令运行你的Playbook:

    ansible-playbook -i inventory.ini playbook.yml
    

此时,Ansible会自动加载group_varshost_vars目录中的变量,你的Playbook将使用这些变量来配置主机。

通过这种方式,你可以更加有组织地管理变量,特别是对于多主机和多组的环境。你可以为不同的组或主机设置特定的变量,而不必在Playbook中硬编码这些值,提高了可维护性和可读性。

  • 命令行定义变量

ansible-playbook命令提供-e选项,用于在命令行定义变量,命令行定义变量的优先级最高。

[root@localhost yml]# cat /etc/ansible/hosts
[web]
172.16.11.209[web:vars]
ansible_ssh_pass='123123'# 执行:命令行定义变量
[root@localhost yml]# vim test.yml
---
- name: apache hosts: webbecome: yesvars: httpd_package:- httpdtasks:- name: install httpd serviceyum:name: "{{ httpd_package }}"state: present
#定义阶段
[root@ansible ~]# ansible-playbook test.yml -e "web_server=vsftpd"

1.6 变量注册

  当anbsible的模块在运行之后,其实都会返回一些result结果,就像是执行脚本,我们有的时候需要脚本给我们一些return返回值,我们才知道,上一步是否可以执行成功,但是默认情况下,ansible的result并不会显示出来,所以,我们可以把这些返回值’存储’到变量中,这样我们就能通过’调用’对应的变量名,从而获取到这些result,这种将模块的返回值,写入到变量中的方法被称为变量注册。

[root@ansible ~]# vim register.yml
---
- hosts: web tasks:- name: define a var1shell: "whoami"register: user_name- name: get msg debug: msg: "{{ user_name }}"- name: get stdout msgdebug:msg: "{{ user_name.stdout_lines }}"# 执行
[root@localhost yml]# ansible-playbook register.ymlPLAY [web] ****************************************************************************************************************************************************TASK [Gathering Facts] ****************************************************************************************************************************************
ok: [172.16.11.209]TASK [define a var1] ******************************************************************************************************************************************
changed: [172.16.11.209]TASK [get msg] ************************************************************************************************************************************************
ok: [172.16.11.209] => {"msg": {"changed": true, "cmd": "whoami", "delta": "0:00:00.004924", "end": "2023-10-12 23:21:29.231407", "failed": false, "rc": 0, "start": "2023-10-12 23:21:29.226483", "stderr": "", "stderr_lines": [], "stdout": "root", "stdout_lines": ["root"]}
}TASK [get stdout msg] *****************************************************************************************************************************************
ok: [172.16.11.209] => {"msg": ["root"]
}PLAY RECAP ****************************************************************************************************************************************************
172.16.11.209              : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

说明:

debug:模块常用参数

msg: #调试输出的消息

var: #将某个任务执行的输出作为变量传递给debug模块,debug会直接将其打印输出

verbosity: #debug的级别(默认是0级,全部显示)

1.7 debug 模块:将上一步任务执行的结果打印出来

将上一步任务执行的结果打印出来,不管成功还是失败都会返回;

---
- name: debug测试 hosts: allremote_user: roottasks:- name: 查看root目录下的文件command: ls /rootregister: root_directory_contents  # 存储命令输出- name: 输出的结果debug:var: root_directory_contents.stdout_lines

在这里插入图片描述

1.8 facts 缓存

  Ansible facts是在被管理主机上通过Ansible自动采集发现的变量。facts包含每台特定的主机信息。比如:被控端的主机名、IP地址、系统版本、CPU数量、内存状态、磁盘状态等等。

  • facts变量的使用场景
  1. 通过facts缓存检查CPU,来生成对应的nginx配置文件

  2. 通过facts缓存检查主机名,生成不同的zabbix配置文件

  3. 通过facts缓存检索物理机的内存大小来生成不同的mysql配置文件

可以使用setup模块查看facts变量列表:

[root@localhost yml]# ansible nginx -m setup 
172.16.11.209 | SUCCESS => {"ansible_facts": {"ansible_all_ipv4_addresses": ["172.17.0.1", "172.16.11.209"], "ansible_all_ipv6_addresses": ["fe80::20c:29ff:feaf:dbfa"], 以下省略…

在playbook中引用facts变量:

[root@localhost ansible]# vim /etc/ansible/hosts 
[web]
172.16.11.209[web:vars]
ansible_ssh_pass='123123'# yml文件
[root@localhost yml]# cat facts.yml 
- hosts: webtasks:- shell: echo {{ ansible_os_family }}register: my_vars- debug: var: my_vars.stdout_lines# 执行
[root@localhost yml]# ansible-playbook facts.yml PLAY [web] ****************************************************************************************************************************************************TASK [Gathering Facts] ****************************************************************************************************************************************
ok: [172.16.11.209]TASK [shell] **************************************************************************************************************************************************
changed: [172.16.11.209]TASK [debug] **************************************************************************************************************************************************
ok: [172.16.11.209] => {"my_vars.stdout_lines": ["RedHat"]
}PLAY RECAP ****************************************************************************************************************************************************
172.16.11.209              : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   #在playbook中,可以通过gather_facts选项控制是否收集远程主机,默认值为yes

二、Playbook 中的流程控制

2.1 条件

  在所有的编程语言流程控制语句中,条件语句是必不可少的,在使用Ansible的过程中,条件判断的使用频率极其高。

例如:

  • 使用不同的系统的时候,可以通过判断系统来对软件包进行安装。

  • 在nfs和rsync安装过程中,客户端服务器不需要推送配置文件,之前我们都是写多个play,会影响效率。

  • 在源码安装nginx的时候,执行第二遍就无法执行了,此时我们就可以进行判断是否安装过。

playbook中的条件判断语句使用when

tasks:  #官方案例- name: "shut down Debian flavored systems"command: /sbin/shutdown -t nowwhen: ansible_facts['os_family'] == "Debian"# note that all variables can be used directly in conditionals without double curly braces- hosts: web_grouptasks:- name: Install CentOS Httpdyum:name: httpdstate: present#官方when: ansible_facts['os_family'] == "CentOS"#非官方when: ansible_distribution == "CentOS"- name: Install Ubuntu Httpdyum:name: apache2state: presentwhen: ansible_facts['os_family'] == "Ubuntu"

还可以使用括号对条件进行分组

tasks:- name: "shut down CentOS 6 and Debian 7 systems"command: /sbin/shutdown -t nowwhen: (ansible_facts['distribution'] == "CentOS" and ansible_facts['distribution_major_version'] == "6") or(ansible_facts['distribution'] == "Debian" and ansible_facts['distribution_major_version'] == "7")

也可以指定多条件为列表

tasks:- name: "shut down CentOS 6 systems"command: /sbin/shutdown -t nowwhen:- ansible_facts['distribution'] == "CentOS"- ansible_facts['distribution_major_version'] == "6"

条件运算

tasks:- shell: echo "only on Red Hat 6, derivatives, and later"when: ansible_facts['os_family'] == "RedHat" and ansible_facts['distribution_major_version ']|int >= 6

实例:

[root@localhost yml]# vim when.yml
- hosts: webremote_user: root   #代表用root用户执行,默认是root,可以省略tasks:- name: createfilecopy: content="test3" dest=/etc/ansible/yml/when.ymlwhen: a=='3'- name: createfilecopy: content="test4" dest=/etc/ansible/yml/when.ymlwhen: a=='4'

如果a"3",就将“test3”,写入到web组下被管控机的/etc/ansible/yml/when.yml中,
如果a"4",就将“test4”,写入到web组下被管控机的/etc/ansible/yml/when.yml中。

执行:

# 语法校验
ansible-playbook  --syntax-check when.yml#执行
ansible-playbook -e 'a="3"' when.yml

2.2 循环

  • 1、标准循环使用场景 - 批量安装软件
[root@localhost yml]# vim with_items.yml
---
- hosts: allremote_user: roottasks:- name: Installed packagesyum: name: "{{ item }}"state: presentwith_items:- wget- tree- lrzsz

执行:

# 语法校验
ansible-playbook --syntax-check with_items.yml# 执行
ansible-playbook with_items.yml

在这里插入图片描述

  • 2、标准循环使用场景 - 批量创建用户
[root@localhost yml]# vim item2.yml
---
- name: 批量创建用户hosts: allremote_user: roottasks:- name: 配置创建用户操作user:name: "{{ item }}"state: presentwith_items:- cs1- cs2- cs3

执行:

# 语法校验
ansible-playbook --syntax-check item2.yml# 执行
ansible-playbook item2.yml

查看:

tail -3 /etc/passwd

在这里插入图片描述

  • 3、循环嵌套使用场景 - 批量创建用户并给用户添加用户组
[root@localhost yml]# vim item3.yml
---
- name: 批量创建用户名及用户组hosts: allremote_user: roottasks: - name: create groupgroup: name={{ item }} state=presentwith_items:- group1- group2- group3- name: create useruser: name={{ item.name }} group={{ item.groups }} state=presentwith_items:- {'name': cs1,'groups': group1}- {'name': cs2,'groups': group2}- {'name': cs3,'groups': group3}

执行:

# 语法校验
ansible-playbook --syntax-check item3.yml# 执行
ansible-playbook item3.yml
  • 4、循环嵌套使用场景 - 批量删除用户及用户组
[root@localhost yml]# vim item3_1.yml
---
- name: 批量删除用户及用户组hosts: allremote_user: roottasks: - name: drop useruser:name: "{{ item.name }}"group: "{{ item.group }}"remove: yesstate: absentwith_items:- {'name': cs1,'group': group1}- {'name': cs2,'group': group2}- {'name': cs3,'group': group3}- name: drop groupgroup:name: "{{ item }}"state: absentwith_items:- group1- group2- group3

执行:

# 语法校验
ansible-playbook --syntax-check item3_1.yml# 执行
ansible-playbook item3_1.yml
  • 5、标准循环使用场景 - 批量拷贝多个文件
[root@localhost yml]# vim item4.yml
- name: 批量拷贝文件hosts: allremote_user: roottasks:- name: bulk copycopy: src=/home/test/{{ item.src }} dest=/home/cs/{{ item.dest }} mode={{ item.mode }}with_items:- {src: "a.sh", dest: "a.sh", mode: "0777"}- {src: "tongji.sh", dest: "tongji.sh", mode: "0777"}# -------------------------------此为分界线,上下互不相干---------------------------------    - name: 批量拷贝文件到不同的路径hosts: allremote_user: roottasks:- name: bulk copycopy: src=/home/test/{{ item.src }} dest={{ item.dest }} mode={{ item.mode }}with_items:- {src: "a.sh", dest: "/home/cs/a.sh", mode: "0777"}- {src: "tongji.sh", dest: "/home/cs1/tongji.sh", mode: "0777"}

执行:

# 语法校验
ansible-playbook --syntax-check item4.yml# 执行
ansible-playbook item4.yml

2.3 异常处理

默认Playbook会检查命令和模块的返回状态,如遇到错误就中断playbook的执行

加入参数: ignore_errors: yes # 忽略错误

[root@localhost yml]# cat expect.yml 
---
- name: 忽略错误演示hosts: allremote_user: roottasks: - name: 使用一个未知的命令command: aignore_errors: yes- name: 创建一个文件file: path=/home/cs/yichang state=touch

代码解析:

如上代码,执行到command的a命令时,服务器时没有这个命令的,就会报错,报错了之后,下面的服务就不会继续执行了;

我们现在添加了一个ignore_errors: yes,这样就可以跳过这个报错,继续执行下面的内容;

2.4 tags 标签

  默认情况下,Ansible在执行一个playbook时,会执行playbook中定义的所有任务;Ansible playbook中的tag标签是一种用于选择性运行特定任务或任务集的机制。通过为每个任务指定标签,您可以在运行playbook时选择只运行带有特定标签的任务,而不运行其他任务。这对于控制和管理Ansible playbook的执行非常有用,特别是当您的playbook包含许多任务时。

  • 1、打标签的方式

对一个对象打一个标签

对一个对象打多个标签

对多个对象打一个标签

  • 2、标签使用,通过tags和任务对象进行捆绑,控制部分或者指定的task执行

-t:执行指定的tag标签任务

--list-tags:列出此yml文件中的所有tag标签

--skip-tags:执行–skip-tags之外的标签任务

  • 3、以下是tag标签的作用:
  1. 选择性运行任务:可以使用--tags参数在运行ansible-playbook命令时指定一个或多个标签,只有带有指定标签的任务会运行。这对于在大型playbook中只运行特定任务非常有用,而不是运行整个playbook。

  2. 排除任务:您可以使用--skip-tags参数来排除具有特定标签的任务,从而运行除带有指定标签的任务之外的所有其他任务。这对于在大型playbook中排除不需要运行的任务非常有用。

  3. 组织任务:标签可以帮助您组织和分类任务。例如,您可以为配置任务添加一个config标签,为安装任务添加一个install标签,以便更容易了解每个任务的用途。

  4. 文档和注释:标签还可以作为任务的文档和注释。您可以将标签用作描述任务的方式,以便其他人更容易理解每个任务的目的。

下面是一些示例,演示如何在运行ansible-playbook时使用标签:

  • 仅运行带有install标签的任务:

    ansible-playbook your_playbook.yml --tags install
    
  • 排除带有test标签的任务:

    ansible-playbook your_playbook.yml --skip-tags test
    
  • 运行带有多个标签的任务:

    ansible-playbook your_playbook.yml --tags "install,config"
    
  • 列出yml文件中所有的标签

    ansible-playbook your_playbook.yml --list-tags
    

标签功能有助于增加Ansible playbook的可维护性,使您能够更精细地控制任务的执行。

  • 4、【实例】部署apache服务并启动,中间可以自行设置tags标签。
[root@localhost yml]# vim tags.yml
---
- name: 部署apache服务hosts: webremote_user: rootvars:- http_port: 8080tasks:- name: Install Http Serveryum:name: httpdstate: presenttags: - install_httpd- httpd_server- name: configure httpd servercopy:src: ./httpd.confdest: /etc/httpd/conf/httpd.confmode: 0777notify: Restart Httpd Servertags: - config_httpd- httpd_server- name: start httpd serverservice:name: httpdstate: startedenabled: yestags: start_httpd- name: stop httpd serverservice:name: httpdstate: stoppedtags: stop_httpd- name: uninstall httpd serveryum:name: httpdstate: absenttags: uninstall_httpdhandlers:- name: Restart Httpd Serversystemd:name: httpdstate: restarted

这是一个Ansible playbook的YAML文件,用于部署Apache HTTP服务器。YAML文件解析:

  1. name: 部署apache服务:这是整个Ansible playbook的名称或描述。
  2. hosts: web:这指定了该playbook将在名为web的主机组上执行。您需要在您的Ansible inventory文件中定义主机组web,或者在命令行上指定主机。
  3. remote_user: root:指定了运行任务时使用root用户身份执行。
  4. vars::这是一个变量部分,用于定义变量。在这里,定义了一个名为http_port的变量,其值为8080。
  5. tasks::这是实际任务部分,其中包含一系列任务,每个任务都有一个名称和相应的操作。以下是每个任务的解释:
    • 第一个任务:Install Http Server:这个任务使用yum模块来安装httpd软件包,确保Apache HTTP服务器已经安装在主机上。此任务有两个tags:install_httpdhttpd_server,以便后续可以选择性地运行这些任务。
    • 第二个任务:configure httpd server:这个任务使用copy模块将本地文件httpd.conf复制到目标主机的/etc/httpd/conf/httpd.conf位置,并给目标文件设置执行权限,从而配置Apache HTTP服务器。此任务有两个tags:config_httpdhttpd_server。(为什么要多余移动这个呢,因为这个配置里我们自己写的,同时也修改了httpd的端口为:8080)。notify: Restart Httpd Server意味着当该任务的状态发生变化时(通常是成功完成任务),它将触发名为 “Restart Httpd Server” 的处理程序handlers
    • 第三个任务:start httpd server:这个任务使用service模块来启动并启用Apache HTTP服务器。此任务有一个tag:start_httpd
    • 第四个任务:stop httpd server:停止HTTP服务器。它使用 service 模块将 httpd 服务停止。此任务有一个标签 stop_httpd
    • 第五个任务:uninstall httpd server:卸载HTTP服务器。它使用 yum 模块卸载 httpd 软件包。此任务有一个标签 uninstall_httpd
  6. handlers::这部分定义了处理程序,这是一些在任务中使用的命名动作,通常与通知一起使用。在这里,定义了一个名为Restart Httpd Server的处理程序,当copy任务完成后,可以通知它。此处理程序使用systemd模块来重新启动httpd服务。

这个Playbook允许您执行与Apache HTTP服务器有关的各种操作,如安装、配置、启动、停止和卸载。使用不同的标签可以选择性地运行特定任务或任务组。


执行:

# 查看此yml文件中的所有tags标签
[root@localhost http]# ansible-playbook tags.yml --list-tagsplaybook: tags.ymlplay #1 (web): 部署apache服务	TAGS: []TASK TAGS: [config_httpd, httpd_server, install_httpd, start_httpd, stop_httpd, uninstall_httpd]# 执行 install_httpd,config_httpd(安装、移动配置文件)标签;执行移动配置文件会触发处理程序,所以会自动启动服务;
[root@localhost http]# ansible-playbook tags.yml -t install_httpd,config_httpd# 执行 uninstall_httpd(卸载httpd服务) 标签
[root@localhost http]# ansible-playbook tags.yml -t uninstall_httpd# 执行 httpd_server 标签
[root@localhost http]# ansible-playbook tags.yml -t httpd_server
# httpd_server标签包含(Install Http Server、configure httpd server、Restart Httpd Server)
# 所以会直接执行这三个任务,也就是安装、移动配置文件(因为使用移动文件触发了处理程序notify,所以就会执行Restart Httpd Server重启服务)
# 总结就是:执行httpd_server标签,会安装服务并启动服务。# 跳过 httpd_server,start_httpd(安装加启动,启动)标签
[root@localhost http]# ansible-playbook tags.yml --skip-tags httpd_server,start_httpd# 执行结果为,关闭httpd服务并卸载httpd服务;因为已经跳过 httpd_server ,所以不会执行安装和启动;

在这里插入图片描述

三、Playbook 中常用的模块使用

  • 批量备份文件
    - name: backup fileshell: mv {{ item }} {{ item }}-$(date +"%Y-%m-%d")with_items:- /home/cs/a.sh- /home/cs/b.sh- /home/cs/c.shignore_errors: yestags: backup_file

执行结果为:/home/cs/a.sh-2023-10-31、/home/cs/b.sh-2023-10-31、/home/cs/c.sh-2023-10-31
ignore_errors: yes 为:没有这个文件可能会导致报错,跳过报错继续执行,不过最后还是要返回来看,需要单独复制。

  • 批量复制文件:从本地复制到其他服务器不同路径
    - name: copy filecopy: src=/etc/ansible/yml/update/{{ item.src }} dest={{ item.dest }} mode={{ item.mode }}with_items:- {src: "a.sh", dest: "/data/cs/a.sh", mode: "0777"}- {src: "b.sh", dest: "/data/abc/b.sh", mode: "0777"}- {src: "cs.jar", dest: "/data/conf/cs.jar", mode: "0644"}tags: copy_file
  • 批量复制文件:从其他服务器复制到其他服务器不同路径
    - name: copy shell/fileshell: cp -ar {{ item.src }} {{ item.dest }}with_items:- {src: "/home/test/nginx/conf/nginx.conf", dest: "/usr/local/cs/nginx/conf/nginx.conf"}- {src: "/home/test/nginx/conf/cs.conf", dest: "/usr/local/cs/nginx/conf/cs.conf"}- {src: "/home/test/nginx/src/nginx", dest: "/usr/local/cs/nginx/src/nginx"}ignore_errors: yestags: fugai

ignore_errors: yes 为:没有这个文件可能会导致报错,跳过报错继续执行,不过最后还是要返回来看,需要单独复制。

四、相关文章

文章标题文章链接
Ansible自动化运维(一)简介及部署、清单https://liucy.blog.csdn.net/article/details/133769300
Ansible自动化运维(二)ad-hoc 模式详解https://liucy.blog.csdn.net/article/details/133772023
Ansible自动化运维(三)Playbook 模式详解https://liucy.blog.csdn.net/article/details/133899966
Ansible自动化运维(四)jinja2 模板、Roles角色详解https://liucy.blog.csdn.net/article/details/133994509

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

故事机手机平板等智能硬件DVT阶段可靠性测试方法

DVT是什么 DVT是设计样品验证测试评审阶段,这个阶段要进行全面的,客观的测试, 主要测试项目包括:功能测试,安规测试,性能测试,合规测试(兼容性),机械测试&am…

数据结构——用Java实现二分搜索树

目录 一、树 二、二分搜索树 1.二叉树 2.二分搜索树 三、代码实现 1.树的构建 2.获取树中结点的个数 3.添加元素 4.查找元素 (1)查找元素是否存在 (2)查找最小元素 (3)查找最大元素 5.二分搜索…

256:vue+openlayers利用高德逆地理编码,点击地图,弹出某点坐标和地址信息

第256个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中利用高德逆地理编码,点击地图,弹出某点坐标和地址信息。这里要仔细阅读高德地图的逆编码API,同时要注意的是,这种转换在中国很好用,到了欧美国家就不好使了。 直接复制下面的 vue+openlayers源代码…

【JaveWeb教程】(30)SpringBootWeb案例之《智能学习辅助系统》的详细实现步骤与代码示例(3)员工管理的实现

目录 SpringBootWeb案例033. 员工管理3.1 分页查询3.1.1 基础分页3.1.1.1 需求分析3.1.1.2 接口文档3.1.1.3 思路分析3.1.1.4 功能开发3.1.1.5 功能测试3.1.1.6 前后端联调 3.1.2 分页插件3.1.2.1 介绍3.1.2.2 代码实现3.1.2.3 测试 3.2 分页查询(带条件)3.2.1 需求3.2.2 思路分…

vue3---inputRef.value.focus()报错Cannot read properties of null (reading ‘focus‘)

问题描述&#xff1a;点击编辑按钮&#xff0c;出现el-input框&#xff08;el-input显示隐藏通过v-if控制&#xff09; <el-input ref"inputRef" v-if"isEdit" v-model"modelName" blur"isEdit false" /> <el-button text …

大模型学习与实践笔记(十三)

将训练好的模型权重上传到 OpenXLab 方式1&#xff1a; 先将Adapter 模型权重通过scp 传到本地&#xff0c;然后网页上传 步骤1. scp 到本地 命令为&#xff1a; scp -o StrictHostKeyCheckingno -r -P *** rootssh.intern-ai.org.cn:/root/data/ e/opencv/ 步骤2&#…

为什么时序逻辑电路会落后一拍?

1、时序逻辑电路落后一拍&#xff1f; FPGA初学者可能经常听到一句话&#xff1a;“时序逻辑电路&#xff0c;或者说用 < 输出的电路会延迟&#xff08;落后&#xff09;一个时钟周期。”但在仿真过程中经常会发现不符合这一“定律”的现象–明明是在仿真时序逻辑&#xff…

C#winform上位机开发学习笔记13-串口助手显示系统时间功能添加

1.功能描述 在上位机中显示系统的实时时间 2.代码部分 步骤1&#xff1a;添加文本框控件并设置参数 #此处注意将BackColor颜色修改为非Control&#xff0c;即可正常显示ForeColor颜色&#xff0c;否则该颜色不变&#xff0c;原因暂且不明。 步骤2&#xff1a;添加timer控件…

GC26E31S国产芯片可替代AM26LV31E/TI,适用于马达编码等产品上

众所周知AM26LV31E是一款具有三态输出的四路差分线路驱动器。该驱动器具有15kV ESD&#xff08;HBM和IEC61000-4-2&#xff0c;气隙放电&#xff09;和8kV ESD&#xff08;IEC61000-4-2&#xff0c;接触放电&#xff09;保护。该器件旨在满足TIA /EIA-422-B和ITU建议V.11驱动器…

Dify学习笔记-知识库(六)

1、知识库 大多数语言模型采用较为陈旧的训练数据&#xff0c;并且对每次请求的上下文有长度限制。例如 GPT-3.5 是基于 2021 年的语料进行训练的&#xff0c;且有每次约 4K Token 的限制。这意味着开发者如果想让 AI 应用基于最新的、私有的上下文对话&#xff0c;必须使用类…

SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务)

文章目录 前言1.痛点2.解决方案3.具体实现3.1搭建热配置服务3.2编写配置文件3.3搭建版本控制仓库3.4Eureka-Client引入以下依赖3.5Eureka-Client微服务编写以下配置bootstrap.yml提前加载3.6分别编写测试Controller3.7测试效果3.8下线场景压测 4.SpringCloudBus优化5.写到最后 …

springboot-mybatis项目

一、后端开发环境搭建 1、File->New->Projet 2选择 Spring Initializr &#xff0c;然后选择默认的 url 点击next 3勾选Spring Web、SQL模板&#xff0c;next 4点击finish&#xff0c;搭建完成 二 数据库 1 新建数据库 2 执行sql建表 SET NAMES utf8mb4; SET FOREIGN…

爬虫js逆向分析——x平台(实现)

爬虫js逆向分析——x平台&#xff08;实现&#xff09; &#xff08;仅供学习&#xff0c;本案例只是分析流程没有账号&#xff09;网址&#xff1a;https://xuexi.chinabett.com/ 1.分析请求包格式 打开控制台&#xff0c;并勾选保存日志&#xff0c;然后点击登录看发送了什…

外贸邮件群发软件有哪些?邮件群发的系统?

外贸邮件群发软件哪个比较好&#xff1f;外贸开发信软件推荐&#xff1f; 对于许多外贸企业来说&#xff0c;邮件营销是一种非常有效的推广方式。那么&#xff0c;外贸邮件群发软件就成为了必备的工具。蜂邮EDM将为你揭秘几款主流的外贸邮件群发软件&#xff0c;助你更好地开展…

linux安装docker(入门一)

环境&#xff1a;centos 7(linux) 网站 官网: https://docs.docker.com/ Docker Hub 网站: https://hub.docker.com/ 容器官方概述 一句话概括容器&#xff1a;容器就是将软件打包成标准化单元&#xff0c;以用于开发、交付和部署。 容器镜像是轻量的、可执行的独立软件包 &…

shell脚本——条件语句与循环语句

目录 一、条件语句 1、test命令测试条件表达式 2、整数数值比较 3、字符串比较 4、逻辑测试&#xff08;短路运算&#xff09; 5、双中括号 二、if语句 1、 分支结构 1.1 单分支结果 1.2 双分支 1.3 多分支 2、case 一、条件语句 条件测试&#xff1a;判断某需求是…

【原神游戏开发日志3】登录和注册有何区别?

版权声明&#xff1a; ● 本文为“优梦创客”原创文章&#xff0c;您可以自由转载&#xff0c;但必须加入完整的版权声明 ● 文章内容不得删减、修改、演绎 ● 本文视频版本&#xff1a;见文末 ● 相关学习资源&#xff1a;见文末 前言 ● 这是我们原神游戏开发日记的第三期 ●…

OpenHarmony—TypeScript到ArkTS约束说明

对象的属性名必须是合法的标识符 规则&#xff1a;arkts-identifiers-as-prop-names 级别&#xff1a;错误 在ArkTS中&#xff0c;对象的属性名不能为数字或字符串。通过属性名访问类的属性&#xff0c;通过数值索引访问数组元素。 TypeScript var x { name: x, 2: 3 };c…

计算机网络 第5章(运输层)

系列文章目录 计算机网络 第1章&#xff08;概述&#xff09; 计算机网络 第2章&#xff08;物理层&#xff09; 计算机网络 第3章&#xff08;数据链路层&#xff09; 计算机网络 第4章&#xff08;网络层&#xff09; 计算机网络 第5章&#xff08;运输层&#xff09; 计算机…

Windows10上使Git Bash支持rsync命令操作步骤

rsync命令是linux上常用的工具之一&#xff0c;用于远程以及本地系统中拷贝/同步文件和文件夹。 Windows Git Bash默认并不支持rsync&#xff0c;如下图所示&#xff1a; 使Git Bash支持rsync命令操作步骤&#xff1a; 1.从https://repo.msys2.org/msys/x86_64/ 下…