一、ansible 剧本介绍:
1、剧本的作用:
1)、将多个模块操作的功能进行整合
2)、实现重复工作简单化(提高工作效率)
3)、实现特殊需求
2、剧本中的内容:角色信息、任务信息
hosts :角色信息
tasks :任务信息
3、编写剧本的语法规范(yaml):
1、注意缩进的关系:两个空格一个缩进关系
2、创建键值对 :使用冒号(如 age: 18);如果没有空格是错误的;(如 age:18(错误))
有两种特殊情况除外:
(1)、冒号结尾
(2)、冒号出现在描述和注释当中
3、列表:相同的信息或类别出现多次
释义:多个列表使用短横线+空格
如:
- team1 zhangsan lisi
- team2 zhangsan lisi
4、
ansible-playbook --syntax-check test01.yaml --- 检查语法结构
ansible-playbook -C test01.yaml --- 模拟执行剧本
二、ansible 剧本编写示范:
shell模块和其他模块书写在一个name中会产生冲突
练习01:一键部署rsync守护进程服务
第1步:设置主机清单:
[root@m01 ~]# cat /etc/ansible/hosts | tail -n 6
[nfs01]
172.16.1.31
[backup]
172.16.1.41
[web01]
172.16.1.7
第2步:编写剧本信息(注意书写格式):
[root@m01 ~]# cat rsync.yaml
- hosts: backup
tasks:
- name: 01 安装rsync服务
yum: name=rsync state=installed
- name: 02 编辑rsync配置文件 /etc/rsyncd.conf
copy: src=/etc/rsyncd.conf dest=/etc/
- name: 03 创建虚拟用户rsync
user: name=rsync shell=/sbin/nologin create_home=no
- name: 04 创建本分文件目录backup 权限 600
file: path=/backup state=directory owner=rsync group=rsync
- name: 05 创建服务端密码文件 rsync.password 权限 600
copy: content='rsync_backup:123456' dest=/etc/rsync.password mode=600
- name: 启动rsyncd 服务
service: name=rsyncd state=started enabled=yes
- hosts: web01
tasks:
- name: 01 创建服务端密码文件
copy: content='123456' dest=/etc/rsync.password mode=600
第3步:测试剧本:
[root@m01 ~]# ansible-playbook --syntax-check rsync.yaml
playbook: rsync.yaml
[root@m01 ~]# ansible-playbook rsync.yaml
PLAY [backup] ***********************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************
ok: [172.16.1.41]
TASK [01 安装rsync服务] ****************************************************************************************************************
changed: [172.16.1.41]
TASK [02 编辑rsync配置文件 /etc/rsyncd.conf] **********************************************************************************************
changed: [172.16.1.41]
TASK [03 创建虚拟用户rsync] ***************************************************************************************************************
ok: [172.16.1.41]
TASK [04 创建本分文件目录backup 权限 600] *****************************************************************************************************
ok: [172.16.1.41]
TASK [05 创建服务端密码文件 rsync.password 权限 600] *******************************************************************************************
changed: [172.16.1.41]
TASK [启动rsyncd 服务] ******************************************************************************************************************
changed: [172.16.1.41]
PLAY [web01] ************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************
ok: [172.16.1.7]
TASK [01 创建服务端密码文件] *****************************************************************************************************************
changed: [172.16.1.7]
PLAY RECAP **************************************************************************************************************************
172.16.1.41 : ok=7 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.16.1.7 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@m01 ~]# [root@m01 ~]# cat rsync.yaml
第4步:执行剧本
[root@m01 ~]# ansible-playbook rsync.yaml
PLAY [backup] ***********************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************
ok: [172.16.1.41]
TASK [01 安装rsync服务] ****************************************************************************************************************
changed: [172.16.1.41]
TASK [02 编辑rsync配置文件 /etc/rsyncd.conf] **********************************************************************************************
changed: [172.16.1.41]
TASK [03 创建虚拟用户rsync] ***************************************************************************************************************
changed: [172.16.1.41]
TASK [04 创建本分文件目录backup 权限 600] *****************************************************************************************************
ok: [172.16.1.41]
TASK [05 创建服务端密码文件 rsync.password 权限 600] *******************************************************************************************
changed: [172.16.1.41]
TASK [启动rsyncd 服务] ******************************************************************************************************************
changed: [172.16.1.41]
PLAY [web01] ************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************
ok: [172.16.1.7]
TASK [01 创建服务端密码文件] *****************************************************************************************************************
changed: [172.16.1.7]
PLAY RECAP **************************************************************************************************************************
172.16.1.41 : ok=7 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.16.1.7 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@m01 ~]#
第5步:测试服务
[root@web01 ~]# rsync /etc/fstab rsync_backup@10.0.0.41::backup --password-file=/etc/rsync.password
[root@backup ~]# ll /backup/
total 4
-rw-r--r--. 1 rsync rsync 501 Jul 6 23:37 fstab
[root@backup ~]# cls
[root@backup ~]#
三、剧本编写扩展:
剧本编写扩展说明:
1、剧本编写设置变量(vars)
2、剧本编写注册信息(register)
3、剧本编写循环功能(with_items)
4、剧本编写判断功能(when)
5、剧本编写忽略错误(ignore_errors)
6、剧本编写标签功能(tags)
7、剧本编写忽略采集(gather_facts)
8、剧本编写触发功能(handlers)
9、剧本编写汇总功能(目录:files handlers tasks templates vars)
1、剧本编写设置变量(vars)
第1种方式:在剧本中设置变量
[root@m01 /server/scripts]# cat vars_test.yaml
- hosts: backup
vars:
dir_info: /etc/
dir_file: hosts
dest_info: /tmp/
dest_file: hosts.bak
tasks:
- name: copy 文件
copy: src={{ dir_info }}{{ dir_file }} dest={{ dest_info }}{{ dest_file }}
第2种方式:在命令行指定变量
注意:此种方式还可以嵌入组变量
[root@m01 /server/scripts]# cat vars_test.yaml
- hosts: backup
vars:
dir_info: /etc/
dir_file: hosts
tasks:
- name: copy 文件
copy: src={{ dir_info }}{{ dir_file }} dest={{ dest_info }}{{ dest_file }}
[root@m01 /server/scripts]# vim vars_test.yaml
[root@m01 /server/scripts]# ansible-playbook -e dir_info=/etc/ -e dir_file=hosts vars_test.yaml
PLAY [backup] ***********************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************
ok: [172.16.1.41]
TASK [copy 文件] **********************************************************************************************************************
changed: [172.16.1.41]
PLAY RECAP **************************************************************************************************************************
172.16.1.41 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@m01 /server/scripts]#
第3种方式:在主机清单中设置变量
[root@m01 /server/scripts]# tail -n 10 /etc/ansible/hosts
## db-[99:101]-node.example.com
[nfs01]
172.16.1.31
[backup]
172.16.1.41
[backup:vars]
dir_info=/etc/
dir_file=hosts
[web01]
172.16.1.7
注意 三种变量配置方式优先顺序如下:命令行配置变量最优先,剧本文件中配置其次,主机清单中配置最后。
2、剧本编写注册信息(register)
使用说明:register 的作用是将上一模块的执行结果报转化为register指定的变量中, 如果下面的模块需要用到这个变量,直接调用即可。一般配合debug使用
[root@m01 /server/scripts]# cat sshd_zhuce.yaml
- hosts: backup
tasks:
- name: 重启sshd服务
service: name=sshd state=restarted
- name: 查看启动后端口信息
shell: ss -tnlp | grep sshd
register: port_info #将shell 模块执行的结果保存到 port_info 中,从某种角度来讲 这时的port_info 这时是一个变量。
- name: 显示端口信息
debug: msg={{ port_info.stdout_lines }} #用debug模块输出结果 stdout_lines 表示标准输出。
3、剧本编写循环功能(with_items)
功能说明:这个模块主要做循环使用,利用with_items子句生成一个循环列表,使用 {{ item }}
固定模式来调用变量,调用的是with_items 生成的整个列表。此功能还有第二种用法,使用{{item.xxx}}
的方式来调用变量。具体参照下面第二种方式。
第1种方式:
- hosts: backup
remote_user: root
tasks:
- name: create user to backup
user: name={{ item }} state=present
with_items:
- test1
- test2
- test3
第2种方式:
循环方式二:
- hosts: 172.16.1.7
tasks:
- name: create user01-03
user: name={{ item.name }} shell={{ item.shell }} create_home={{ item.home }}
with_items:
- {name: 'user01', shell: '/sbin/nologin', home: 'yes'}
- {name: 'user02', shell: '/bin/bash', home: 'no'}
- {name: 'user03', shell: '/bin/bash', home: 'yes'}
4、剧本编写判断功能 (when)
使用说明:想要使用when 语句,首先要先了解一下setup模块的用法,setup模块可以查询到一些主机信息,然后借用这些主机信息来对条件做判断。下面给罗列了一些常用的参数
常见主机信息:
主机参数 | 参数说明 |
---|---|
ansible_all_ipv4_addresses: | 仅显示ipv4的信息。 |
ansible_devices: | 仅显示磁盘设备信息。 |
ansible_distribution: | 显示是什么系统,例:centos,suse等。 |
ansible_distribution_major_version: | 显示是系统主版本。 |
ansible_distribution_version: | 仅显示系统版本。 |
ansible_machine: | 显示系统类型,例:32位,还是64位。 |
ansible_eth0: | 仅显示eth0的信息。 |
ansible_hostname: | 仅显示主机名。 |
ansible_kernel: | 仅显示内核版本。 |
ansible_lvm: | 显示lvm相关信息。 |
ansible_memtotal_mb: | 显示系统总内存。 |
ansible_memfree_mb: | 显示可用系统内存。 |
ansible_memory_mb: | 详细显示内存情况。 |
ansible_swaptotal_mb: | 显示总的swap内存。 |
ansible_swapfree_mb: | 显示swap内存的可用内存。 |
ansible_mounts: | 显示系统磁盘挂载情况。 |
ansible_processor: | 显示cpu个数(具体显示每个cpu的型号)。 |
ansible_processor_vcpus: | 显示cpu个数(只显示总的个数)。 |
[root@m01 /server/scripts/playbook]# vim copy.yaml
- hosts: all
remote_user: root
tasks:
- name: 分发文件 hosts
copy: src=/etc/hosts dest=/tmp
when: (ansible_hostname == "backup")
- name: 分发文件 fstab
copy: src=/etc/fstab dest=/tmp
when: (ansible_hostname != "backup")
[root@m01 /server/scripts/playbook]# ansible-playbook copy.yaml
PLAY [all] **************************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************
ok: [172.16.1.31]
ok: [172.16.1.41]
ok: [172.16.1.7]
TASK [分发文件 hosts] *******************************************************************************************************************
skipping: [172.16.1.31]
skipping: [172.16.1.7]
changed: [172.16.1.41]
TASK [分发文件 fstab] *******************************************************************************************************************
skipping: [172.16.1.41]
changed: [172.16.1.31]
changed: [172.16.1.7]
PLAY RECAP **************************************************************************************************************************
172.16.1.31 : ok=2 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
172.16.1.41 : ok=2 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
172.16.1.7 : ok=2 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
[root@m01 /server/scripts/playbook]#
5、剧本编写忽略错误(ignore_errors)
使用说明:此功能用于忽略报错,加上此语句表示忽略当前报错,使剧本继续执行。
[root@m01 /server/scripts/playbook]# cat ignore_errors.yaml
- hosts: backup
remote_user: root
tasks:
- name: 创建用户user01
user: namei=user01
ignore_errors: yes
- name: 复制 reboot.yaml
copy: src=reboot.yaml dest=/tmp
- name: 更改reboot.yaml权限
file: path=/tmp/hosts mode=600
[root@m01 /server/scripts/playbook]# ansible-playbook ignore_errors.yaml
PLAY [backup] ***********************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************
ok: [172.16.1.41]
TASK [创建用户user01] *******************************************************************************************************************
fatal: [172.16.1.41]: FAILED! => {"changed": false, "msg": "Unsupported parameters for (user) module: namei Supported parameters include: append, authorization, comment, create_home, expires, force, generate_ssh_key, group, groups, hidden, home, local, login_class, move_home, name, non_unique, password, password_lock, profile, remove, role, seuser, shell, skeleton, ssh_key_bits, ssh_key_comment, ssh_key_file, ssh_key_passphrase, ssh_key_type, state, system, uid, update_password"}
...ignoring
TASK [复制 reboot.yaml] ***************************************************************************************************************
changed: [172.16.1.41]
TASK [更改reboot.yaml权限] **************************************************************************************************************
changed: [172.16.1.41]
PLAY RECAP **************************************************************************************************************************
172.16.1.41 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1
[root@m01 /server/scripts/playbook]#
6、剧本编写标签功能(tags)
使用说明:在剧本中使用标签功能,加上标签后 ,在执行剧本时可以指定只运行标签内容,还是跳过标签内容
跳过标签运行剧本: ansible-playbook --skip-tags=标签名 剧本名
只运行标签内容:ansible-playbook -t 标签名 剧本名
如下示例:
[root@m01 /server/scripts/playbook]# cat tags.yaml
- hosts: backup
remote_user: root
tasks:
- name: 创建用户user01
user: namei=user01
ignore_errors: yes
tags: test01
- name: 复制 reboot.yaml
copy: src=reboot.yaml dest=/tmp
- name: 更改reboot.yaml权限
file: path=/tmp/hosts mode=600
[root@m01 /server/scripts/playbook]# ansible-playbook -t test01 tags.yaml
PLAY [backup] ***********************************************************************************************************************
TASK [Gathering Facts] **************************************************************************************************************
ok: [172.16.1.41]
TASK [创建用户user01] *******************************************************************************************************************
fatal: [172.16.1.41]: FAILED! => {"changed": false, "msg": "Unsupported parameters for (user) module: namei Supported parameters include: append, authorization, comment, create_home, expires, force, generate_ssh_key, group, groups, hidden, home, local, login_class, move_home, name, non_unique, password, password_lock, profile, remove, role, seuser, shell, skeleton, ssh_key_bits, ssh_key_comment, ssh_key_file, ssh_key_passphrase, ssh_key_type, state, system, uid, update_password"}
...ignoring
PLAY RECAP **************************************************************************************************************************
172.16.1.41 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1
[root@m01 /server/scripts/playbook]#
7、剧本编写忽略采集(gather_facts)
使用说明:忽略采集功能,直接执行任务信息,目的在于提高工作效率
[root@m01 /server/scripts/playbook]# cat gatehr_facts.yaml
- hosts: backup
gather_facts: no
remote_user: root
tasks:
- name: 创建用户user01
user: namei=user01
ignore_errors: yes
- name: 复制 reboot.yaml
copy: src=reboot.yaml dest=/tmp
- name: 更改reboot.yaml权限
file: path=/tmp/hosts mode=600
[root@m01 /server/scripts/playbook]# ansible-playbook gatehr_facts.yaml
PLAY [backup] ***********************************************************************************************************************
TASK [创建用户user01] *******************************************************************************************************************
fatal: [172.16.1.41]: FAILED! => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "msg": "Unsupported parameters for (user) module: namei Supported parameters include: append, authorization, comment, create_home, expires, force, generate_ssh_key, group, groups, hidden, home, local, login_class, move_home, name, non_unique, password, password_lock, profile, remove, role, seuser, shell, skeleton, ssh_key_bits, ssh_key_comment, ssh_key_file, ssh_key_passphrase, ssh_key_type, state, system, uid, update_password"}
...ignoring
TASK [复制 reboot.yaml] ***************************************************************************************************************
ok: [172.16.1.41]
TASK [更改reboot.yaml权限] **************************************************************************************************************
ok: [172.16.1.41]
PLAY RECAP **************************************************************************************************************************
172.16.1.41 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1
[root@m01 /server/scripts/playbook]#
8、剧本编写触发功能(handlers)
使用场景:一般用于某些配置文件发生改变,需要重新启动某些服务,但是一个剧本中可能有多个服务,为了不影响其他的服务,但是又能实现当前的任务
使用说明:handlers 只会处理notify中列出的任务,而且不论notify中有多少个任务,handlers都会一次处理完成,如果notify没有通知handlers将不会运行;其实handlers与常规任务并没有什么不同,但是这里要注意handlers 和tasks是同一列。
- hosts: backup
tasks:
- name: copy file
copy: src=rsyncd.conf dest=/etc/
notify: rsync_server
- name: boot server
service: name=rsyncd state=started
handlers:
- name: rsync_server
service: name=rsyncd state=restarted
9、剧本编写汇总功能
例:以部署自动部署NFS为例(其实还可以完善)
准备工作在 /etc/ansible/roles下创建files 、 handlers 、 tasks 、templates 、vars 五个目录,这五个目录各有其用。
a、tasks: 包含角色要执行的主要任务列表,此实例内容如下:
[root@m01 /etc/ansible/roles]# ls nfs/
files handlers tasks templates vars
[root@m01 /etc/ansible/roles]# cat nfs/tasks/main.yaml
- name: 01 安装部署软件
yum: name={{ item.name }} state=installed
with_items:
- {name: 'nfs-utils'}
- {name: 'rpcbind' }
- name: 02 分发NFS配置文件
copy: src=exports dest={{ conf_dir }}exports
- name: 创建用户组
group: name={{ group_name }} gid={{ gid_num }} state=present
- name: 03 创建虚拟用户
user: name={{ user_name }} uid={{ uid_num }} group={{ gid_num }} shell=/sbin/nologin create_home=no state=present
ignore_errors: no
- name: 04 创建挂载目录
file: path=/web_data owner={{ user_name }} group={{ user_name }} state=directory
- name: 05 启动NFS服务
service: name={{ item.start }} state=started
with_items:
- {start: 'nfs'}
- {start: 'rpcbind' }
notify: change_status
- name: 重读配置文件
service: name=nfs state=reloaded
- name: 查看服务启动状态
shell: showmount -e {{ ip }}
register: start_info
- name: 显示服务启动状态
debug: msg={{ start_info.stdout_lines }}
[root@m01 /etc/ansible/roles]#
b、vars:角色的其他变量(有关更多信息,请参阅使用变量)。此实例内容如下
[root@m01 /etc/ansible/roles]# cat nfs/vars/main.yaml
conf_dir: /etc/
gid_num: "1100"
uid_num: "1100"
user_name: www
group_name: www
ip: 172.16.1.31
[root@m01 /etc/ansible/roles]#
c、files : 包含可以通过此角色部署的文件。此实例用到的文件如下
[root@m01 /etc/ansible/roles]# ls nfs/files/
exports
[root@m01 /etc/ansible/roles]#
d、handlers:包含处理程序,可以由此角色使用,甚至可以在此角色之外的任何位置使用。此实例内容如下
[root@m01 /etc/ansible/roles]# cat nfs/handlers/main.yaml
- name: change_status
service: name=nfs state=reloaded
[root@m01 /etc/ansible/roles]#
e、templates - 包含可以通过此角色部署的模板。此实例未使用到此目录,如需要使用请到官网查看,或发间信于我,我来帮助你
f、在/etc/ansible/roles/ 下编写site.yml的文件,文件内容如下,这里注意文件的后缀是.yml。
[root@m01 /]# cat etc/ansible/roles/site.yml
- hosts: nfs01
remote_user: root
roles:
- nfs
[root@m01 /]#
g、在 /etc/ansible/roles/下执行剧本即可,再提一下 使用ansible之前,一定好提前规划好ansible的主机文件即/etc/ansible/hosts,具体配置在本博客Ansible基础(一)中可以找到
[root@m01 /etc/ansible/roles]# ansible-playbook --syntax-check site.yml 3进行语法检查
playbook: site.yml
[root@m01 /etc/ansible/roles]# ansible-playbook site.yml #无问题后执行即可这里不再做演示
10、多个剧本整合成一个剧本执行
方式一
(1)事先写好的剧本,不包含主机信息
[root@m01 /server/ansible_play]# cat rsync.yaml
- name: 01:安装软件
yum: name=rsync state=installed
- name: 02:分发配置文件
copy: src=/etc/rsyncd.conf dest=/etc/rsyncd.conf
- name: 03:创建虚拟用户
user: name=rsync shell=/sbin/nologin create_home=no
- name: 04:创建备份目录
file: path=/backup_data state=directory owner=rsync group=rsync
- name: 05:创建密码文件
copy: content='rsync_backuo:123456' dest=/etc/rsync.password mode=600
- name: 06:启动服务
service: name=rsyncd state=started enabled=yes
- name: 01:创建密码文件
copy: content='123456' dest=/etc/rsync.password mode=600
[root@m01 /server/ansible_play]# cat with_items.yaml
- name: 01:安装NFS
yum: name={{ item.name }} state=installed
with_items:
- {name: 'nfs-utils'}
- {name: 'rpcbind'}
[root@m01 /server/ansible_play]#
(2)将上面的两个剧本放在一个剧本中执行
其实就是给主机信息,然后用include调用
[root@m01 /server/ansible_play]# cat auto.yaml
- hosts: backup
tasks:
- include_tasks: rsync.yaml
- hosts: nfs01
tasks:
- include_tasks: with_items.yaml
[root@m01 /server/ansible_play]#
方式二
(1)正常书写单个剧本
[root@m01 /server/ansible_play]# cat rsync.yaml
- hosts: backup
tasks:
- name: 01:安装软件
yum: name=rsync state=installed
- name: 02:分发配置文件
copy: src=/etc/rsyncd.conf dest=/etc/rsyncd.conf
- name: 03:创建虚拟用户
user: name=rsync shell=/sbin/nologin create_home=no
- name: 04:创建备份目录
file: path=/backup_data state=directory owner=rsync group=rsync
- name: 05:创建密码文件
copy: content='rsync_backuo:123456' dest=/etc/rsync.password mode=600
- name: 06:启动服务
service: name=rsyncd state=started enabled=yes
- hosts: web01
tasks:
- name: 01:创建密码文件
copy: content='123456' dest=/etc/rsync.password mode=600
[root@m01 /server/ansible_play]# cat with_items.yaml
- hosts: nfs01
tasks:
- name: 01:安装NFS
yum: name={{ item.name }} state=installed
with_items:
- {name: 'nfs-utils'}
- {name: 'rpcbind'}
[root@m01 /server/ansible_play]#
(2)汇总到一起执行,执行时只需ansible-playbook auto.yaml 即可
[root@m01 /server/ansible_play]# cat auto.yaml
- import_playbook: rsync.yaml
- import_playbook: with_items.yaml
[root@m01 /server/ansible_play]#
网友评论