当前位置: 首页 > article >正文

ansible进阶功能

目录

handlers-触发器

when-判断

循环

单变量循环

多变量循环

Jinja2-模板

include-引用

roles-角色

vault-加密


handlers-触发器

配合notify使用,通过notify监控是否发生改动,从而触发handlers。

handlers是在task全部执行完之后再执行。

下发nfs配置文件并重启:

- hosts: nfs
  tasks:
    - name: 发文件
      copy:
        src: /etc/exports
        dest: /etc/exports
        backup: yes
      notify:
        - 重启nfs

  handlers:
    - name: 重启nfs
      systemd:
        name: nfs
        state: reloaded

执行过程:

[root@m01 ~]# ansible-playbook handlers.yml

PLAY [nfs] ***************************************************************************************************************************************

TASK [Gathering Facts] ***************************************************************************************************************************
ok: [172.16.1.31]

TASK [发文件] ***************************************************************************************************************************************
changed: [172.16.1.31]

RUNNING HANDLER [重启nfs] **************************************************************************************************************************
changed: [172.16.1.31]

PLAY RECAP ***************************************************************************************************************************************
172.16.1.31                : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

when-判断

设置task运行的条件,满足添加后运行。

主机名为web01的安装软件:

- hosts: all
  gather_facts: no
  tasks:
    - name: install htop
      yum:
        name: htop
        state: installed
      when: ansible_hostname == "web01"

对不符合条件的主机会skipping跳过。

[root@m01 ~]# ansible-playbook when.yml

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

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

TASK [install htop] ******************************************************************************************************************************
skipping: [172.16.1.31]
skipping: [172.16.1.41]
ok: [172.16.1.7]

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.7                 : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

循环

在ansible中loop和with_items都可以循环。

单变量循环

存在循环时,item代表变量。

重启rpcbind和nfs服务:

- hosts: nfs
  gather_facts: no
  tasks:
    - name: 重启rpcbind,nfs
      systemd:
        name: "{{ item }}"
        state: restarted
      loop:
        - rpcbind
        - nfs
[root@m01 ~]# ansible-playbook loop.yml

PLAY [nfs] ***************************************************************************************************************************************

TASK [重启rpcbind,nfs] *****************************************************************************************************************************
changed: [172.16.1.31] => (item=rpcbind)
changed: [172.16.1.31] => (item=nfs)

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

多变量循环

在loop或者with_itmes级别下每个列表中定义多个变量,引用时使用item.变量名

创建用户:

- hosts: nfs
  gather_facts: no
  tasks:
    - name: 创建用户
      user:
        name: "{{ item.name }}"
        uid: "{{ item.uid }}"
        state: present
      loop:
        - { name: wang1, uid: 3000 }
        - { name: wang2, uid: 3001 }
[root@m01 ~]# ansible-playbook loop2.yml

PLAY [nfs] ***************************************************************************************************************************************

TASK [创建用户] **************************************************************************************************************************************
ok: [172.16.1.31] => (item={u'name': u'wang1', u'uid': 3000})
ok: [172.16.1.31] => (item={u'name': u'wang2', u'uid': 3001})

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

Jinja2-模板

template模块配合Jinja2模板一起使用,从管理机传送文件到被控机上并将模板中的变量解析。

Jinja2也有自己的语法。

模板文件后缀使用.j2。

jinja2模板:

主机名:{{ansible_hostname}}
版本:{{ansible_distribution}}

playbook:

- hosts: all
  tasks:
    - name: 分发文件
      template:
        src: /root/template.j2
        dest: /etc/host.j2
        backup: yes

 运行结果:

[root@nfs01 ~]# cat /etc/host.j2
主机名:nfs01
版本:CentOS

include-引用

将一个较大的剧本拆分多个剧本。tasks比较多时,可以将tasks写在独立的文件内,通过include引用。

playbook:

- hosts: backup
  tasks:
    - include_tasks: yum_install.yml

- hosts: web
  tasks:
    - include_tasks: yum_remove.yml

include文件:

- name: install_htop
  yum:
    name: htop
    state: present
- name: remove_htop
  yum:
    name: htop
    state: absent

roles-角色

一个剧本目录结构规范,按照规范存放剧本的文件。

官方定义的roles目录有好几个,此处列了最常用的几个。

使用roles目录结构后,tasks中的各种应用都可以省略路径。

roles/
    top.yml    主文件
    hosts    主机清单
    nfs-server/    功能目录
        files/        存放文件,copy模块调用的目录
        templates/    存放模板文件(.j2),template模块调用的目录
        tasks/main.yml    tasks内容
        handlers/main.yml    handlers触发器内容
    group_vars/    变量目录

使用rules后,主文件(入口文件)不再写tasks,直接写roles即可,会自己调用tasks下的文件。tasks文件只需要写对应的tasks即可,并且tasks中对文件和变量的应用也无需制定路径。

主文件写法:

- hosts: nfs
  roles:
    - role: nfs-server #role下的功能目录名

vault-加密

对ansible需要使用的文件进行加密,如:hosts、变量文件、剧本文件等。

#加密文件
ansible-vault encrypt hosts
#使用,--ask-vault-pass
ansible all -m ping --ask-vault-pass
#解密文件
ansible-vault decrypt hosts


http://www.kler.cn/a/382604.html

相关文章:

  • 利用P2link智能组网工具实现外网访问局域网中的Linux主机
  • 盘点10款录音转文字工具,帮你开启高效记录。
  • 揭秘云计算 | 2、业务需求推动IT发展
  • 信息学科平台系统构建:Spring Boot框架深度解析
  • Multi Agents协作机制设计及实践
  • 重读《人月神话》(12)-未雨绸缪(Plan to Throw One Away)
  • 鸿蒙应用App测试-通用测试
  • 什么是 ASP.NET Core?与 ASP.NET MVC 有什么区别?
  • 怎麼解決IP地址衝突的問題?
  • 结对编程 --- 软件工程
  • Java学习路线:Maven(二)scope、optional和exclusions
  • Late Chunking×Milvus:如何提高RAG准确率
  • C++ 新手指南:如何使用 set 和 unordered_set
  • 2024年10月个人工作生活总结
  • 【网络】传输层协议TCP(下)
  • Android笔记(三十五):用责任链模式封装一个App首页Dialog管理工具
  • javaweb基于springboot社区养老服务管理系统
  • 【Linux】——操作系统-进程详解
  • 使用 Flutter 绘制一个棋盘
  • 通讯录(C 语言)
  • Java基础概览和常用知识(二十)
  • rclone 挂载是否会占用服务器的存储
  • 【c++语言程序设计】字符串与浅层复制(深拷贝与浅拷贝)
  • 《高等学校化学学报》
  • python 语法
  • 《质谱学报》