> 技术文档 > Ansible Playbook 概述与实践案例(下)

Ansible Playbook 概述与实践案例(下)

#作者:张桐瑞

文章目录

  • 四、条件判断的实现
  • 五、循环的实现
  • 六、Jinja模板应用
    • 1、Jinja模板
    • 2、handlers组件
  • 七、角色 role
    • 1、角色介绍
    • 2、案例: 部署zabbix-agent

四、条件判断的实现

when: 条件

Ansible Playbook 概述与实践案例(下)

- hosts: appserver user: root tasks: - name: create userA user: name=userA state=present when: ansible_default_ipv4[\"address\"] == \"192.168.140.11\" - name: create userB user: name=userB state=present when: ansible_default_ipv4[\"address\"] == \"192.168.140.12\" - name: create userC user: name=userC state=present when: ansible_default_ipv4[\"address\"] == \"192.168.140.13\"

五、循环的实现

1、loop关键字

- hosts: appserver user: root tasks: - name: create userAA/BB/CC user: name={{ item }} state=present loop:  - \"userAA\"  - \"userBB\"  - \"userCC\"

2、通过字典为item变量赋值

- hosts: appserver user: root gather_facts: false tasks: - name: create user11/22/33 user: name={{ item[\"username\"] }} shell={{ item[\"sh_name\"] }} state=present loop: - { \"username\":\"user11\", \"sh_name\":\"/sbin/nologin\" } - { \"username\":\"user22\", \"sh_name\":\"/bin/bash\" } - { \"username\":\"user3z3\", \"sh_name\":\"/bin/sync\" }

案例: 部署nginx

- hosts: appserver user: root gather_facts: false tasks: - name: push nginx installer copy: src=/opt/work/nginx-1.20.1.tar.gz dest=/tmp - name: install nginx deps yum: name={{ item }} state=present loop: - gcc - openssl-devel - zlib-devel - pcre-devel - name: compile nginx shell: chdir=/tmp tar xf /tmp/nginx-1.20.1.tar.gz && cd nginx-1.20.1 && ./configure --prefix=/usr/local/nginx && make && make install - name: start nginx daemon shell: /usr/local/nginx/sbin/nginx && sed -ri \'$a \\/usr/local/nginx/sbin/nginx\' /etc/rc.d/rc.local && chmod a+x /etc/rc.d/rc.local - name: clean nginx installer shell: rm -rf /tmp/nginx*

剧本角色方式
Ansible Playbook 概述与实践案例(下)
Ansible Playbook 概述与实践案例(下)
Ansible Playbook 概述与实践案例(下)

六、Jinja模板应用

1、Jinja模板

支持在配置文件中调用变量{{ 变量名称 }}
增加配置文件灵活性
建议配置文件以.j2结尾
Jinja模板要使用template模块推送,触发变量替换

[appserver:vars]mysql_port=3307[root@ansible ~]# sed -n \'1,2p\' /opt/work/my.cnf.j2[mysqld]port={{ mysql_port }}[root@ansible ~]# cat /opt/work/test5.yml- hosts: appserver user: root tasks: - name: copy my.cnf template: src=/opt/work/my.cnf.j2 dest=/etc/my.cnf

使用setup模块的状态数据定义配置文件

[mysqld]bind-address={{ ansible_all_ipv4_addresses[0] }}port={{ mysql_port }}

2、handlers组件

与tasks同级别组件, 默认情况 ,handers下定义的任务是不会自动执行的,只有在满足了一定的条件,由特定的条件触发其执行
应用场景
检测配置文件,自动重启服务加载配置

- hosts: appserver user: root tasks: - name: copy my.cnf template: src=/opt/work/my.cnf.j2 dest=/etc/my.cnf notify: restart MySQL daemon // 触发 handlers: - name: restart MySQL daemon service: name=mariadb state=restarted

七、角色 role

1、角色介绍

本质上就是个目录
/etc/ansible/roles/
一个需求对应一个角色

  1. 创建角色
[root@ansible ~]# cd /etc/ansible/roles/[root@ansible roles]# ansible-galaxy init nginx - Role nginx was created successfully
  1. 目录结构说明
[root@ansible ~]# tree /etc/ansible/roles/nginx//etc/ansible/roles/nginx/├── defaults│ └── main.yml├── files├── handlers│ └── main.yml├── meta│ └── main.yml├── README.md├── tasks│ └── main.yml├── templates├── tests│ ├── inventory│ └── test.yml└── vars └── main.yml

defaults-默认参数
files-普通文件、软件安装包
handlers-触发的操作
meta-元数据
tasks-常规任务、操作
templates-jinja模块
tests-剧本相关的测试代码
vars-定义变量

同一个角色中,相互引用数据时,不需要添加任何目录,直接调用即可

2、案例: 部署zabbix-agent

  1. 创建zabbixAgent角色
[root@ansible ~]# cd /etc/ansible/roles/[root@ansible roles]# ansible-galaxy init zabbixAgent- Role zabbixAgent was created successfully
  1. 准备zabbix-agent配置文件模板
[root@ansible roles]# cp /etc/zabbix/zabbix_agentd.conf /etc/ansible/roles/zabbixAgent/templates/zabbix_agentd.conf.j2[root@ansible roles]# vim /etc/ansible/roles/zabbixAgent/templates/zabbix_agentd.conf.j2Server=192.168.140.10ServerActive=192.168.140.10Hostname={{ ansible_fqdn }}

setup模块找主机名

  1. 编写剧本
[root@ansible ~]# cat /etc/ansible/roles/zabbixAgent/handlers/main.yml---# handlers file for zabbixAgent- name: restart Zabbix-Agent daemon service: name=zabbix-agent state=restarted[root@ansible ~]# cat /etc/ansible/roles/zabbixAgent/tasks/main.yml---# tasks file for zabbixAgent- name: zabbix repo yum_repository: name: zabbix44 file: zabbix44 description: zabbix44 YUM repo baseurl: https://mirrors.aliyun.com/zabbix/zabbix/4.4/rhel/7/x86_64/ gpgcheck: no enabled: yes- name: install Zabbix-Agent yum: name=zabbix-agent state=present- name: copy zabbix-agent config file template: src=zabbix_agentd.conf.j2 dest=/etc/zabbix/zabbix_agentd.conf notify: restart Zabbix-Agent daemon- name: start Zabbix-Agent daemon service: name=zabbix-agent state=started enabled=yes

Ansible Playbook 概述与实践案例(下)
Ansible Playbook 概述与实践案例(下)
4) 执行角色/剧本

[root@ansible ~]# cat /opt/work/installZabbixAgent.yml- hosts: appserver user: root roles: - zabbixAgent[root@ansible ~]# ansible-playbook /opt/work/installZabbixAgent.yml