ansible实践02-ansible高级用法-playbook介绍和使用

1. ansible核心组件Playbook

1)playbook前言

    Playbook:使用yaml格式进行表示。用来描述对应的远程主机需要执行的任务的一种表达方法。

2)了解YAML

    YAML(/ˈjæməl/,尾音类似camel骆驼)是一个可读性高,用来表达数据序列化的格式。YAML参考了其他多种语言,包括:C语言、Python、Perl,并从XML、电子邮件的数据格式(RFC 2822)中获得灵感。Clark Evans在2001年首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。当前已经有数种编程语言或脚本语言支持(或者说解析)这种语言。

    

3)YAML语法格式

基本数据结构:
标量,数组(清单),关联数组。
1.playbook核心元素:
Hosts:主机(关联到的主机,由谁来唱这出戏)
Tasks:任务列表(要唱哪些戏)
Variables:(有些数据变量需要重复使用)
Templates:包含了模板语法的文本文件。
Handlers:由特定条件触发的任务。

Roles

2. Playbook基础组件

Hosts:运行指定任务的目标主机
remote_user:在远程主机上执行任务的用户
sudo_user:如果切换用户,sudo到哪个用户执行
tasks:任务列表
模块,模块参数
格式:
1)action: module arguments
2) module: arguments

3. playbook运行方法

a. playbook测试

ansible-playbook --check
只检测可能会发生的改变,但不真正执行此操作。

ansible-playbook --list-hosts
列出运行任务的主机

b. 正式执行playbook

handlers:任务,在特定条件下触发。
notify: handler task name,接收到其它任务的通知时被触发。

4. playbook实例

实例1-安装nginx,启动nginx

需要注意,接下来的实例都是以此实例为基础进行测试和修改。

 

[root@elk01 playbooks]# cat playbook01.yaml
- hosts: test03
remote_user: root
tasks:
- name: install nginx
yum: name=nginx state=installed
- name: start nginx
service: name=nginx state=started

检查是否有语法错误:
ansible-playbook --syntax-check playbook01.yaml

查看执行任务的主机列表和具体执行哪些任务
ansible-playbook --list-hosts --list-tasks playbook01.yaml


预测试,不会改变目标主机的任何设置。
ansible-playbook -C playbook01.yaml

执行playbook
ansible-playbook playbook01.yaml

实例2-批量修改nginx配置文件,拷贝配置文件到远程主机,触发执行对应任务加载配置

[root@elk01 playbooks]# cat playbook01-20220329bak.yaml
- hosts: test03
remote_user: root
tasks:
- name: install nginx
yum: name=nginx state=installed
- name: copy nginx configue file
copy: src=/playbooks/nginx.conf dest=/etc/nginx/nginx.conf
notify: restart nginx
- name: start nginx
service: name=nginx state=started
handlers:
- name: restart nginx
service: name=nginx state=restarted

实例3-批量修改nginx配置文件,然后只拷贝配置文件到远程主机,不做其他操作

方法:加标签,tags, -t对应指定标签。

[root@elk01 playbooks]# cat playbook01-20220329bak02tags.yaml
- hosts: test03
remote_user: root
tasks:
- name: install nginx
yum: name=nginx state=installed
- name: copy nginx configue file
copy: src=/playbooks/nginx.conf dest=/etc/nginx/nginx.conf
notify: restart nginx
tags: configfile
- name: start nginx
service: name=nginx state=started
handlers:
- name: restart nginx
service: name=nginx state=restarted

[root@elk01 playbooks]# ansible-playbook -t configfile playbook01.yaml

实例4-批量修改nginx配置文件,拷贝配置文件到远程主机,只执行指定配置标签的任务

先在本地修改nginx,然后执行,这样安装和启动任务等其他任务就不会执行,只执行对应标签的任务。

[root@elk01 playbooks]# cat playbook01.yaml
- hosts: test03
remote_user: root
tasks:
- name: install nginx
yum: name=nginx state=installed
- name: copy nginx configue file
copy: src=/playbooks/nginx.conf dest=/etc/nginx/nginx.conf
notify: restart nginx
tags: configfile
- name: start nginx
service: name=nginx state=started
handlers:
- name: restart nginx
service: name=nginx state=restarted


[root@elk01 playbooks]# ansible-playbook -t configfile playbook01.yaml

 

5. playbook tasks其它高级使用方式

1)when条件测试

when语句:在task中使用,jinja2语法格式。

when条件测试简单示例01如下:

tasks:
- name: install conf file to centos7
template: src=files/nginx.conf.c7.j2
when: ansible_distribution_major_version =="7"
- name: install conf file to centos6
template: src=files/nginx.conf.c6.j2
when: ansible_distribution_major_version == "6"

when条件测试简单示例02如下:

- hosts: test03
remote_user: root
tasks:
- name: install httpd
yum: name=httpd state=latest
when: ansible_os_family == "RedHat"
- name: install apache2
apt: name=apache2 state=latest
when: ansible_os_family == "Debian"

2)迭代

循环:迭代,需要重复执行任务。

比如:安装部署LNMP,即nginx,mysql-server,php等,如果只安装这3个程序包,其实就是3个任务,那这样的话,本质就是任务一样,只是安装包不同而已,所以这个时候,playbook tasks支持迭代,有迭代这个功能,可以使用条件判断,就可以很好解决task重复问题。

对迭代项的引用,固定变量名为"item",而后,要在task中使用with_items给定要迭代的元素列表;
列表方法:
字符串
字典

列表:
- name: install some packages
yum: name={{ item }} state=present
with_items:
- nginx
- memcached
- php-fpm

字典:
- name: add some groups
group: name={{ item }} state=present
with_items:
- group11
- group12
- group13
- name: add some users
user: name={{ item.name }} group={{ item.group }} state=present
with_items:
- { name: 'user11',group: 'group11' }
- { name: 'user12',group: 'group12' }
- { name: 'user13',group: 'group13' }

 

循环,迭代简单实例(列表)01:
- hosts: test03
remote_user: root
tasks:
- name: install {{ item }} package
yum: name={{ item }} state=latest
with_items:
- nginx
- tomcat
- mariadb-server
- redis


循环,迭代简单实例(列表)02:安装tomcat
- hosts: test03
remote_user: root
tasks:
- name: install {{ item }} package
yum: name={{ item }} state=latest
with_items:
- tomcat
- tomcat-webapps
- tomcat-admin-webapps


循环,迭代简单实例(字典):暂略。

6. roles(roles企业级应用)

        roles也是playbook核心元素之一。

实例:3个节点,其中1个节点安装nginx,另外2个节点安装tomcat;tomcat用于web应用服务,nginx作为反向代理,代理后端2个tomcat。

3个节点规划如下:

10.96.211.102(nginx,其反向代理后端两个tomcat)
10.96.211.103(tomcat)
10.96.211.104(tomcat)

 

ansible roles安装如上三个节点nginx,tomcat步骤如下:

[root@elk01 ~]# ansible all --list-hosts
hosts (3):
10.96.211.102
10.96.211.103
10.96.211.104

[root@elk01 ~]# ansible lb --list-hosts
hosts (1):
10.96.211.102

[root@elk01 ~]# ansible web --list-hosts

hosts (2):
10.96.211.103
10.96.211.104

 

创建nginx roles


步骤 1):创建nginx和tomcat 两个roles角色目录
[root@elk01 ansible]# pwd
/etc/ansible


[root@elk01 ansible]# mkdir -pv roles/{nginx,tomcat}/{files,templates,tasks,handlers,vars,meta,default}

步骤 2):先开发Nginx roles角色目录
[root@elk01 nginx]# pwd
/etc/ansible/roles/nginx

nginx tasks:
[root@elk01 nginx]# cat tasks/main.yml
- name: install nginx
yum: name=nginx state=latest
when: ansible_os_family == "RedHat"
- name: install conf
copy: src=lb.conf dest=/etc/nginx/conf.d/
tags: conf
notify: restart nginx
- name: start nginx
service: name=nginx state=started enabled=yes

nginx handlers:
[root@elk01 nginx]# cat handlers/main.yml
- name: restart nginx
service: name=nginx state=restarted

步骤 3):提供nginx需要复制的文件:
[root@elk01 nginx]# cat files/lb.conf
upstream web {
server 10.96.211.103:8080;
server 10.96.211.104:8080;

}

server {
listen 80;
server_name 10.96.211.102;
location / {
proxy_pass http://web;

}


}

步骤 4):在任意目录下,创建nginx playbooks
[root@elk01 ~]# mkdir playbooks

[root@elk01 ~]# cd playbooks/
[root@elk01 playbooks]# pwd
/root/playbooks

步骤 5):编辑nginx playbooks
[root@elk01 playbooks]# cat nt.yml
- hosts: lb
remote_user: root
roles:
- nginx

步骤 6):预测试运行playbooks(安装NGINX):

[root@elk01 playbooks]# pwd
/root/playbooks
[root@elk01 playbooks]# ansible-playbook -C nt.yml

PLAY [lb] ***************************************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************************
ok: [10.96.211.102]

TASK [install nginx] ****************************************************************************************************************************************
changed: [10.96.211.102]

TASK [nginx : install conf] *********************************************************************************************************************************
changed: [10.96.211.102]

TASK [start nginx] ******************************************************************************************************************************************
changed: [10.96.211.102]

RUNNING HANDLER [restart nginx] *****************************************************************************************************************************
changed: [10.96.211.102]

PLAY RECAP **************************************************************************************************************************************************
10.96.211.102 : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

 

创建tomcat roles


步骤 1):设计/开发tomcat主机 roles角色

[root@elk01 tomcat]# pwd
/etc/ansible/roles/tomcat

[root@elk01 tomcat]# ls
default files handlers meta tasks templates vars

定义tomcat tasks:
[root@elk01 tomcat]# cat tasks/main.yml
- name: install package
yum: name={{ item }} state=latest
with_items:
- tomcat
- tomcat-admin-webapps
- tomcat-webapps
- tomcat-docs-webapp
when: ansible_os_family == "RedHat"
- name: start tomcat
service: name=tomcat state=started enabled=yes

如果远程主机没有安装JDK,那么想要通过playbooks (roles)安装JDK,需要创建JDK roles角色,创建步骤如下:创建步骤类似如上nginx,tomcat roles角色创建!


步骤 2):编辑tomcat playbooks:

[root@elk01 playbooks]# pwd
/root/playbooks
[root@elk01 playbooks]# vim nt.yml
You have new mail in /var/spool/mail/root
[root@elk01 playbooks]# cat nt.yml
- hosts: lb
remote_user: root
roles:
- nginx

- hosts: web
remote_user: root
roles:
- tomcat

步骤 3):预测试运行playbooks(安装NGINX和tomcat):

[root@elk01 playbooks]# ansible-playbook -C nt.yml

 

步骤 4):正式运行playbooks(安装NGINX和tomcat):

[root@elk01 playbooks]# ansible-playbook  nt.yml

posted on 2022-03-29 16:09  永远的大空翼  阅读(553)  评论(0编辑  收藏  举报