Playbook 是由一个或多个play组成的列表,主要功能是将task定义好的角色归并为一组进行统一管理,也就是经过Ansible的模板将多个play组织在一个Playbook中运行。php
playbook由YMAL语言编写。YAML参考了其余多种语言,包括:XML、C语言、Python、Perl等。MAL格式是相似于JSON的文件格式,便于人理解和阅读,同时便于书写。如下为playbook经常使用到的YMAL格式。html
- YMAL中的列表元素以”-”开头而后紧跟着一个空格,后面为元素内容。就像这样- host。
- 同一个列表中的元素应该保持相同的缩进。不然会被当作错误处理。
- playbook中hosts,variables,roles,tasks等对象的表示方法都是键值中间以”:”分隔,”:”后面还要增长一个空格。
- 剧本以.yml后缀
Playbook自己由如下各部分组成:
(1)Hosts:运行指定任务的目标主机;
(2)Tasks:任务,即调用模块完成的操做;
(3)Variables:变量;
(4)Templates:模板;
(5)Handles:处理器,当某条件知足时,触发执行的操做;
(6)Roles:角色mysql
Play的主体是任务列表。任务列表中的任务依照次序逐个在hosts中指定的全部主机上执行,若是发生错误会将全部已执行任务回滚。nginx
task的任务是按照指定的参数去执行模块。web
(1)action:moudle optionssql
(2)moudle:options,其中后者能够实现向后兼容。shell
注意:在Ansible自带模块中,command模块和shell模块只须要一个列表定义便可,无需使用key=value格式。apache
Handlers用于当关注的资源发生变化时所采起的操做。使用tags让用户选择跳过没有变化的代码,只运行Playbook中发生变化的部分代码。vim
(1) 某任务的状态在运行后为changed时,可经过“notify”通知给相应的handlers;浏览器
(2) 任务能够经过“tags“打标签,经过 ansible-playbook命令 使用 --tags选项能实现仅运行指定的tasks。
示例:
vim /etc/ansible/nginx.yml - hosts: nginx remote_user: root tasks: - name:yum install epel-release -y #安装epel源 yum: name=epel-release state=latest - name: yum install nginx -y #安装nginx yum: name=nginx state=latest - name: copy nginx.conf #拷贝配置文件 copy: src=/opt/nginx.conf dest=/etc/nginx/nginx.conf backup=yes notify: - reload #会触发handlers中名字为reload的任务 tags: - reloadnginx - name: start nginx #启动nginx服务 service: name=nginx state=started tags: - startnginx handlers: - name: reload #重载配置 service: name=nginx state=reloaded 执行:ansible-playbook nginx.yml
修改配置文件内容以后执行时调用标签ansible-playbook nginx.yml --tags= "reloadnginx",就会跳过安装步骤直接重载配置文件并启动服务。
(1) facts:可直接调用
注意:可以使用setup模块直接获取目标主机的facters
ansible xxx -m setup
(2) 用户自定义变量:
经过命令行传递变量
ansible-playbook xxx.yml -extra-vars "host-www user-mageedu"
vars: - var1: value1 - var2: value2
(3)经过roles传递变量
(4)Host Inventory(主机清单)
- 主机变量
示例:
[webservers] www1.accp.com http_port=80 #添加主机变量http_port www2.accp.com http_port=8080
- 组变量
示例:
[servers-vars] ntp_server=ntp.example.org #指定主机变量 nfs_server=nfs.example.org
- 组嵌套
示例:
[apache] httpd1.example.org httpd2.example.org [nginx] ngx1.example.org ngx2.example.org [webservers:children] apache nginx
示例:使用变量package来代替软件包,变量service来代替服务名。
- hosts: nginx remote_user: root vars: - package: vsftpd - service: vsftpd tasks: - name: install httpd package yum: name={{package}} state=latest ##安装最新版本的httpd - name: start httpd server service: name={{service}} enabled=true state=started ##开启服务
Jinja是基于 Python的模板引擎。 Template类是 Jinja的另外一个重要组件,能够看
做是一个编译过的模板文件,用来产生目标文本,传递 Python的变量给模板去替换模
板中的标记。
示例
从被管理端复制一份httpd.conf到管理端/opt/template 并作以下修改 mkdir /opt/template cp /opt/template/httpd.conf /opt/httpd.conf.j2 vim /opt/httpd.conf.j2 Listen {{http_port}} ServerName {{server_name}} vim /etc/ansible/hosts [httpd] 192.168.100.144 http_port=192.168.100.144:808 server_name=www.yun.com:808 # 在hosts文件为主机配置变量 vim httpd.yml - hosts: httpd remote_user: root vars: - package: httpd - service: httpd tasks: - name: install httpd package yum: name={{package}} state=latest #安装最新版本的httpd - name: install configure file template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf #使用模板并根据变量进行配置 notify: - restart httpd #调用handler - name: start httpd server service: name={{service}} enabled=true state=started #开启服务 handlers: - name: restart httpd service: name={{service}} state=restarted
(1) when 语句:只须要在task以后添加when语句便可。
示例:
vim /etc/ansible/when.yml - hosts: nginx remote_user: root vars: - username: user10 tasks: - name: create {{username}} user user: name={{username}} when: ansible_fqdn=="promote.cache-dns.local" 执行:ansible-playbook when.yml 就会建立在nginx组的主机上。
(2)迭代:直接将须要迭代的内容定义为item变量并进行引用,而后经过with_items语句来指明迭代的元素。
示例:
vim /etc/ansible/items.yml - hosts: nginx remote_user: root tasks: - name: install packages #安装with_items中列出的包 yum: name={{ item }} state=latest with_items: - php - php-mysql 执行:ansible-playbook items.yml 就会安装列表中的包
示例:
vim adduser.yml - hosts: httpd remote_user: root tasks: - name: add some groups #添加一些组 group: name={{ item }} state=present with_items: - group1 - group2 - group3 - name: add some user #建立用户到对应的组 user: name={{ item.name }} group={{ item.group }} state=present with_items: - { name: 'user1', group: 'group1' } - { name: 'user2', group: 'group2' } - { name: 'user3', group: 'group3' } 执行:ansible-playbook adduser.yml 就会建立对应的用户及组
Ansible为了层次化、结构化地组织 Playbook,使用了角色( roles),能够根据层
次结构自动装载变量文件、 tasks以及 handlers等。只须要在 Playbook中使用 include
指令便可使用 roles。简单来说, roles就是经过分别将变量、文件、任务、模块及处理
器设置于单独的目录中,便捷地使用他们。
建立roles时的注意事项:
(1)目录名同角色名的定义
(2)目录结构有固定的格式:
- files:用来存放由copy模块或script模块调用的文件。
- templates:用来存放jinjia2模板。
- tasks:至少有一个main.yml文件,定义各tasks。
- handlers:有一个main.yml文件,定义各handlers。
- vars:有一个main.yml文件,定义变量。
- default:有一个main.yml文件,定义默认变量。
- meta:有一个main.yml文件,定义此角色的特殊设定及其依赖关系。
注意:在每一个角色命令的目录中分别建立files、handlers、tasks、templates、meta、default和vars目录,用不到的目录能够建立为空目录,但不能够不建立。
示例:定制三个角色:httpd、mysql、php
(1)在roles目录下生成对应的目录结构
mkdir -pv /etc/ansible/roles/{httpd,mysql,php}/{files,templates,vars,tasks,handlers,meta,default}
(2)在每一个角色的handlers、tasks、meta、default、vars目录下建立main.yml文件,千万不能自定义。
touch /etc/ansible/roles/{httpd,mysql,php}/{default,vars,tasks,meta,handlers}/main.yml
(3)定义每一个角色中tasks/main.yml的配置文件。
------编写httpd模块------ vim /etc/ansible/roles/httpd/tasks/main.yml - name: ensure apache is at the latest version yum: name={{item}} state=latest with_items: - httpd - httpd-devel - name: conf template: src=/etc/ansible/roles/httpd/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf tags: - httpdconf notify: - new conf to reload tags: - reload - name: start service service: name=httpd enabled=true state=started
-------编写mysql模块------- vim /etc/ansible/roles/mysql/tasks/main.yml - name: ensure mysql is at the latest version yum: name={{item}} state=latest with_items: - mariadb - mariadb-server - mariadb-libs - mariadb-devel - name: start service service: name=mariadb enabled=true state=started
-------编写php模块----- vim /etc/ansible/roles/php/tasks/main.yml - name: ensure php is at the latest version yum: name={{item}} state=latest with_items: - php - php-mysql - php-gd - php-ldap - php-odbc - php-pear - php-xml - php-xmlrpc - php-mbstring - php-snmp - php-soap - curl - curl-devel - php-bcmath
(4)修改变量文件vars/main.yml
vim /etc/ansible/roles/httpd/vars/main.yml http_port : 80 #添加变量 server_name : www.yun.com:80
(5)定义handlers文件handlers/main.yml
vim /etc/ansible/roles/httpd/handlers/main.yml - name: new conf to reload service: name=httpd state=reloaded
(6)定义/etc/ansible/lamp.yml的playbook文件
-----编写roles示例----- vi /etc/ansible/lamp.yml - hosts: lamp remote_user: root roles: - httpd - mysql - php
(7)执行lamp.yml的playbook文件
ansible-playbook lamp.yml
(8)前往部署lamp的主机上编写php测试页,打开浏览器看网页是否正常。
vim /var/www/html/index.php <?php phpinfo(); ?>
打开浏览器输入http://192.168.100.145/index.php综上步骤,lamp架构部署成功。