ansible剧本功能实践介绍
-
知识点说明:
- 剧本扩展功能讲解完毕
- nfs服务一键化部署 使用剧本扩展功能
- 如何将rsync和nfs两个剧本进行整合
- 掌握剧本roles编写方法 标准化完善剧本的过程
-
知识点回顾:
- ansible程序的主机清单配置
五种配置方法:
a 分组配置管理主机信息 *****
b 支持符号信息进行匹配
web01.oldboy.com --> web[01:02].oldboy.com
web02.oldboy.com
c 主机信息加上端口配置
172.16.1.31:52113
web01:52113
d 主机后面添加变量信息
172.16.1.31 ansible_ssh_port=52113 ansible_ssh_user=root ansible_ssh_pass=123456
e 采用嵌入信息方式配置- [web01]
xxxxx
[web02]
xxxx
[web:children]
web01
web02 - [web01]
172.16.1.7
[web:vars]
ansible_ssh_port=52113
ansible_ssh_user=root
oldboy=123
- [web01]
- 剧本扩展功能
- ansible程序的主机清单配置
-
编写剧本的重要功能介绍
a 在剧本中设置变量信息 OK 3种方式 常用方式–剧本中设置
b 在剧本中设置注册信息 OK 执行剧本时,可以显示输出命令结果信息 debug
b 在剧本中设置判断信息 OK setup
c 在剧本中设置循环信息 OK
d 在剧本中设置错误忽略 OK
d 在剧本中设置标签信息 OK
e 在剧本中设置触发信息 OK
详细的剧本扩展:
https://docs.ansible.com/ansible/latest/user_guide/playbooks.htmlf 在剧本中进行剧本整合
-
在剧本中设置变量信息
方式一:直接在剧本文件编写
vars:
oldboy01: data01
oldboy02: data02方式二:在命令行中进行指定
ansible-playbook --extra-vars=oldboy01=data01方式三:在主机清单文件编写
[oldboy]
oldboy01=data01
oldboy02=data02三种变量设置方式都配置了,三种方式的优先级???
最优先: 命令行变量设置
次优先: 剧本中变量设置
最后: 主机清单变量设置如何全局设置变量: roles 剧本整合
-
在剧本中设置注册信息
- hosts: oldboy
tasks:
- name: check server port
shell: netstat -lntup --- 端口信息
register: get_server_port
- name: display port info
debug: msg={{ get_server_port.stdout_lines }}
显示进程信息,表示服务已经正常启动
PS: 设置变量不能有空格信息
-
在剧本中设置判断信息
如何指定判断条件:
(ansible_hostname == “nfs01”)
(ansible_hostname == “web01”)
setup模块中显示被管理主机系统的详细信息- hosts: oldboy
remote_user: root
tasks:-
name: Check File
file: path=/tmp/this_is_{{ ansible_hostname }}_file state=touch
when: (ansible_hostname == “nfs”) or (ansible_hostname == “backup”) -
name: install httpd
yum: name=httpd state=installed
when: (系统情况 == “CentOS”) -
name: install httpd2
yum: name=httpd2 state=installed
when: (系统情况 == “ubuntu”)
-
获取内置变量方法:
ansible oldboy -m setup -a “filter=ansible_hostname”
常见主机信息:
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个数(只显示总的个数)。获取子信息方法:
ansible_eth0[ipv4] - hosts: oldboy
-
在剧本中设置循环信息
vim test04.yml
- hosts: all
remote_user: root
tasks:
- name: Add Users
user: name={{ item.name }} groups={{ item.groups }} state=present
with_items:
- { name: 'testuser1', groups: 'bin' }
- { name: 'testuser2', groups: 'root' }
vim test05.yml
- hosts: all
remote_user: root
tasks:
- name: Installed Pkg
yum: name={{ item }} state=present
with_items:
- wget
- tree
- lrzsz
剧本执行出现错误排查思路/步骤:
1) 找到剧本中出现问题关键点
2) 将剧本中的操作转换成模块进行操作
3) 将模块的功能操作转换成linux命令
本地管理主机上执行命令测试
远程被管理主机上执行命令测试
- name: 01-install rsync
yum:
name: ['rsync', 'tree', 'wget'] --- saltstack
state: installed
- name: xxx
yum: name=xxx state=installed --- ansible
-
在剧本中设置忽略错误
默认playbook会检查命令和模块的返回状态,如遇到错误就中断playbook的执行
可以加入ignore_errors: yes忽略错误
vim test06.yml- hosts: all
remote_user: root
tasks:- name: Ignore False
command: /bin/false
ignore_errors: yes - name: touch new file
file: path=/tmp/oldboy_ignore state=touch
- name: Ignore False
- hosts: all
-
在剧本中设置标签功能
在这里插入代码片
指定执行哪个标签任务: ansible-playbook --tags=t2 test05.yml
跳过指定标签任务: ansible-playbook --skip-tags=t2 test05.yml
-
在剧本中设置触发功能
-
hosts: backup
remote_user: root
tasks:-
name: 01 Install rsync
yum: name=rsync state=present -
name: 02 push config file
copy: src=./file/{{ item.src }} dest=/etc/{{ item.dest }} mode={{ item.mode }}
with_items:- { src: “rsyncd.conf”, dest: “rsyncd.conf”, mode: “0644” }
- { src: “rsync.password”, dest: “rsync.password”, mode: “0600” }
notify: restart rsync server
handlers:
- name: restart rsync server
service: name=rsyncd state=restarted
-
-
-
将多个剧本进行整合
方式一:include_tasks: f1.yml- hosts: all
remote_user: root
tasks:- include_tasks: f1.yml
- include_tasks: f2.yml
方式二:include: f1.yml
- include:f1.yml
- include:f2.yml
方式三:- import_playbook:
[root@m01 ansible-playbook]# cat main.yml- import_playbook: base.yml
- import_playbook: rsync.yml
- import_playbook: nfs.yml
- import_playbook: oxxx.yml
- import_playbook: rsync.yml
- import_playbook: nfs.yml
- hosts: all
09 编写NFS服务剧本
第一个历程: 创建几个目录
[root@m01 ansible-playbook]# tree nfs-file/
nfs-file/
├── nfs-client
└── nfs-server
第二个历程: 编写剧本信息
主机清单:
[nfs:children]
nfs_server
nfs_client
[nfs_server]
172.16.1.31
[nfs_client]
172.16.1.7
#172.16.1.8
#172.16.1.9
- hosts: nfs
tasks:
- name: 01-install nfs software
yum:
name: ['nfs-utils','rpcbind']
state: installed
- hosts: nfs_server
#vars:
# Data_dir: /data
tasks:
- name: 01-copy conf file
copy: src=/etc/ansible/ansible-playbook/nfs-file/nfs-server/exports dest=/etc
notify: restart nfs server
- name: 02-create data dir
file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody
# path: ['data01','data02','data03']
# state: directory
# owner: nfsnobody
# group: nfsnobody
- name: 03-boot server
#service: name=rpcbind state=started enabled=yes
#service: name=nfs state=started enabled=yes
service: name={{ item }} state=started enabled=yes
with_items:
- rpcbind
- nfs
handlers:
- name: restart nfs server
service: name=nfs state=restarted
- hosts: nfs_client
#vars:
# Data_dir: /data
tasks:
- name: 01-mount
mount: src=172.16.1.31:{{ Data_dir }} path=/mnt fstype=nfs state=mounted
- name: 02-check mount info
shell: df -h|grep /data
register: mount_info
- name: display mount info
debug: msg={{ mount_info.stdout_lines }}
第三个历程: 进行剧本测试
-
ansible程序roles — 规范
剧本编写完问题:- 目录结构不够规范 OK
- 编写好的任务如何重复调用
- 服务端配置文件改动,客户端参数信息也自动变化
- 汇总剧本中没有显示主机角色信息
- 一个剧本内容信息过多,不容易进行阅读,如何进行拆分 OK
第一个历程: 规范目录结构
cd /etc/ansible/roles
mkdir {rsync,nfs} — 创建相应角色目录
mkdir {nfs,rsync}/{vars,tasks,templates,handlers,files} — 创建角色目录下面的子目录
[root@m01 roles]# tree
.
├── nfs
│ ├── files — 保存需要分发文件目录
│ ├── handlers — 保存触发器配置文件信息
│ ├── tasks — 保存要执行的动作信息文件 ok
│ ├── templates — 保存需要分发模板文件 模板文件中可以设置变量信息
│ └── vars — 保存变量信息文件
└── rsync
├── files
├── handlers
├── tasks
├── templates
└── vars第二个历程: 在roles目录中创建相关文件
编写文件流程图:- 编写tasks目录中的main.yml文件
- name: 01-copy conf file
copy: src=exports dest=/etc
notify: restart nfs server - name: 02-create data dir
file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobodypath: [‘data01’,‘data02’,‘data03’]
state: directory
owner: nfsnobody
group: nfsnobody
- name: 03-boot server
service: name={{ item }} state=started enabled=yes
with_items:- rpcbind
- nfs
vim main.yml
- include_tasks: copy_info.yml
- include_tasks: create_dir.yml
- include_tasks: boot_server.yml
vim copy_info.yml
- name: 01-copy conf file
copy: src=exports dest=/etc
notify: restart nfs server
vim create_dir.yml
- name: 02-create data dir
file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody
vim boot_server.yml
-
name: 03-boot server
service: name={{ item }} state=started enabled=yes
with_items:- rpcbind
- nfs
-
编写vars目录中的main.yml文件
[root@m01 vars]# vim main.yml
Data_dir: /data -
编写files目录中的文件
[root@m01 files]# ll
total 4
-rw-r–r-- 1 root root 29 May 17 15:23 exports -
编写handlers目录中的main.yml文件
vim main.yml
- name: restart nfs server
service: name=nfs state=restarted
目录中文件编写好汇总结构
[root@m01 nfs]# tree
.
├── files
│ └── exports
├── handlers
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
└── vars
└── main.yml第三个历程: 编写一个主剧本文件
[root@m01 roles]# cat site.yml-
hosts: nfs_server
roles:- nfs-server
-
hosts: rsync_server
roles:- rsync
思考:
-
ansible剧本扩展功能进行总结
-
(选做) 总结ansible剧本roles
-
web服务 http协议原理 nginx(安装 配置)
-
一键化部署全网备份项目
-
一键化部署实时同步服务