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
相关推荐
key_Go9 小时前
7.Ansible自动化之-实施任务控制
python·ansible·numpy
yuxb733 天前
Ansible 基础到实操笔记
linux·笔记·ansible
IT成长日记4 天前
【自动化运维神器Ansible】playbook命令行变量定义全流程解析
运维·自动化·ansible·变量·命令行·playbook
vivo互联网技术4 天前
vivo Pulsar 万亿级消息处理实践(4)-Ansible运维部署
大数据·ansible·自动化运维·pulsar·消息处理·分布式消息中间件
朱小弟cs65 天前
Orange的运维学习日记--41.Ansible基础入门
linux·运维·学习·ci/cd·自动化·ansible·devops
IT成长日记5 天前
【自动化运维神器Ansible】playbook案例解析:Tags组件实现任务选择性执行
运维·自动化·ansible·playbook·tags
IT成长日记5 天前
【自动化运维神器Ansible】playbook实践示例:HTTPD安装与卸载全流程解析
运维·自动化·ansible·playbook·httpd·案例解析
天翼云开发者社区10 天前
Ansible部署Node_exporter
ansible·应用自动化运维
ZZZKKKRTSAE11 天前
RHCE认证题解
linux·运维·服务器·ansible·rhce·rhel9·红帽