Ansible Playbook 概述与实践案例(下)
#作者:张桐瑞
文章目录
- 四、条件判断的实现
- 五、循环的实现
- 六、Jinja模板应用
- 1、Jinja模板
- 2、handlers组件
- 七、角色 role
- 1、角色介绍
- 2、案例: 部署zabbix-agent
四、条件判断的实现
when: 条件
- hosts: appserveruser: roottasks:- name: create userAuser: name=userA state=presentwhen: ansible_default_ipv4["address"] == "192.168.140.11"- name: create userBuser: name=userB state=presentwhen: ansible_default_ipv4["address"] == "192.168.140.12"- name: create userCuser: name=userC state=presentwhen: ansible_default_ipv4["address"] == "192.168.140.13"
五、循环的实现
1、loop关键字
- hosts: appserveruser: roottasks: - name: create userAA/BB/CCuser: name={{ item }} state=presentloop:- "userAA"- "userBB"- "userCC"
2、通过字典为item变量赋值
- hosts: appserveruser: rootgather_facts: falsetasks:- name: create user11/22/33user: name={{ item["username"] }} shell={{ item["sh_name"] }} state=presentloop:- { "username":"user11", "sh_name":"/sbin/nologin" }- { "username":"user22", "sh_name":"/bin/bash" }- { "username":"user3z3", "sh_name":"/bin/sync" }
案例: 部署nginx
- hosts: appserveruser: rootgather_facts: falsetasks:- name: push nginx installercopy: src=/opt/work/nginx-1.20.1.tar.gz dest=/tmp- name: install nginx deps yum: name={{ item }} state=presentloop:- 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 daemonshell: /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 installershell: rm -rf /tmp/nginx*
剧本角色方式
六、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: appserveruser: roottasks:- name: copy my.cnftemplate: 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: appserveruser: roottasks:- name: copy my.cnftemplate: src=/opt/work/my.cnf.j2 dest=/etc/my.cnfnotify: restart MySQL daemon // 触发handlers:- name: restart MySQL daemonservice: name=mariadb state=restarted
七、角色 role
1、角色介绍
本质上就是个目录
/etc/ansible/roles/
一个需求对应一个角色
- 创建角色
[root@ansible ~]# cd /etc/ansible/roles/
[root@ansible roles]# ansible-galaxy init nginx
- Role nginx was created successfully
- 目录结构说明
[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
- 创建zabbixAgent角色
[root@ansible ~]# cd /etc/ansible/roles/
[root@ansible roles]# ansible-galaxy init zabbixAgent
- Role zabbixAgent was created successfully
- 准备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.j2
Server=192.168.140.10
ServerActive=192.168.140.10
Hostname={{ ansible_fqdn }}
setup模块找主机名
- 编写剧本
[root@ansible ~]# cat /etc/ansible/roles/zabbixAgent/handlers/main.yml
---
# handlers file for zabbixAgent- name: restart Zabbix-Agent daemonservice: name=zabbix-agent state=restarted[root@ansible ~]# cat /etc/ansible/roles/zabbixAgent/tasks/main.yml
---
# tasks file for zabbixAgent- name: zabbix repoyum_repository:name: zabbix44file: zabbix44description: zabbix44 YUM repobaseurl: https://mirrors.aliyun.com/zabbix/zabbix/4.4/rhel/7/x86_64/gpgcheck: noenabled: yes- name: install Zabbix-Agentyum: name=zabbix-agent state=present- name: copy zabbix-agent config filetemplate: src=zabbix_agentd.conf.j2 dest=/etc/zabbix/zabbix_agentd.confnotify: restart Zabbix-Agent daemon- name: start Zabbix-Agent daemonservice: name=zabbix-agent state=started enabled=yes
4) 执行角色/剧本
[root@ansible ~]# cat /opt/work/installZabbixAgent.yml
- hosts: appserveruser: rootroles:- zabbixAgent[root@ansible ~]# ansible-playbook /opt/work/installZabbixAgent.yml