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
相关推荐
孪生质数-7 天前
Ansible基础入门
服务器·自动化·ansible·openstack
Empty_7778 天前
Ansible变量
服务器·github·ansible
哲Zheᗜe༘8 天前
学习Ansible Playbook 核心语法
网络·学习·ansible
凤凰战士芭比Q9 天前
Ansible剧本、变量、判断、循环
ansible
凤凰战士芭比Q9 天前
Ansible(安装、配置文件、命令行、常用模块)
linux·ansible
早睡冠军候选人12 天前
Ansible学习----管理复杂的 Play 和 Playbook 内容
运维·学习·云原生·ansible
雨奔12 天前
ansible使用教程
ansible
凡间客13 天前
Ansible安装与入门
linux·运维·ansible
LoneEon13 天前
告别手动操作:用 Ansible 统一管理你的 Ubuntu 服务器集群
运维·服务器·ansible
Empty_77713 天前
Ansible之Playbook简单应用
网络·ansible