yum
state:状态(present,absent,latest),表示是安装还卸载
present:默认的,表示为安装
latest: 安装为最新的版本
absent:表示删除
确认一个软件包已经安装,但不去升级它:
$ ansible webservers -m yum -a "name=lftp state=present"
确认一个软件包的安装版本:
$ ansible webservers -m yum -a "name=lftp state=present"
确认一个软件包还没有安装:
$ ansible webservers -m yum -a "name=lftp state=absent"
service
确认某个服务在所有的webservers上都已经启动:
$ ansible webservers -m service -a "name=httpd state=started"
在所有的webservers上重启某个服务
$ ansible webservers -m service -a "name=httpd state=restarted"
确认某个服务已经停止:
$ ansible webservers -m service -a "name=httpd state=stopped"
使服务开机自启:
$ ansible webservers -m service -a "name=httpd enabled=yes"
user group: 创建或删除用户及组
archive : 压缩文件或目录 path dest format
unarchive : 解压
synchronize
需要系统rsync软件支持,如果没有,则yum安装
因为rsync传文件时也需要用户密码,所以最好配置免密登录。
目的:将主控方/root/a目录推送到指定节点的/tmp目录下
命令:ansible webservers -m synchronize -a 'src=/root/a dest=/tmp/ compress=yes'
执行效果:
delete=yes 使两边的内容一样(即以推送方为主)
compress=yes 开启压缩,默认为开启
--exclude=.git 忽略同步.git结尾的文件
由于模块,默认都是推送push。因此,如果你在使用拉取pull功能的时候,可以参考如下来实现
mode=pull 更改推送模式为拉取模式。将webservers 节点的/tmp/a目录拉取到主控节点的/root目录下命令:
ansible webservers -m synchronize -a 'mode=pull src=/tmp/a dest=/root/'
ansible minis -m synchronize -a 'src=/root/tmp1/ dest=/root/tmp1/ compress=yes recursive=yes delete=yes'
cron 计划任务模块 (name对ansible生效,如果名字一样,则会修改)
# ansible nginx -m cron -a 'name="ansible test1" job="/usr/bin/date >> /tmp/a.txt" minute=* hour=* day=22 month=4'
debug 调试使用
# ansible nginx -m debug -a 'msg="haha 666"'
template: 可以渲染模板
它和copy模块操作相同,只是在远程复制文件时会先填坑
YAML
YAML 是一门标记性语言,专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。
YAML 语言(发音 /ˈjæməl/ )的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式。
基本语法规则:
1.大小写敏感
2.使用缩进表示层级关系
3.不允许使用TAB键来缩进,只允许使用空格键来缩进
4.缩进的空格数量不重要,空格数量要一致,建议使用两个空格
5.使用"#"来表示注释
YAML 支持的数据结构有三种。
对象(字典):键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
数组(列表):一组按次序排列的值,又称为序列(sequence) / 列表(list)
纯量(scalars):单个的、不可再分的值
YAML 还有一个小的怪癖. 所有的 YAML 文件(无论和 Ansible 有没有关系)开始行都应该是 ---. 这是 YAML 格式的一部分, 表明一个文件的开始.
后缀名最好为: yaml yml
例1:第一个playbook脚本
---
- hosts: nginx
gather_facts: no
tasks:
- name: install ntpdate software
yum: name=ntpdate state=present
- name: sync time to ntp1.aliyun.com
command: ntpdate -u ntp1.aliyun.com
- name: use crontab sync time
cron: name="sync time" job="/sbin/ntpdate -u ntp1.aliyun.com" minute=5
例2:假如有一台新服务器,需要对其初始化
新服务器 -》 安装系统--> 配置防火墙 selinux --> 配置时区和时间同步 ---> 配置常用软件或公司内部的监控 --> 需要配置内部yum源
安装系统,配置ip 一般可以使用cobbler或手工完成,接下来使用ansible
一个完整的系统初始化脚本
---
- hosts: nginx
vars:
ntp_server: ntp2.aliyun.com
gather_facts: no
tasks:
- name: mkdir for backup old yum repo
file: path=/etc/yum.repos.d/bak state=directory
- name: backup old yum repo
raw: mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak
- name: config 163 yum repo
copy: src=/etc/ansible/CentOS7-Base-163.repo dest=/etc/yum.repos.d/
- name: make cache for 163 repo
raw: yum clean all && yum makecache
- name: disable selinux (reboot manuel)
copy: src=/etc/ansible/config dest=/etc/selinux/config
- name: start firewalld
service: name=firewalld state=restarted
- name: enable firewalld when reboot
service: name=firewalld enabled=yes
- name: open 80 port
command: firewall-cmd --add-service=http
- name: set timezone
command: timedatectl set-timezone Asia/Shanghai
- name: install ntpdate software
yum: name=ntpdate state=present
- name: sync time to {
{ ntp_server }}
command: ntpdate -u {
{ ntp_server }}
- name: use crontab sync time
cron: name="sync time" job="/sbin/ntpdate -u {
{ ntp_server }}" minute=5
使用变量,实例使用facts变量
---
- hosts: nginx
tasks:
- name: test variable facts
debug: msg={
{ ansible_default_ipv4.address }}
- name: test variable facts
debug: msg={
{ ansible_default_ipv4["address"] }}
安装并配置nginx
---
- hosts: nginx
gather_facts: no
tasks:
- name: install epel-release
yum: name=epel-release state=present
- name: install nginx
yum: name=nginx state=present
notify:
- restart nginx
- name: config nginx
template: src=/etc/ansible/nginx.j2 dest=/etc/nginx/nginx.conf
notify:
- restart nginx
- name: open port
command: firewall-cmd --add-port {
{ http_port }}/tcp
handlers:
- name: restart nginx
service: name=nginx state=restarted