一、playbook
playbook是剧本的意思
通过 task 调用 ansible 的模块将多个 play 组织在一 个playbook中运行。
组成:
- Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行
- Variables:变量
- Templates:模板
- Handlers:处理器,当changed状态条件满足时,(notify)触发执行的操作
- Roles:角色
二、playbook案列
1.配置yaml文件
vim test1.yaml
--- #yaml文件以---开头,以表明这是一个yaml文件,可省略
- name: first play #定义一个play的名称,可省略
gather_facts: false #设置不进行facts信息收集,这可以加快执行速度,可省略
hosts: webservers #指定要执行任务的被管理主机组,如多个主机组用冒号分隔
remote_user: root #指定被管理主机上执行任务的用户
tasks: #定义任务列表,任务列表中的各任务按次序逐个在hosts中指定的主机上执行
- name: test connection #自定义任务名称
ping: #使用 module: [options] 格式来定义一个任务
- name: disable selinux
command: '/sbin/setenforce 0' #command模块和shell模块无需使用key=value格式
ignore_errors: True #如执行命令的返回值不为0,就会报错,tasks停止,可使用ignore_errors忽略失败的任务
- name: disable firewalld
service: name=firewalld state=stopped #使用 module: options 格式来定义任务,option使用key=value格式
- name: install httpd
yum: name=httpd state=latest
- name: install configuration file for httpd
copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf #这里需要一个事先准备好的/opt/httpd.conf文件
notify: "restart httpd" #如以上操作后为changed的状态时,会通过notify指定的名称触发对应名称的handlers操作
- name: start httpd service
service: enabled=true name=httpd state=started
handlers: #handlers中定义的就是任务,此处handlers中的任务使用的是service模块
- name: restart httpd #notify和handlers中任务的名称必须一致
service: name=httpd state=restarted
Ansible在执行完某个任务之后并不会立即去执行对应的handler,而是在当前play中所有普通任务都执行完后再去执行handler,这样的好处是可以多次触发notify,但最后只执行一次对应的handler,从而避免多次重启。
2.运行playbook
ansible-playbook ceshi1.yaml --syntax-check #检查yaml文件的语法是否正确
ansible-playbook ceshi1.yaml --list-task #检查tasks任务
ansible-playbook ceshi1.yaml --list-hosts #检查生效的主机
ansible-playbook ceshi1.yaml --start-at-task='install httpd' #指定从某个task开始运行
没问题后可以启动
[root@localhost opt]#ansible-playbook ceshi1.yaml
发现报错了
再次启动
3.定义、引用变量
---
- name: bianliang
hosts: james23
remote_usr: root
vars: #定义变量
- groupname: nba
- usrname: nginx
tasks:
- name: create group
group: name={{groupname}} system=yes gid=305
- name: create user
user: name={{username}} uid=305 group={{groupname}}
- name: copy file
copy: content="{{ansible_default_ipv4}}" dest=/opt/nba.txt
~ 在setup模块中可以获取facts变量信息
报错
ansible-playbook ceshi2.yaml -e "username=nginx"
再去另一台主机上查看
4.when条件判断
在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。
用来进行条件判断的关键字 ,其作用只在你指定条件下会执行下面的任务,当条件为真时,任务就会被执行,否则任务将被跳过
---
- name: restart host
host: james23
remote_user:root
tasks:
- name: shutdown host
command: /sbin/shutdown -r now
when: ansible_default_ipv4.address == "192.168.21.40"
ansible-playbook ceshi3.yaml
5.迭代
Ansible提供了很多种循环结构,一般都命名为with_items,作用等同于 loop 循环。
---
- name: xuzhou
hosts: james23
tasks:
- name: create wwe
file: path={{item}} state=directory
with_items:
- /opt/aa
- /opt/bb
- /opt/cc
- /opt/dd
~
去另一台主机上查看