Ansible:playbook的高级用法

文章目录

1. handlers与notify

  • Handlers:是task列表,用于当关注的资源发生变化时,采取一定的操作。
  • Notify:被触发的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作成为handler,也即notify中调用handler中定义的操作。
  • 例如:更新配置文件,重新启动playbook,系统不会重启服务,这时可以通过定义一个notify去重启服务,handlers负责执行重启。
  1. 写一个playbook文件安装httpd
bash 复制代码
vim httpd.yml
yaml 复制代码
---
- hosts: webservers
  remote_user: root

  tasks:
    - name: install httpd package
      yum: name=httpd
    - name: copy conf file
      copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes
    - name: start service
      service: name=httpd state=started enabled=yes
bash 复制代码
ansible-playbook httpd.yml
  1. 查看当前的端口状态
bash 复制代码
ansible webservers -a 'ss -ntl'
  1. 修改httpd的端口,从8080修改为81
bash 复制代码
vim ./files/httpd.conf


  1. 现在配置文件修改过了,我们在yaml文件中增加handlers与notify触发机制
bash 复制代码
vim httpd.yml
yaml 复制代码
---
- hosts: webservers
  remote_user: root

  tasks:
    - name: install httpd package
      yum: name=httpd
    - name: copy conf file
      copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes
      notify: restart service  # 当配置文件改变时,调用handlers里面的restart service
    - name: start service
      service: name=httpd state=started enabled=yes

  handlers: # 当上面的某个或某些任务改变时,执行下面的任务
    - name: restart service
      service: name=httpd state=restarted
  1. 重新执行playbook,就可以检测到文件的修改,触发notify和handlers操作。
bash 复制代码
ansible-playbook httpd.yml
  1. 最后查看端口状态,发现8080端口已经换成了81:
bash 复制代码
ansible webservers -a 'ss -ntl'

如果报错,说明端口号没有权限,换一个端口号。

systemctl status httpd.service


notify和handlers操作可以同时定义多个,相当于多个函数其实可以同时调用。

2. tags组件

在大型项目当中,通常一个playbook会有非常多的task。而我们每次执行这个playbook时,都会将所有task运行一遍。

而事实上,在实际使用过程中,我们可能只是想要执行其中的一部分任务而已,并不想把整个playbook完整跑一遍。这个时候就需要用到tags。

通过tags,我们可以给playbook中的某一些任务打上"标签",而在执行playbook的时候,我们可以通过选定标签的方式指定只执行哪一些任务或者不执行哪一些任务。

  1. 创建一个playbook文件
bash 复制代码
vim httpd_tag.yml

yaml 复制代码
#install httpd
- hosts: webservers
  remote_user: root
  gather_facts: no

  tasks:
    - name: Install httpd
      yum: name=httpd state=present
    - name: Install configure file
      copy: src=files/httpd.conf dest=/etc/httpd/conf/
      #定义tags
      tags: config
    - name: web html
      copy: src=files/index.html  dest=/var/www/html/
    - name: start service
      service: name=httpd state=started enabled=yes
      #定义tags
      tags: service
  1. 查看当前tags列表(不知道命令就用--help查看)
bash 复制代码
ansible-playbook --list-tags httpd_tag.yml
  1. 再次修改httpd的端口号
bash 复制代码
vim files/httpd.conf
  1. 针对linux101这一台主机运行config 这个tag代码段。
bash 复制代码
ansible-playbook -t config httpd_tag.yml --limit linux101

ansible linux101 -a 'ss -ntl'
  1. 最后给它卸掉(PS:因为我的电脑...)
bash 复制代码
ansible-playbook  remove_httpd.yml 

3. playbook中使用变量

  • 变量名:仅能由字母、数字和下划线组成,且只能以字母开头。
  • 变量定义:variable=value

范例:http_port=80

  • 变量调用方式:通过{``{ variable_name }} 调用变量,且变量名前后建议加空格,有时用"{``{ variable_name }}"才生效
  • 变量来源:
  1. ansible 的 setup facts 远程主机的所有变量都可直接调用
  2. 通过命令行指定变量,优先级最高 ansible-playbook -e varname=value
  3. 在playbook文件中定义
yaml 复制代码
   vars:
     - var1: value1
     - var2: value2
  1. 在独立的变量YAML文件中定义
yaml 复制代码
   - hosts: all
     vars_files:
       - vars.yml
  1. /etc/ansible/hosts 中定义
  • 主机(普通)变量:主机组中主机单独定义,优先级高于公共变量
  • 组(公共)变量:针对主机组中所有主机定义统一变量

6.在role中定义

3.1使用 setup 模块中变量

本模块自动在playbook调用,不要用ansible命令调用

  • 案例:使用setup变量
yaml 复制代码
---
#var.yml
- hosts: all
  remote_user: root
  #调用系统变量必须要收集,gather_facts: yes或者不写
  gather_facts: yes

  tasks:
    - name: create log file
      file: name=/data/{{ ansible_nodename }}.log state=touch owner=yu mode=600
bash 复制代码
ansible-playbook  var.yml
bash 复制代码
ansible all -a 'ls /data'

3.2在playbook 命令行中定义变量

在playbook中写变量,在命令行赋值调用

范例:

bash 复制代码
vim val_install.yml
yaml 复制代码
---
- hosts: webservers
  remote_user: root
  tasks:
    - name: install package
      yum: name={{ pkname }} state=present
bash 复制代码
ansible-playbook  --e pkname=httpd  val_install.yml

3.3在playbook文件中定义变量

范例:

bash 复制代码
vim var_uninstall.yml
yaml 复制代码
---
- hosts: webservers
  remote_user: root
  vars:
    - pkname: httpd

  tasks:
    - name: uninstall pkname
      yum: name={{ pkname }} state=absent

直接运行,使用默认参数:

bash 复制代码
ansible-playbook var_uninstall.yml

在运行时重新给变量赋值,会修改参数:

bash 复制代码
ansible-playbook -e 'pkname=nginx' var_uninstall.yml

3.4使用变量文件

可以在一个独立的playbook文件中定义变量,在另一个playbook文件中引用变量文件中的变量,比playbook中定义的变量优化级高

  1. 新建playbook定义变量
bash 复制代码
vim vars.yml
yml 复制代码
---
# variables file
var1: httpd
var2: nginx
bash 复制代码
vim  var_log.yml
yaml 复制代码
---
- hosts: webservers
  remote_user: root
  vars_files:
    - vars.yml
#   - /root/playbook/vars.yml

  tasks:
    - name: create httpd log
      file: name=/data/{{ var1 }}.log state=touch
    - name: create nginx log
      file: name=/data/{{ var2 }}.log state=touch
bash 复制代码
​ansible-playbook var_log.yml
ansible all -a 'ls /data/ '

3.5主机清单文件中定义变量

主机变量

在inventory 主机清单文件中为指定的主机定义变量以便于在playbook中使用

组(公共)变量

在inventory 主机清单文件中赋予给指定组内所有主机上的在playbook中可用的变量,如果和主机变是同名,优先级低于主机变量。

范例:

  1. 打开hosts文件,添加主机变量和公共变量
bash 复制代码
vim /etc/ansible/hosts
bash 复制代码
[webservers]
linux101 hname=www1 domain=yu.io #添加主机变量(优先级高于公共变量)
linux102 hname=www1 domain=yhx.com

[webservers:vars]#添加webservers的组变量(公共变量)
mark="-"
domain=edu.cn
  1. 调用hostname模块,修改主机名
bash 复制代码
#先想想主机名应该是什么
ansible webservers -m hostname -a 'name={{ hname}}{{ mark }}{{ domain }}'
ansible all -a 'hostname'

因为主机变量优先级高于组变量(公共变量),所以linux101的主机名应该是:www1-yu.io,linux102的主机名应该是:www1.yhx.com.

  1. 还可以通过行命令来指定变量,这时候指定的变量可以覆盖之前文件中定义的变量
bash 复制代码
#命令行指定变量: 
ansible webservers -e domain=sch.com -m hostname -a 'name={{                                                                hname }}{{ mark }}{{ domain }}'
ansible all -a 'hostname'
  1. 再将hostname修改回去
bash 复制代码
ansible linux101 -m hostname -a 'name=linux101' 
ansible linux102 -m hostname -a 'name=linux102'
ansible all -a 'hostname'
相关推荐
Johny_Zhao3 小时前
OpenClaw安装部署教程
linux·人工智能·ai·云计算·系统运维·openclaw
YuMiao17 小时前
gstatic连接问题导致Google Gemini / Studio页面乱码或图标缺失问题
服务器·网络协议
chlk1232 天前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑2 天前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件2 天前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
碳基沙盒2 天前
OpenClaw 多 Agent 配置实战指南
运维
深紫色的三北六号2 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash2 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI3 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
十日十行3 天前
Linux和window共享文件夹
linux