playbooks
playbooks:Ansible的定制任务
Playbook基础组件构成:
- Inventory
- Modules
- Ad Hoc Commands
- Playbooks
Tasks: 任务,即调用模块完成的某操作
Variables: 变量
Tempaltes: 模板
Handlers: 处理器,由某事件触发执行的操作
Roles: 角色
Files:存放网页静态文件【index.html】或脚本文件
Ansible使用的YAML基础元素
变量
Inventory
条件测试
迭代
yml格式:
- host: web
remote_user:
task:
- task1
module_name: module_args
- task2
=============================================================================
# ansible-playbook ping.yml
示例1:Tasks
[root@master yml]# cat ping.yml
- hosts: web 远程主机:web组
remote_user: root 主机用户:root
tasks: 运行任务
- name: ping 任务名称
ping: 运行任务使用的模块
- hosts: web
remote_user: root
tasks:
- name: command
command: date
- hosts: web
remote_user: root
tasks:
- name: cron
cron: minute="*/10" job="/bin/echo hello" name="test_cron"
- hosts: web
remote_user: root
tasks:
- name: rzt_group
group: name=rzt_group gid=389 system=yes
- name: rzt
user: name=rzt uid=389 group=rzt_group system=yes
- hosts: web
remote_user: root
tasks:
- name: copy
copy: src=/etc/shadow dest=/tmp/shadow.bak
- hosts: web
remote_user: root
tasks:
- name: yum install
yum: name=httpd state=installed
- hosts: web
remote_user: root
tasks:
- name: shell
shell: echo "123456" | passwd --stdin rzt
------------------------------------------------
#如果运行出错或退出码不为零,且不影响后续操作,需要忽略掉,则:
tasks:
- name: shell
shell: echo "123456" | passwd --stdin rzt || /bin/true
或者
tasks:
- name: shell
shell: echo "123456" | passwd --stdin rzt
ignore_errors: True
------------------------------------------------
- hosts: web
remote_user: root
tasks:
- name: file
file: owner=rzt group=rzt_group mode=644 path=/tmp/shadow.bak
- hosts: web
remote_user: root
tasks:
- name: script
script: ping.sh
- hosts: web
remote_user: root
tasks:
- name: setup
setup:
- hosts: web
remote_user: root
tasks:
- name: httpd
service: enabled=true name=httpd state=started
示例2:Handlers
安装httpd,复制本地配置文件到远程主机,启动服务。
- hosts: web
remote_user: root
tasks:
- name: install httpd
yum: name=httpd state=latest
- name: copy httpd conf
copy: src=/home/httpd.conf dest=/etc/httpd/httpd.conf
- name: start httpd service
service: enabled=true name=httpd state=started
注:如果本地httpd配置文件里Listen端口是8080,远程主机httpd配置文件里的Listen端口是80,远程主机httpd的状态也是监听80端口,当执行playbook后,远程主机httpd配置文件里的Listen端口变成8080,但远程主机httpd的状态还是监听80端口。也就是说执行playbook后远程主机配置文件变了,httpd状态没变。
所以这里需要使用Handlers模块,当执行handlers模块后,远程主机监听端口也要随着同步过来的配置文件一样修改,改成和master端配置文件一样,监听状态也一样。
- hosts: web
remote_user: root
vars: 使用vars调用变量。
- package: httpd 将安装包httpd封装到package变量里
- service: httpd 将httpd服务封装到service变量里
tasks:
- name: install httpd
yum: name={{ package }} state=latest 调用httpd包名
- name: copy httpd conf
copy: src=/home/httpd.conf dest=/etc/httpd/httpd.conf
notify: 引入notify
- restarted httpd 定义notify名称
- name: start httpd service
service: enabled=true name={{ service }} state=started 调用service 包名
handlers: 使用handlers
- name: restarted httpd 引用notify名称
service: name=httpd state=restarted 执行重启动作
示例3:Variables
# ansible 192.168.1.12 -m setup | grep "ipv4" 远程查看主机IP地址的变量
"ansible_all_ipv4_addresses": [ “IP地址变量”
"ansible_default_ipv4": {
"ipv4": {
"ipv4": {
- master调用自带变量,可以使用setup查看ansible自带的变量
# cat var.yml 调用IP地址变量写到/tmp目录下
- hosts: web
remote_user: root
tasks:
- name: diaoyong_var
copy: content="{{ ansible_all_ipv4_addresses }}\n\n" dest=/tmp/ansible_var.txt
- master调用主机变量,在/etc/ansible/hosts文件中定义主机变量,在yml文件中调用
# cat /etc/ansible/hosts
192.168.1.12 host_ip="this is test_var"
# cat /etc/ansible/yml/var_ip.yml
- hosts: 192.168.1.12
remote_user: root
tasks:
- name: var_test
copy: content="{{ ansible_all_ipv4_addresses }},{{ host_ip }}\n" dest=/tmp/test_ip.txt
# ansible-playbook /etc/ansible/yml/var_ip.yml
远程主机192.168.1.12查看结果
# cat /tmp/test_ip.txt
[u'192.168.1.12'],this is test_var
组嵌套
示例4:Handlers
条件测试when语句
- 当前面的运行结果满足时执行tasks。
# cat shutdown.yml 当系统是"RedHat"时关闭远程主机。
- hosts: 192.168.1.12
remote_user: root
tasks:
- name: "shutdown OS"
command: /sbin/shutdown -h now
when: ansible_os_family == "RedHat"
# cat hostname.yml 当主机名是node12时添加用户user10。
- hosts: web
remote_user: root
vars:
- username: user10
tasks:
- name: create {{ username }} user
user: name={{ username }}
when: ansible_fqdn == "node12"
- 过滤语句中的错误并运行后面指定的语句
示例5:迭代循环用于执行重复性任务。将需要迭代的内容定义为item变量使用,并通过with_items语句来指明迭代的元素列表。
一次添加多个用户到同一组:
# cat item.yml
- hosts: web
remote_user: root
tasks:
- name: useradd several users
user: name={{ item }} state=present group=groupmysql
with_items:
- testuser33
- testuser55
一次添加不同属性不同用户:
# cat item.yml
- hosts: web
remote_user: root
tasks:
- name: useradd several users
user: name={{ item.name }} state=present group={{ item.groupmysql }}
with_items:
- { name: 'testuser33 ', group: 'groupmysql' }
- { name: 'testuser55 ', group: 'grouptest' }
示例6:Temlpates
利用模板文件为不同主机定制不同的配置文件。
master:192.168.1.10
node11:192.168.1.11
node12:192.168.1.12
1.本地master新建templates目录,复制一个centos6.5里自带的httpd-2.2.15版本的配置文件httpd.conf到此目录下,并命名为httpd.conf.j2。
注:centos7自带httpd-2.4.6版本,cetos6.5自带httpd-2.2.15版本,二者配置文件内容有差别。
# mkdir /etc/ansible/templates
# cp /etc/httpd/conf/httpd.conf /etc/ansible/templates/httpd.conf.j2
修改/etc/ansible/templates/httpd.conf.j2中三个参数:
107 MaxClients {{ maxClients }} #添加最大连接数变量
136 Listen {{ http_port }} #添加端口变量
276 ServerName {{ ansible_fqdn }} #ansible自带主机变量
2.本地master添加node11和node12主机到master的ansible的hosts文件的【web】主机组里。
# vim /etc/ansible/hosts
[web]
192.168.1.11 http_port=8011 maxClients=100
192.168.1.12 http_port=8012 maxClients=200
3.编写httpd.yml文件,在远程主机node11和node12上执行安装、配置、启动httpd服务。
# mkdir /etc/ansible/yml #新建yml目录
# vim /etc/ansible/yml/httpd.yml
- hosts: web
remote_user: root
vars:
- package: httpd
- service: httpd
tasks:
- name: install httpd
yum: name={{ package }} state=latest
- name: copy configuration conf file for httpd
template: src=/etc/ansible/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify:
- restarted httpd
- name: start httpd service
service: enabled=true name={{ service }} state=started
handlers:
- name: restarted httpd
service: name=httpd state=restarted
4.执行httpd.yml文件并在远程主机上查看结果。
# ansible-playbook httpd.yml
注:工作中当httpd.yml里的某个tasks需要经常发生改变时,可以给这个tasks定义一个标签,下次运行的时候指定次标签就行,中间其他过程则直接忽略。
# vim /etc/ansible/yml/httpd.yml
- hosts: web
remote_user: root
vars:
- package: httpd
- service: httpd
tasks:
- name: install httpd
yum: name={{ package }} state=latest
tags:
- always
- name: copy configuration conf file for httpd
template: src=/etc/ansible/templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
tags:
- conf
notify:
- restarted httpd
- name: start httpd service
service: enabled=true name={{ service }} state=started
handlers:
- name: restarted httpd
service: name=httpd state=restarted
# ansible-playbook httpd.yml --tags="conf"
always标签表示无论什么时候都执行。
示例7:Roles角色
将各种服务归纳总结后重复多次调用,用于层次性、结构化地组织playbook。roles能够根据层次性结构自动装载变量文件、tasks以及handlers等。简单来说roles通过将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。一般用于基于主机构建服务的场景中,也可以是用于构建守护进程等场景中。
一般roles结构:
ansible_playbooks/ 自定义目录
└── roles roles主目录
├── dbsrvs 被管理主机组【全部手动创建】
│ ├── files 存放配置文件,可以被其他目录下的yml文件使用相对路径直接调用
│ ├── handlers
│ ├── meta
│ ├── tasks
│ ├── templates
│ └── vars
└── websrvs 被管理主机组【全部手动创建】
├── files 存放配置文件,可以被其他目录下的yml文件使用相对路径直接调用
├── handlers
├── meta
├── tasks
├── templates
└── vars
比如lnmp配置,手动创建各个目录:
mkdir /etc/ansible/roles/lnmp
mkdir /etc/ansible/roles/lnmp/{nginx,mysql,php}
mkdir /etc/ansible/roles/lnmp/nginx/{deafults,files,handlers,meta,tasks,templates,vars}
1.创建roles步骤。
- 创建以roles命名的目录;
- 在roles目录中分别创建以个角色名称命名的目录,如webserver,dbserver等;
- 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates、vars目录, 用不到的目录可以创建空目录;
- 在playbook文件中调用各角色;
2.roles各目录中可用的文件。
- task目录:至少包含一个名为main.yml的文件,定义角色的任务列表;
- files目录:存放有copy或script等模块调用的静态文件;
- templates目录:存放查找Jinjia2模板文件;
- handlers目录:至少包含main.yml文件;
- yml文件:用户调用各角色的handlers;
- vars目录:包含main.yml,用于定义此角色用到的变量;
- meta目录:包含main.yml,用于定义角色的依赖关系;
- default目录:包含main.yml文件,设定默认变量;
- site.yml文件:定义playbook。
示例8:Files
存放网页或脚本类的静态文件,在Tasks里调用
# /etc/ansible/ansible_playbooks/roles/websrvs/files/
test.php php.sh
# vim /etc/ansible/ansible_playbooks/roles/websrvs/tasks/main.yml
- name: copy test.php
copy: src=test.php dest=/usr/share/nginx/html/test.php
- name: copy shell copy: src=php.sh dest=/tmp/ - name: bash shell shell: /bin/bash /tmp/php.sh

浙公网安备 33010602011771号