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
相关推荐
云攀登者-望正茂2 天前
使用 Ansible 在 Windows 服务器上安装 SSL 证书
ansible
tianyuanwo4 天前
Ansible自动化运维全解析:从设计哲学到实战演进
运维·自动化·ansible
哆啦A梦15884 天前
在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/[email protected] 更换为 go-ansible/@v1.1.7
开发语言·golang·ansible
lifeng43215 天前
在 CentOS 上将 Ansible 项目推送到 GitHub 的完整指南
centos·github·ansible
运维成长记9 天前
ansible-playbook 进阶 接上一章内容
linux·服务器·ansible
半桶水专家10 天前
Ansible 配置Playbook文件格式、关键字和语法详解
ansible
遇见火星12 天前
Ansible模块——Ansible配置文件!
linux·git·ansible
安顾里14 天前
Ansible安装
linux·运维·自动化·ansible
爱莉希雅&&&15 天前
运维Linux之Ansible详解学习(更新中)
linux·运维·ansible
筑梦之路21 天前
centos 9 Kickstart + Ansible自动化部署 —— 筑梦之路
centos·自动化·ansible