剧本编写规范:pyyaml
外网IP | 内网IP | 主机名 | 功能 | 系统版本 |
---|---|---|---|---|
10.0.0.61 | 172.16.1.61 | m01 | 管理主机 | CentOS 7.x |
10.0.0.41 | 172.16.1.41 | backup | 被管理主机 | CentOS 7.x |
10.0.0.31 | 172.16.1.31 | nfs01 | 被管理主机 | CentOS 7.x |
10.0.0.7 | 172.16.1.7 | web01 | 被管理主机 | CentOS 7.x |
主机清单配置文件: /etc/ansible/hosts
分组配置
[web] — ansible web -a … 统一操作web组的主机
172.16.1.7
172.16.1.8
172.16.1.9
[data] — ansible data -a … 统一操作data组的主机
172.16.1.31
172.16.1.41
主机名符号匹配配置
[web]
172.16.1.[7:9] 通过IP地址匹配配置
web[01:03] 通过主机名匹配配置(注意:通过主机名匹配需要在/etc/hosts文件中有主机名和IP的映射)
加上非标准远程端口(如ssh端口变为52113)
[web]
web01:52113
172.16.1.7:52113
主机使用特殊的变量
[web]
172.16.1.7 ansible_ssh_port=52113 ansible_ssh_user=root ansible_ssh_pass=123456
[web]
web01 ansible_ssh_host=172.16.1.7 ansible_ssh_port=52113 ansible_ssh_user=root ansible_ssh_pass=123456
主机组名嵌入配置
[rsync:children] — 嵌入子组信息
rsync_server
rsync_client
[rsync_server] — 子组
172.16.1.41
[rsync_client] — 子组
172.16.1.31
172.16.1.7
[web:vars] — 嵌入式变量信息
ansible_ssh_host=172.16.1.7 — 变量
ansible_ssh_port=52113 — 变量
ansible_ssh_user=root — 变量
ansible_ssh_pass=123456 — 变量
[web] — 该组调用以上变量
web01
主机清单官方配置方法
服务端部署
客户端部署
创建playbook目录
[root@m01 ~]# mkdir /etc/ansible/ansible-playbook
进入playbook目录
[root@m01 ~]# cd /etc/ansible/ansible-playbook/
创建编辑rsync剧本(剧本文件扩展名尽量写为yaml,方便识别文件是一个剧本文件,且文件编写时会有颜色提示)
[root@m01 ansible-playbook]# vim rsync_server.yaml
- hosts: 172.16.1.41
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-push rsyncd.conf
copy: src=../server_file/rsync_server/rsyncd.conf dest=/etc/
- name: 03-create user
user: name=rsync create_home=no shell=/sbin/nologin
- name: 04-create backup directory
file: dest=/backup state=directory owner=rsync group=rsync
- name: 05-create password file
copy: content=rsync_backup:redhat dest=/etc/rsync.password mode=600
- name: 06-start rsync service
service: name=rsyncd state=started enabled=yes # 配置文件改变,不重启服务不会生效?
- hosts: 172.16.1.31,172.16.1.7
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-create password file
copy: content=redhat dest=/etc/rsync.password mode=600
- name: 03-create test file
file: dest=/tmp/test.txt state=touch
- name: 04-test shell: rsync -avz /tmp/test.txt [email protected]::backup --password-file=/etc/rsync.password
如何执行剧本?
[root@m01 ansible-playbook]# ansible-playbook --syntax-check rsync_server.yaml
[root@m01 ansible-playbook]# ansible-playbook -C rsync_server.yaml
[root@m01 ansible-playbook]# ansible-playbook rsync_server.yaml
剧本执行出现错误排查思路/步骤:
1)找到剧本中出现问题关键点;
2)将剧本中的操作转换成单条ad-hoc命令操作;
3)将模块的功能操作转换成linux命令;
4)本地管理主机上执行命令测试;
5)远程被管理主机上执行命令测试。
变量名由字母、数字、下划线组成,变量名需要以字母开头,ansible内置关键字不能作为变量名。
在剧本文件中编写
在剧本中定义变量,借助vars关键字
vars:
backupdir: /backup
passfile: rsync.password
使用{{ 变量名 }}可以引用对应的变量
在命令行中指定(临时设置)
ansible-playbook -e backupdir=/backup -e passfile=rsync.password rsync_server.yaml
在主机清单中编写
vim /etc/ansible/hosts
[rsync_server:vars]
backupdir: /backup
passfile: rsync.password
三种方式优先级:命令行变量设置>剧本变量设置>主机清单变量设置
注册功能可以在执行剧本时,输出命令结果。
- hosts: rsync_server
tasks:
- name: check server port
shell: netstat -lntup
register: get_server_port
- name: display port info
debug: msg={{ get_server_port.stdout_lines }}
指定判断条件
(ansible_hostname == “nfs01”)
(ansible_hostname == “web01”)
例如
- hosts: rsync_server
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")
setup模块显示被管理主机系统的详细信息
ansible rsync_server -m setup
setup模块获取被管理主机的内置变量信息
ansible rsync_server -m setup -a “filter=xxx”
常见主机信息
参数 | 作用 |
---|---|
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个数(只显示总的个数) |
一个name下只能执行一个ad-hoc命令,如果想要执行多条,可以使用循环。
- 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' }
指定执行标签任务: ansible-playbook --tags=t2 test.yml
跳过指定标签任务: ansible-playbook --skip-tags=t2 test.yml
- hosts: all
ignore_errors: yes
remote_user: root
tasks:
- name: Check File
file: path=/tmp/this_is_{{ ansible_hostname }}_file state=touch
when: (ansible_hostname == "nfs01") or (ansible_hostname == "backup")
tags: t1
- name: install httpd
yum: name=httpd state=installed
when: (ansible_all_ipv4_addresses == ["172.16.1.7","10.0.0.7"])
tags: t2
- name: install httpd2
yum: name=httpd2 state=installed
when: (ansible_distribution == "ubuntu")
tags: t3
- 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: # 当notify发出时,handlers起作用
- name: restart rsync server
service: name=rsyncd state=restarted
默认playbook会检查命令和模块的返回状态,如遇到错误就中断playbook的执行,可以加入ignore_errors: yes忽略错误。
- 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
include_tasks: playbook.yaml
[root@m01 ansible-playbook]# cat main.yml
- hosts: all(host与include_tasks剧本中的host冲突)
tasks:
- include_tasks: rsync-server.yml
- include_tasks: nfs-server.yml
include: playbook.yml(设置gather_facts: no可提高执行速度)
[root@m01 ansible-playbook]# cat main.yml
- include:rsync-server.yml
- include:nfs-server.yml
- import_playbook(主要使用该方法进行汇总)
[root@m01 ansible-playbook]# vim main.yml
- import_playbook: rsync.yml
- import_playbook: nfs.yml
待解决问题:
创建相应角色目录
[root@m01 ~]# cd /etc/ansible/roles/
[root@m01 roles]# mkdir {rsync,nfs-server,nfs-client}
创建角色子目录
[root@m01 roles]# mkdir {rsync,nfs-server,nfs-client}/{vars,tasks,templates,handlers,files}
查看目录结构
[root@m01 roles]# tree /etc/ansible/roles/
/etc/ansible/roles/
|-- nfs-server
| |-- files -- 保存需要分发的文件
| |-- handlers -- 保存触发器配置文件
| |-- tasks -- 保存要执行的动作信息文件
| |-- templates -- 保存需要分发的模板文件,模板文件中可以设置变量(调取var目录中的变量值)
| `-- vars -- 保存变量信息文件
......
以部署NFS服务端为例:
编写tasks目录中main.yml文件
[root@m01 tasks]# vim main.yml
- name: 01-copy nfs conf file
copy: src=exports dest=/etc/ - name: 02-create data dir -- 自动去往file目录寻找exports文件
file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody
notify: restart nfs server
- name: 03-start server
service: name={{ item }} state=started enabled=yes
with_items:
- rpcbind
- nfs
编写vars目录中main.yml文件
[root@m01 tasks]# cd ../vars
[root@m01 vars]# vim main.yml
Data_dir: /data
编写files目录中需要分发的文件
[root@m01 vars]# cd ../files/
[root@m01 files]# echo '/data172.16.1.0/24(rw,sync)' > exports
编写handlers目录中main.yml文件
[root@m01 tasks]# cd ../handlers/
[root@m01 handlers]# vim main.yml
[root@m01 handlers]# cat main.yml
- name: restart nfs server
service: name=nfs state=restarted
编写好的目录结构
[root@m01 nfs-server]# tree
.
|-- files
| `-- exports
|-- handlers
| `-- main.yml
|-- tasks
| `-- main.yml
|-- templates
`-- vars
`-- main.yml
5 directories, 4 files
- hosts: nfs_server
roles:
- nfs-server
- hosts: nfs_client
roles:
- nfs-client