playbooks剧本简介
playbooks是ansible更为强大的配置管理组件,实现基于文本文件编排执行的多个任务,且多次重复执行。其是使用YAML(Yet Another Markup Language),类似于半结构化语言,声明式配置,可读性较高。易于与脚本语言交互
核心组件
Tasks :任务
Variables : 变量
ansible_ssh_port : 指定ssh端口
ansible_ssh_user : 指定ssh用户
ansible_ssh_pass : 指定ssh用户登录认证密码,明文密码
ansible_sudo_pass : 指明sudo时候的密码
[webserver] 172.16.36.70 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass=zhenping.me
inventory参数:(用于hosts定义的主机后面,多个使用空格分隔)
template : 模板
Handles : 处理器
Roles : 角色,用于调度不同的playbooks
YAML语法格格式
任何数据结构都用缩进进来标识,可以嵌套
每一行是一个键值数据key:value,使用冒号分隔,若想在一行标识需要使用{}和,将多个kv分隔开
列表使用-标识
示例:
- hosts: webserver remote_user: root tasks: - name: install nginx yum: name=nginx state=present - name: start nginx service: name=nginx state=started enabled=true - name: install php-fpm yum: name=php-fpm state=present - name: start php-fpm service: name=php-fpm state=started enabled=true vars handlers - hosts: dbserver remote_user: root tasks: - name: install mysql yum: name=mysql state=present
playbook的变量
变量命名方式
字母、数字和下划线组成,仅能以字母开头
变量的各类
facts
由远程主机发回的主机特有的属性信息,这些信息被保存在ansible变量中,无须声明,可直接调用
自定义变量
~]# ansible-playbook test.yml -extra-vars “hosts=www user=zhenping”
通过命令行传递
通过roles传递
主机变量
定义在inventory中的主机之后的变量,直接传递给单个主机的变量
[webserver] 172.16.36.70 username=zhenping pass=zhenping 172.16.36.71
主机组变量
定义在inventory中的组上的变量
[webserver] 172.16.36.70 172.16.36.60 [webserver:vars] var1=value var2=value
playbook调用变量的示例
- hosts: webserver remote_user: root vars: user: user2 pass: 123321 tasks: - name: add user user: name={{ user }} state=present - name: set password shell: /bin/echo {{ pass }} | passwd --stdin {{ user }}
手动运行playbook脚本时,传递变量(手动传递时,优先级要高于脚本中的变量)
ansible-playbook script.yml --extra-vars "username=ubunt"
ansible-playbook script.yml -e VARS
playbook的条件测试
在某task后面添加when子句,即可实现条件测试功能,when语句支持jinja2语法
####当主机的操作系统为redhat系列操作系统时,才执行yum安装
- hosts : webserver
remote_user : root
tasks :
- name: yum install keepalived
yum: name=keepalived state=present
when: ansible_os_family == "ReaHat"
- name: say hello
shell: /bin/echo "hello world"
playbook的迭代
在task中调用内置的Item变量,在某task后面使用with_items语句来定义元素列表
- hosts: webserver remote_user: root tasks: - name: user add user: name={{ item }} state=present with_items: - testuser1 - testuser2 - testuser3 - testuser4
- hosts: webserver
remote_user: root
tasks:
- name: user add
user: name={{ item.name }} state=present group={{ item.groups }}
with_items:
- { name: 'tom2', groups: 'tom' }
- { name: 'tom2', groups: 'tom2' }
playbook—handlers: 处理器、触发器
只有在其关注的条件满足时,才会被触发执行的任务
示例:只有原配置文件被修改了,才会重新加载服务
- hosts: webserver remote_user: root tasks: - name: yum install nginx yum: name=nginx state=present - name: start nginx service: name=nginx state=started enabled=true - name: copy configuration file copy: src=/etc/nginx/nginx.conf dest=/etc/nginx/nginx.conf notify: restart nginx handlers: - name: restart nginx service: name=nginx state=reloaded
原文作者:魏镇坪