一.变量
# 在webservers组中的主机上,安装httpd、php、php-mysqlnd
[root@pubserver ansible]# vim pkg.yml
---
- name: install pkgs
hosts: webservers
tasks:
- name: install web pkgs # 此任务通过yum安装三个包
yum:
name: httpd,php,php-mysqlnd
state: present
# 根据功能等,可以将一系列软件放到一个组中,安装软件包组,将会把很多软件一起安装上。比如gcc、java等都是开发工具,安装开发工具包组,将会把它们一起安装。
[root@node1 ~]# yum grouplist # 列出所有的软件包组
[root@node1 ~]# yum groupinstall "Development Tools"
# 继续编辑pkg.yml,在webservers组中的主机上安装Development tools组
[root@pubserver ansible]# vim pkg.yml
---
- name: install pkgs
hosts: webservers
tasks:
- name: install web pkgs # 此任务通过yum安装三个包
yum:
name:
- httpd
- php
- php-mysqlnd
state: present
- name: install dev group # 此任务通过yum安装一组包
yum:
name: "@Development Tools" # @表示后面的名字是组名
state: present
[root@pubserver ansible]# ansible-playbook pkg.yml
# 系统升级命令
[root@pubserver ansible]# yum update
# 继续编辑pkg.yml,在webservers组中的主机上升级所有的包到最新版本
---
- name: install pkgs
hosts: webservers
tasks:
- name: install web pkgs
yum:
name:
- httpd
- php
- php-mysqlnd
state: present
- name: install dev group
yum:
name: "@Development Tools"
state: present
- name: update system # 相当于yum update命令
yum:
name: "*" # 表示系统已经安装的所有包
state: latest
[root@pubserver ansible]# ansible-playbook pkg.yml
ansible变量
facts变量:facts变量是ansible自带的预定义变量,用于描述被控端软硬件信息,facts变量通过setup模块获得
# 可以通过setup模块查看所有facts变量
[root@pubserver ansible]# ansible webservers -m setup
# 查看可用内存
[root@pubserver ansible]# ansible webservers -m setup -a "filter=ansible_memfree_mb“
常用的facts变量
ansible_all_ipv4_addresses:所有的IPV4地址
ansible_bios_version:BIOS版本信息
ansible_memtotal_mb:总内存大小
ansible_hostname:主机名
#ansible [被控主机] -m setup | grep {关键词查找}
在playbook中使用变量
如:
# 显示远程主机的主机名和内存大小。在ansible中,变量使用{{}}表示
# debug模块用于输出信息,常用的参数是msg,用于输出指定内容
[root@pubserver ansible]# vim debug.yml
---
- name: display host info
hosts: webservers
tasks:
- name: display hostname and memory
debug: # debug是模块,它的选项msg可以输出指定信息
msg: "hostname: {{ansible_hostname}}; mem: {{ansible_memtotal_mb}} MB"
[root@pubserver ansible]# ansible-playbook debug.yml
二.补充模块
firewalld模块:port:声明端口 permanent:永久生效,但不会立即生效 immediate:立即生效,临时生效 state:enabled,放行;disabled拒绝
防火墙一般默认拒绝,明确写入允许的服务
有一些服务有名字,有些服务没有名字。但是最终都是基于TCP或UDP的某些端口。比如http服务基于TCP80端口。服务名和端口号对应关系的说明文件是:/etc/services ,配置服务器的防火墙,一般来说只要配置开放哪些服务或端口即可。没有明确开放的,都默认拒绝
在webservers组中的主机上安装并启动nginx
客户端访问服务器的nginx服务
在webservers组中的主机上安装并启动firewalld
客户端访问服务器的nginx服务
在webservers组中的主机上开放nginx服务
# 配置nginx服务
[root@pubserver ansible]# vim firewall.yml
---
- name: configure webservers
hosts: webservers
tasks:
- name: install nginx pkg # 这里通过yum模块装httpd
yum:
name: nginx
state: present
- name: start nginx service # 这里通过service模块启httpd服务
service:
name: nginx
state: started
enabled: yes
[root@pubserver ansible]# ansible-playbook firewall.yml
[root@pubserver ansible]# curl http://192.168.88.11/ # 可访问
# 安装并启动firewalld
[root@pubserver ansible]# vim firewall.yml
--- 安装nginx 和 firewalld,起服务 开起防火墙
[root@pubserver ansible]# ansible-playbook firewall.yml
[root@pubserver ansible]# curl http://192.168.88.11/ # 被拒绝
# 配置防火墙规则,放行http协议
[root@pubserver ansible]# vim firewall.yml
--- 安装nginx 和 firewalld,起服务 开起防火墙
- name: set firewalld rules # 通过firewalld模块开放80端口
firewalld:
port: 80/tcp
permanent: yes
immediate: yes
state: enabled
[root@pubserver ansible]# ansible-playbook firewall.yml
[root@pubserver ansible]# curl http://192.168.88.11/ # 可访问
template模块:
copy模块可以上传文件,但是文件内容固定 template模块可以上传具有特定格式的文件(如文件中包含变量) 当远程主机接收到文件之后,文件中的变量将会变成具体的值 template模块上传的文件,使用的语法叫Jinja2。
src:要上传的文件 dest:目标文件路径
# 使用template模块将含有变量的文件上传到webservers组中的主机
[root@pubserver ansible]# vim index.html
Welcome to {{ansible_hostname}} on {{ansible_eth0.ipv4.address}}
[root@pubserver ansible]# vim templ.yml
---
- name: upload index
hosts: webservers
tasks:
- name: create web index
template:
src: index.html
dest: /usr/share/nginx/html/index.html
[root@pubserver ansible]# ansible-playbook templ.yml
[root@pubserver ansible]# curl http://192.168.88.11/
Welcome to web1 on 192.168.88.11
进阶语法:
当Playbook中包含很多任务时,当某一个任务遇到错误,它将崩溃,终止执行
可以指定某一个任务如果出现错误,则忽略它
ignore_errors
# 编辑myerr.yml,如果myslqd服务无法启动,则忽略它
[root@pubserver ansible]# vim myerr.yml
---
- name: my errors
hosts: webservers
tasks:
- name: start mysqld service
service:
name: mysqld
state: started
enabled: yes
ignore_errors: yes # 即使这个任务失败了,也要继续执行下去
- name: touch a file
file:
path: /tmp/service.txt
state: touch
[root@pubserver ansible]# ansible-playbook myerr.yml
[root@web1 ~]# ls /tmp/service.txt # 第2个任务已执行
/tmp/service.txt