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
相关推荐
Aimyon_363 天前
⾃动化运维利器 Ansible-Jinja2
运维·ansible
柒月VII4 天前
【Ansible常用命令+模块+Playbook+Roles】
linux·服务器·ansible
Linux运维技术栈4 天前
生产环境centos8 & Red Hat8部署ansible and 一键部署mysql两主两从ansible脚本预告
运维·数据库·mysql·自动化·ansible
Aimyon_364 天前
⾃动化运维利器 Ansible-最佳实战
linux·运维·ansible
饭桶也得吃饭4 天前
运维工具Ansible部署、配置
运维·服务器·ansible
陪小七许个愿4 天前
Ansible一键部署Kubernetes集群
容器·kubernetes·ansible
Aimyon_365 天前
⾃动化运维利器 Ansible-变量
运维·ansible
Aimyon_365 天前
⾃动化运维利器Ansible-基础
运维·windows·ansible
大风吹PP凉7 天前
38配置管理工具(如Ansible、Puppet、Chef)
linux·运维·服务器·ansible·puppet
IT-民工211108 天前
Ansible剧本检测Windows防火墙状态
linux·运维·windows·自动化·ansible