playbook
playbook介绍
playbook剧本是由一个或多个ansible模块组成的列表。playbook的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色,task实际是调用ansible的一个module,将过个task组织在一个playbook中,既可以让他们 联合起来,按事先编排的机制执行预定义的动作,playbook文件是采用yaml格式编写的
playbook命令
格式:
ansible-playbook <filename.yaml> [options]
常见选项:
选项 | 详解 |
–C、–check | 预执行,不会真正执行,用来检测playbook是否有错 |
–list-hosts | 列出运行任务的主机 |
–list-tags | 列出tag |
–list-task | 列出task |
–limit | 只针对主机列表中的主机执行 |
-t | 指定执行某个tags |
-v,-vv | 显示执行过程 |
playbook核心组件
- hosts:执行任务的远程主机列表
- tasks:任务集
- variables:内置变量或自定义变量在playbook中调用
- templates:模板,可替换模板文件中的变量并实现一些简单逻辑的文件
- handlers和notify:由特定条件出发的操作,满足条件才执行,否则不执行
- tags:标签,指定某条任务执行,用于选择运行playbook中的部分代码。
核心组件用法
hosts组件
hosts:playbook中的每一个paly的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中(/etc/ansible/hosts)
[nginx]
192.168.0.182
[httpd]
192.168.0.178
[web]
192.168.0.178
192.168.0.182
[ssh]
192.168.0.178:22
playbook案例:
- hosts: httpd
- host: web:!nginx
remote_user组件
remote_user:可用于host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于paly、全局或某任务;此外,可以再sudo时使用sudo_user指定sudo时切换的用户
playbook案例:
- hosts: web
remote_user: root
tasks:
- name: test connection
ping:
remote_user: test
sudo: yes
sudo_user: usertest
task列表和action组件
playbook的主体部分是task list,其中有一个或多个task,各个task按次逐个在hosts中指定的所有主机上执行,即所有主机上完成第一个task后再开始第二个task。
task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致。
每个task都应该有name,用于playbook的执行结果输出,建议其内容能清晰地描述任务。如果未提供name,则action的结果将用于输出。
task两种格式:
- action:module arguments
- module:arguments 建议使用
注意:shell和command模块后面跟命令,而非key=value
范例:
- hosts: web
remote_user: root
tasks:
- name: install web service
yum: name=httpd
- name: start web service
service: name=httpd state=started enable=yes
- hosts: web
remote_user: root
tasks:
- name: ls file
shell: ls /opt/
编写一个简单的playbook
- hosts: web
remote_user: root
tasks:
- name: "安装httpd服务"
yum: name=httpd
- name: "复制配置文件"
copy: src=/opt/httpd.conf dest=/etc/httpd/conf/
- name: "复制主页文件"
copy: src=/opt/index.html dest=/var/www/html/
- name: "启动服务"
service: name=httpd state=started enable=yes
playbook中使用handlers和notify
handler本质是task list,类似于MySQL中的触发器触发的行为,其中的task与前述的task并没有本质上的不同,主要用于当关注的资源发生变化是才会采取一定的操作。而notify对应的action可用于在每个play的最后被触发,这样可避免多次有改变发生时每次都执行同样的操作,仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler,也即notify中调用handler中定义的操作。
范例:
- hosts: web
remote_user: root
tasks:
- name: "安装httpd服务"
yum: name=httpd
- name: "复制配置文件"
copy: src=/opt/httpd.conf dest=/etc/httpd/conf/
- name: "复制主页文件"
copy: src=/opt/index.html dest=/var/www/html/
notify: restart httpd
- name: "启动服务"
service: name=httpd state=started enable=yes
handlers:
- name: restart httpd
service: name=httpd state=restart
通过再次执行这个playbook来改变httpd服务的配置文件时notify会进行监听,当配置文件改变时就执行名称为restart httpd的handlers
playbook中的tags使用
在playbook中可以利用tags组件为特定的task指定标签,当再次执行playbook时可以指定某一个tags的task执行,而非执行整个playbook
范例:
- hosts: web
remote_user: root
tasks:
- name: "安装httpd服务"
yum: name=httpd
- name: "复制配置文件"
copy: src=/opt/httpd.conf dest=/etc/httpd/conf/
- name: "复制主页文件"
copy: src=/opt/index.html dest=/var/www/html/
tags: conf
notify: restart httpd
- name: "启动服务"
service: name=httpd state=started enable=yes
handlers:
- name: restart httpd
service: name=httpd state=restart
ansible-play -t conf http.yaml
playbook中使用变量
变量名称仅能以字母、数字和下划线组成,且只能以字母开头
范例:
http_port=80
变量的调用方式:通过{{ http_port }}调用变量,注意花括号前后要有空格,有时用"{{ http_port }}"调用才生效
- 定义变量方式
通过命令行定义变量:
ansible-playbook -e http_port=80
- 在playbook中定义变量
- hosts: web
remote_user: root
gather_facts: no
vars:
- http_port: 80
- name: httpd
tasks:
- name: "安装httpd服务"
yum: name=httpd
- name: "复制配置文件"
copy: src=/opt/httpd.conf dest=/etc/httpd/conf/
- name: "复制主页文件"
copy: src=/opt/index.html dest=/var/www/html/
tags: conf
notify: restart httpd
- name: "启动服务"
service: name=httpd state=started enable=yes
handlers:
- name: restart httpd
service: name={{ name }} state=restart
playbook中when的使用
playbook中when用来进行判断是否满足执行条件,如果满足就执行,不满足跳过
范例:
- hosts: db
remote_user: root
tasks:
- name: install mysql-server
yum: name=mysql-server
when: {{ ansible_distribution_major_version }} == 6
- name: install mariadb-server
yum: name=mariadb-server
when: {{ ansible_distribution_major_version }} == 7
playbook中with_items的使用
playbook中with_items可以快速迭代更新重复的变量,例如批量添加用户,批量下载软件,其中items可以是列表也可以是字典
范例:
- hosts: db
remote_user: root
tasks:
- name: add user
user: name={{ item }} state=present
with_items:
- testuser1
- testuser2
- hosts: db
remote_user: root
tasks:
- name: add user
user: name={{ item.name }} state=present group={{ item.group }}
with_items:
- {name: 'user1',group: 'system'}
- {name: 'user2',group: 'system'}