目录
Playbook的组成部分
实例模版
切换用户
指定声明用户
声明和引用变量,以及外部传参变量
playbook的条件判断
编辑
习题
编辑
ansible-playbook的循环
item的循环
编辑
list循环
编辑
together的循环(列表对应的列,数据结合的方式循环)
编辑
nested循环
Templates模块
实验httpd
yml文件
实验nginx
任务标签的种类
任务标签
自定义标签
实验
Role模块
roles结构
实验
Playbook的组成部分
1、task 任务:包含要在目标主机上执行的操作,使用模块定义这些操作,每个任务都是一个模块的调用
2、variables 变量:存储和传递数据,变量可以自定义,可以在Playbook当中定义为全局变量,也可以外部传参
3、Templates 模版:用于生成配置文件,模版是包含占位符的文件,占位符由Ansible在执行时转化为变量值
4、handler 处理器:当需要有变更的时候,可以执行触发器
5、Roles 角色:是一种组织和封装Playbook的,允许把相关的任务,变量,模版和处理器组成一个可复用的单元
实例模版
vim test.yml
#this is our first playbook
- name: first play
#一个name就是一个任务名,名字可以不写
gather_facts: false
#是否收集目标主机的系统信息,false就是不收集
hosts: 20.0.0.11
#执行的目标主机
remote_user: root
#在目标主机执行的用户
tasks:
- name: ping test
ping:
- name: close selinux
command: '/sbin/setenforce 0'
ignore_errors: True
- name: close firewalld
service: name=firewalld state=stopped
- name: install httpd
yum: name=httpd
- name: start httpd
service: enabled=true name=httpd state=started
- name: editon index.html
shell: echo "this is httpd" > /var/www/html/index.html
notify: restart httpd
handlers:
- name: restart httpd
service: name=httpd state=restarted
#检查yaml文件的语法是否错误
ansible-playbook 文件名 --syntax-check
#查看yml文件里面有几个任务
ansible-playbook 文件名 --list-task
#检查生效的目标主机
ansible-playbook 文件名 --list-hosts
#运行命令
ansible-playbook 文件名
ansible-playbook 文件名 --start-at-task='install httpd'
-k(–ask-pass):用来交互输入ssh密码
-K(-ask-become-pass):用来交互输入sudo密码
-u:指定用户
切换用户
关闭免密
vim /etc/ansible/ansible.cfg
71行
注释掉
编写脚本
hosts: 20.0.0.11
#执行的目标主机
remote_user: xiaobu
become: yes
become_user: root
指定声明用户
在脚本里不声明用户,运行时,声明用户
ansible-playbook 脚本 -u root -k
声明和引用变量,以及外部传参变量
vim test1.yml
#this is second playbook!
#声明和引用变量,以及外部传参变量
- hosts: 20.0.0.11
remote_user: root
vars:
groupname: xiaobu1
username: xiaokai
#字典方式: key-value
#vars:
#-
#-
#列表list
tasks:
- name: create group
group:
name: "{{ groupname }}"
system: yes
gid: 111
- name: create user
user:
name: "{{ username }}"
uid: 1011
group: "{{groupname}}"
shell: /sbin/nologin
- name: copy file
copy:
content: "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}"
#获取目标主机的IP地址,然后复制到目标文件
# 包含所有主机变量的字典
#inventory_hostname 目标主机名
#ansible_default_ipv4 获取目标主机名
#['ansible_default_ipv4']['address'] 索引
dest: /opt/test.txt
外部传参变量
vim test1.yml
#this is second playbook!
#声明和引用变量,以及外部传参变量
- hosts: 20.0.0.12
remote_user: root
tasks:
- name: create group
group:
name: "{{ groupname }}"
system: yes
gid: 111
- name: create user
user:
name: "{{ username }}"
uid: 1011
group: "{{groupname}}"
shell: /sbin/nologin
- name: copy file
copy:
content: "{{ hostvars[inventory_hostname]['ansible_default_ipv4']['address'] }}"
dest: /opt/test.txt
外部传参
ansible-playbook test1.yml -e 'username=xiaobu2 groupname=xiaokai1'
playbook的条件判断
when 是一个比较常见的应用长江,实现满足条件即执行,不满足条件即跳过的任务,when是满足条件即执行,不满足不执行。
vim test2.yml
#this is when test
- hosts: all
#可以用主机的IP地址,也可以是用组名,也可以用all
remote_user: root
tasks:
- name: test when
debug:
msg: '位置判断'
#打印相当于echo msg: 输出的内容,debug: 用于脚本的调试,在正式脚本中可以去除
when: ansible_default_ipv4.address == '20.0.0.11'
#when: ansible_default_ipv4.address == '20.0.0.11'或者 when: inventory_hostname != '20.0.0.11'
#ansible_default_ipv4.address != '20.0.0.11' 取反
习题
现在hosts all
条件1 IP 11:安装nginx
条件2 IP 12:安装httpd
#this is when test
- hosts: all
remote_user: root
tasks:
- name: nginx
yum: name=nginx
when: ansible_default_ipv4.address == '20.0.0.11'
- name: nginx info
debug:
msg: '安装nginx'
when: ansible_default_ipv4.address == '20.0.0.11'
- name: httpd
yum: name=httpd
when: ansible_default_ipv4.address == '20.0.0.12'
- name: httpd info
debug:
msg: '安装httpd'
when: ansible_default_ipv4.address == '20.0.0.12'
ansible-playbook的循环
ansible有多种循环格式,with_items 循环遍历
item的循环
声明变量item,playbook的内置变量,with_items,会把item的值,遍历列表当中的a,b,c,d
vim test4.yml
- hosts: 20.0.0.12
remote_user: root
gather_facts: false
tasks:
- debug:
msg: "{{ item }}"
with_items:
- [a,b,c,d]
- [1,2,3,4]
#声明变量item,playbook的内置变量,with_items,会把item的值,遍历列表当中的a,b,c,d
#虽然我声明的列表是两个,但是with_items还是把两个列表当成整体进行遍历
list循环
列别分组循环
#分组打印
with_list:
- [a,b,c,d]
- [1,2,3,4]
- hosts: 20.0.0.12
remote_user: root
gather_facts: false
tasks:
- name: create file
file:
path: "{{ item }}"
state: touch
with_items:
- /opt/a
- /opt/b
- /opt/c
- /opt/d
- /opt/1
- /opt/2
- /opt/3
- /opt/4
together的循环(列表对应的列,数据结合的方式循环)
组循环,列表当中的值一一对应打印出来
- hosts: 20.0.0.12
remote_user: root
gather_facts: false
tasks:
- debug:
msg: "{{ item }}"
with_together:
- [a,b,c,d]
- [1,2,3,4]
- [A,B,C]
nested循环
相当于双循环,第一层定义循环的次数,第二层表示第一层的每一个元素会循环几次
列表里面的元素定义了循环的次数,第二层列表,相当于内循环
- hosts: 20.0.0.12
remote_user: root
gather_facts: false
tasks:
- debug:
msg: "{{ item }}"
with_nested:
- [a,b,c,d]
- [1,2,3,4]
Templates模块
Jinja模版架构,通过模版可以实现向模版文件传参(Python转义),把占位符参数传到配置文件中去
生成一个目标文本文件,传递变量到需要配置文件当中
实验httpd
yum -y install httpd
cd /etc/httpd/conf
cp httpd.conf /opt/httpd.conf.j2
httpd.conf.j2 在文件当中配置的是占位符(声明的变量)
/etc/ansible/hosts 配置了主机的占位符名称和j2文件中的占位符一致(定义参数:占位符的参数的参数声明好)
playbook当中,Template模块来吧参数传给目标的主机的配置文件
vim /opt/httpd.conf.j2
42行
Listen {{http_port}}
95行
ServerName {{server_name}}
119行
DocumentRoot "{{root_dir}}"
修改ansible配置文件
20.0.0.11 http_port=20.0.0.11:80 server_name=www.xiaobu.com:80 root_dir=/etc/httpd/htdocs
20.0.0.12 http_port=20.0.0.12:80 server_name=www.xiaobu.com:80 root_dir=/etc/httpd/htdocs
yml文件
- hosts: all
remote_user: root
vars:
- package: httpd
- service: httpd
tasks:
- name: install httpd
yum: name={{package}}
- name: install config file
template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
- name: create root_dir
file:
path: /etc/httpd/htdocs
state: directory
- name: start httpd
service: name={{service}} enabled=true state=started
handlers:
- name: restart httpd
service: name={{service}} state=restarted
实验nginx
cp /etc/nginx/nginx.conf /opt/nginx.conf.j2
修改nginx.的配置文件
server {
listen {{nginx_port}};
server_name {{servername}};
root {{root_dir}};
}
修改ansible的配置文件
20.0.0.11 nginx_port=8080 servername=www.xiaobu.com root_dir=/etc/nginx/html
20.0.0.12 nginx_port=8080 servername=www.xiaobu.com root_dir=/etc/nginx/html
yml文件
- hosts: all
remote_user: root
vars:
- package: nginx
- service: nginx
tasks:
- name: install nginx
yum: name={{package}}
- name: install config file
template: src=/opt/nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify:
- restart nginx
- name: create root_dir
file:
path: /etc/nginx/html
state: directory
- name: start nginx
service: name={{service}} enabled=true state=started
handlers:
- name: restart nginx
service: name={{service}} state=restarted
tags模块
标签模块,可以在playbook当中为任务设定标签(tags),我们在运行playbook是可以通过指定任务标签,来实现只运行设定的标任务
任务标签的种类
always 不管你是否指定了运行标签,任务都会执行
never 即使运行了指定标签,该任务也不会执行
debug 调试任务
任务标签
- hosts: all
remote_user: root
gather_facts: false
tasks:
- name: tag debug
debug:
msg: "this is test1"
tags:
- debug
- name: tag setup
setup:
tags:
- setup
- name: tag always
debug:
msg: "run"
tags:
- always
- name: tag never
debug:
msg: "never run"
tags:
- never
自定义标签
per_tasks 指定标签之前的任务
post_tasks 运行指定标签之后的任务
- hosts: all
remote_user: root
gather_facts: false
tasks:
- name: tag always
debug:
msg: "run"
tags:
- xiaobu
- name: tag never
debug:
msg: "never run"
tags:
- xiaokai
实验
1、在目标主机上touch xiaobu.txt always
2、在目标主机复制文件opt/xiaobu2.txt 标签never
实验目的
第一运行playbook 不指定标签查看文件生成情况
指定标签为never,查看文件生成情况
- hosts: all
remote_user: root
gather_facts: false
tasks:
- name: touch file
file:
path: /opt/xiaobu.txt
state: touch
tags:
- always
- name: copy file
copy:
src: /opt/123
dest: /opt/123
tags:
- never
Role模块
Role模块又叫角色
ansible层次化,结构化的组织playbook,使用了rolse(角色)
可以根据层次结构,自动装载变量文件,task,以及handler等等
Roles:分别把变量 文件 任务 模块以及处理器,放在单独的目录当中,使用roles模块来一键调用这些文件
roles结构
--- web---总目录,角色
files 存放copy和script模块调用的文件
Templates 存放j2的模块文件
tasks 包含任务的目录 ---- mail.yml 角色运行的任务
handlers 包含处理器的目录 ---- main.yml
vars 存放变量的目录 ----main.yml
defaults 包含默认变量的目录 -----main.yml
meta 包含元信息的目录----main.yml
在总目录下site.yml,用来调用所有配置文件
site.yml文件
- hosts: 20.0.0.11
remote_user: root
roles:
- httpd
- mysql
- php
实验
三个服务
http mysql php
#安排剧本
cd /etc/ansible/roles/
mkdir httpd mysql php
cd httpd
mkdir files templates tasks handlers vars defaults meta
touch {defaults,vars,tasks,meta,handlers}/main.yml
cd mysql
mkdir files templates tasks handlers vars defaults meta
touch {defaults,vars,tasks,meta,handlers}/main.yml
cd php
mkdir files templates tasks handlers vars defaults meta
touch {defaults,vars,tasks,meta,handlers}/main.yml
配置httpd
vim tasks/main.yml
- name: install httpd
yum: name={{pkg}}
- name: start httpd
service: enabled=true name={{svc}} state=started
vim httpd/vars/main.yml
pkg: httpd
svc: httpd
配置mysql
vim mysql/tasks/main.yml
- name: isntall mysql
yum: name={{pkg}}
- name: start mysql
service: enabled=true name={{svc}} state=started
vim mysql/vars/main.yml
pkg:
- mariadb
- mariadb-server
svc: mariadb
配置php
vim php/tasks/main.yml
- name: install php
yum: name={{pkg}}
- name: start php
service: enabled=true name={{svc}} state=started
vim php/vars/main.yml
pkg:
- php
- php-fpm
svc: php-fpm