01. 编写剧本的重要功能介绍
a 在剧本中设置变量信息
b 在剧本中设置注册信息 执行剧本时,可以显示输出命令结果信息
b 在剧本中设置判断信息
c 在剧本中设置循环信息
d 在剧本中设置错误忽略
e 在剧本中设置标签信息
f 在剧本中设置触发信息
g 在剧本中进行剧本整合
02. 在剧本中设置变量信息
方式一:直接在剧本文件编写 vars: dir01: data01 dir02: data02 方式二:在命令行中进行指定 ansible-playbook --extra-vars=dir01=data01 方式三:在主机清单文件编写 [oldboy] dir01=data01 dir02=data02 三种变量设置方式都配置了,三种方式的优先级 最优先: 命令行变量设置 次优先: 剧本中变量设置 最后: 主机清单变量设置
如何全局设置变量: roles 剧本整合
- hosts: cl vars: dir01: /data01 tasks: - name: test create dir file: path={{ dir01 }} state=directory
03. 在剧本中设置注册信息
03. 在剧本中设置注册信息 - 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 }} 显示进程信息,表示服务已经正常启动
04. 在剧本中设置判断信息
如何指定判断条件: (ansible_hostname == "nfs01") (ansible_hostname == "web01") setup模块中显示被管理主机系统的详细信息 - hosts: cl 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: cl remote_user: root tasks: - name: Check File file: path=/tmp/this_is_{{ ansible_hostname }}_file state=touch when: (ansible_hostname == "client") or (ansible_hostname == "ansible") - name: install htop yum: name=htop state=installed when: (ansible_distribution == "CentOS") - name: install htop yum: name=htop state=installed when: (ansible_distribution == "ubuntu")
04. 在剧本中设置循环信息
- hosts: cl remote_user: root tasks: - name: Add Users user: name={{ item.name }} groups={{ item.groups }} state=present with_items: - { name: 'testuser1', groups: 'userr01' } - { name: 'testuser2', groups: 'root' } - name: Install Pkg one yum: name: [ 'wget', 'tree', 'net-tools' ] ----方式一 state: installed - name: Install Pkg two yum: name= {{ item }} state=installed with_items: ----官方建议 - wget - tree - net-tools
05. 在剧本中设置忽略错误
默认playbook会检查命令和模块的返回状态,如遇到错误就中断playbook的执行 可以加入ignore_errors: yes忽略错误
- hosts: all remote_user: root tasks: - name: Ignore False file: path=/tmp/data.txt groups=user100 --user100不存在 ignore_errors: yes ----忽略错误 - name: touch new file file: path=/tmp/oldboy_ignore state=touch
06 在剧本中设置标签功能
- hosts: cl ignore_errors: yes remote_user: root tasks: - name: Check File tag1 file: path=/tmp/this_is_{{ ansible_hostname }}_file state=touch when: (ansible_hostname == "client") or (ansible_hostname == "ansible") tags: t1 - name: bad thing tag2 command: echo 123 tags: t2 - name: install htop tag3 yum: name=httpd state=installed when: (ansible_all_ipv4_addresses == ["172.16.1.110","10.0.0.110"]) tags: t3 - name: install htop tag4 yum: name=httpd2 state=installed when: (ansible_distribution == "Centos") tags: t4
指定执行哪个标签任务: ansible-playbook --tags=t2 tags.yaml
ansible-playbook -t=t2 tags.yaml
跳过指定标签任务: ansible-playbook --skip-tags=t2 tags.yaml
07. 在剧本中设置触发功能
- hosts: cl remote_user: root tasks: - name: 01-Install nfs yum: name=nfs-utils state=installed - name: 02-write conf file shell: /usr/bin/echo "/data 10.0.0.110(rw,sync)" >/etc/exports ---修改完配置文件后需要重启,触发notify notify: restart nfs server - name: mount /data ->/mnt mount: src=10.0.0.110:/data path=/mnt fstype=nfs state=mounted handlers: - name: restart nfs server service: name=nfs state=restarted
08. 将多个剧本进行整合
方式一:include_tasks: f1.yml
vim main.yml - hosts: all gather_factes: no ------不收集主机信息 remote_user: root tasks: - include_tasks: f1.yml - include_tasks: f2.yml 方式二:include: f1.yml
vim mian.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
09 . ansible程序roles --- 规范
剧本编写完问题:
1. 目录结构不够规范 OK
2. 编写好的任务如何重复调用
3. 服务端配置文件改动,客户端参数信息也自动变化
4. 汇总剧本中没有显示主机角色信息
5. 一个剧本内容信息过多,不容易进行阅读,如何进行拆分
第一个历程: 规范目录结构 cd /etc/ansible/rolesmkdir nfs/{vars,tasks,templates,handlers,files} -p --- 创建角色目录下面的子目录 [root@m01 roles]# tree . ├── nfs ├── files --- 保存需要分发文件目录 ├── handlers --- 保存触发器配置文件信息 ├── tasks --- 保存要执行的动作信息文件 ├── templates --- 保存需要分发模板文件 模板文件中可以设置变量信息 └── vars --- 保存变量信息文件
第二个历程: 在roles目录中创建相关文件
编写文件流程图:
1) 编写tasks目录中的main.yml文件,也可以一个main.yml放在一起
#nfs/tasks/main.yml
- include_tasks: install_pkg.yml
- include_tasks: copy_conf.yml
- include_tasks: create_dir.yml
- include_tasks: boot_server.yml
vim install_pkg.yml
- name: Install Pkg
yum: name= {{ item }} state=installed
with_items:
- nfs-utils
- rpcbind
vim copy_conf.yml
- name: write conf file
copy: src=exports dest=/etc
notify: restart nfs server
vim create_dir.yml
- name: create nfs dir
file: path={{ dir }} state=directory owner=nfsnobody group=nfsnobody
vim boot_server.yml
- name: restart nfs server
service: name=nfs state=restarted enabled=yes
2) 编写vars目录中的main.yml文件
dir: /data01
ip: 10.0.0.110
3) 编写files目录中的文件,可以是templates里面的模板文件
vim exports
{{ dir }} {{ ip }}(rw,sync)
4) 编写handlers目录中的main.yml文件
vim main.yml
- name: restart nfs server
service: name=nfs state=restarted
第三个历程: 编写一个主剧本文件
vim ./roles/master.yml
- hosts: cl
roles:
- nfs
补充:templat - name: copy conf file
template:
src: test.conf
[root@ansible roles]# tree