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