ansible 剧本(playbooks)
1.什么是Playbooks?
ansible命令可以创建远程操控我们的主机,虽然ansible的功能已经很ok了,但是面对大型自动化项目,几句简单的ansible命令还是上不了台面.
这时就需要ansible-playbook的登场了. 规范化,按照配置说明配合ansible命令来应对大型复杂的自动化服务器运维工作.
2.Playbooks Language example
Playbooks 语言是以YAML 格式表示,并且有最小的语法,有意的说明它不是一个编程或者脚本语言,它是一种写配置文件的语言。简洁可读性高。类似于java的xml
yaml 语法示例 p1.yml
- hosts: web
tasks:
- name: creategroup
group: name=tse
- name: createuser
user: name=treasure
3.ansible-palybooks命令格式
执行顺序:从上往下
特性:幂特性, 不管执行多少遍,结果都是一样的
ansibel-playbook [options] playbook.yml
-C, --check # 检查 检查并不会落实到实际操作上
-f FORKS, --forks=FORKS # 用来做并发
--list-hosts # 列出主机列表
--syntax-check #语法检查
4.简单用法
ansible-playbook p1.yml
5.传参
p2.yml
- hosts: web
task:
- name: create{{ user }}
user: name={{user}}
第一种方式
ansible-playbook -e 'user=t1' p2.yml
第二种方式
修改ansible的host文件
[web]
192.168.13.130 user=t21
192.168.13.130 user=t22
第三种方式
[web:vars] # 表示被控机组的参数
user=t3
第四种方式
p2.yml
- hosts: web
vars:
- user: t4
task:
- name: create{{ user }}
user: name={{user}}
第五种方式
p3.yml
ps: bc就是linux的计算器
- hosts: web
task:
- name: sum
shell: echo 1+2|bc
register: user
- name: createuser
user: name={{user.stdout}}
传参方式的优先级
-e > playbook文件中的 vars > ansible中的host文件中的参数
Setup
ansible_all_ipv4_addresses # ipv4的所有地址
ansible_all_ipv6_addresses # ipv6的所有地址
ansible_date_time # 获取到控制节点时间
ansible_default_ipv4 # 默认的ipv4地址
ansible_distribution # 系统
ansible_distribution_major_version # 系统的大版本
ansible_distribution_version # 系统的版本号
ansible_domain #系统所在的域
ansible_env #系统的环境变量
ansible_hostname #系统的主机名
ansible_fqdn #系统的全名
ansible_machine #系统的架构
ansible_memory_mb #系统的内存信息
ansible_os_family # 系统的家族
ansible_pkg_mgr # 系统的包管理工具
ansible_processor_cores #系统的cpu的核数(每颗)
ansible_processor_count #系统cpu的颗数
ansible_processor_vcpus #系统cpu的总个数=cpu的颗数*CPU的核数
ansible_python # 系统上的python
ansible cache -m setup -a 'filter=*processor*' # 用来搜索
正则补充:
# * 匹配数量,表示0次或多次
# ? 匹配数量,表示0次或者一次
# . 除换行符以外的所有字符
# + 至少一次
# [123abc] 匹配内容 匹配其中一个
# () 分组
# {m} 次数,出现m次
# {m,} 至少出现m次
# {m,n} 出现m-n次
Playbook中的条件判断
- hosts: web
remote_user: root
tasks:
- name: createfile1
copy: content="Playbook真的牛批" dest=/tmp/a.txt
when: a=="3"
- name: createfile2
copy: content="yaml语法真的很严格" dest=/tmp/a.txt
when: a=="4"
当传入的参数a为3时 执行createfile1
当传入的参数a为4时 执行createfile2
Tags
- hosts: web
remote_user: rott
tasks:
- name: installnginx
yum: name=nginx
- name: copyfile
copy: src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf
tags: copyfile
- name: start
service: name=nginx state=started
ansible-playbook -t copyfile p7.yml
-t 后面加上tags
循环 with_items
一次创建多个用户怎么办呢?
- hosts: web
tasks:
- name: createusers
user: name={{item}}
with_items:
- t1
- t2
- t3
- name: creategroups
group: name={{item}}
with_item:
- tse1
- tse2
- tse3
创建多个用户,创建多个用户组
嵌套循环
- hosts: web
tasks:
- name: createusers
user: name={{item.user}} group={{item.group}}
with_items:
- {'user': t4, 'group': tse1}
- {'user': t5, 'group': tse2}
- {'user': t6, 'group': tse3}
创建用户并指定他们的用户组
Handlers
- hosts:
tasks:
- name: installredis
yum: name=redis
- name: copyfile
template: src=redis.conf dest=/etc/redis.conf
tags: copyfile
notify: restart
- name: start
service: name=redis state=started
handlers:
- name: restart
service: name=redis state=restarted
当copyfile任务被执行时候,会触发notify指向的Handlers中的restart
Roles
-
目录清晰
-
可以相互调用
roles文件夹
# 文件夹中里面是要创建的每一个角色,每一个角色一个文件夹
# 每一个角色的文件中里面都要有
# task(必须),templates,files,handlers,vars目录
# 每个目录都要有main.yml文件,通过import_tasks来调用
# 其中templates文件夹中的文件可以通过相对路径来调用
补充
setenforce 0 # 临时关闭selinux
iptables -F # 临时关闭防火墙
/etc/selinux/config # 永久关闭