ansible的常用模块
-k 输入密码认证,如果已经配置秘钥了,可以不带-k
-become 类似于sudo
获取模块列表
ansible-doc -l 获取模块使用帮助 ansible-doc -s ping
command
远程主机运行命令,可省略,默认调用此模块 不支持shell特性,比如管道,如果要用,就用shell模块
[ ~]# ansible dns -m command -a "hostname"
192.168.16.201 | SUCCESS | rc=0 >>
WH-DNS-01.JP
192.168.16.161 | SUCCESS | rc=0 >>
WH-DNS-03.JP
shell
远程主机运行命令,支持shell特性,支持管道
[ ~]# ansible dns -m shell -a "ss -tnl |grep :80"
192.168.16.201 | FAILED | rc=1 >>
192.168.16.161 | SUCCESS | rc=0 >>
LISTEN 0 511 *:80 *:*
192.168.16.159 | FAILED | rc=1 >>
192.168.16.144 | FAILED | rc=1 >>
script
在远程主机执行本地脚本,相当于scp+shell
ansible test -m script -a "test.sh"
stat
用于获取远程服务器上的文件信息。
ansible test -m stat -a 'path=/etc/passwd'
copy
本地文件复制到远程主机
[ ~]# ansible dns -m copy -a "src=/etc/passwd dest=/tmp/123.txt"
# 如果文件存在,自动备份文件
[ ~]# ansible dns -m copy -a "src=/etc/passwd dest=/tmp/123.txt backup=yes force=yes"
# 设置属主数组,权限等
[ ~]# ansible dns -m copy -a "src=/etc/passwd dest=/tmp/123.txt owner=root group=root mode=644 force=yes -become"
cron 任务计划
ansible test -m cron -a 'backup=yes name="test cron" minute=*/2 hour=* job="ls /tmp >/dev/null"'
fetch
拉取文件,从远程主机复制到本地
file
设置文件属性
- 创建链接文件:path= src= state=link
ansible all -m file -a "src=/etc/fstab path=/tmp/fstab.link state=link"
- 修改属性: path= owner= mode= group=
- 创建目录: path= state=directory
ansible dns -m file -a "dest=/tmp/123.txt mode=777 owner=ftp group=ftp"
yum 模块
name= 程序包名称,可以带版本号 state= present,latest 安装 absent 卸载
ansible 192.168.16.161 -m yum -a "name=httpd state=latest"
service 管理服务
-
name= 服务的名称
-
state= 服务的状态
- started #启动
- stopped #停止
- restarted #重启
- reloaded #重载
-
sleep= 重启过程中先sleep
-
enabled= 开机自启
ansible 192.168.16.161 -m service -a "name=httpd state=started"
ansible test -m service -a 'name=httpd state=restarted enabled=yes'
user 管理用户账号
创建一个用户名为testlinux的用户
[root@xx ~]# ansible dns -m user -a "name=jupi groups=testlinux state=present" -k
创建一个名为testlinux的组
[root@falcon-server ~]# ansible dns -m group -a "gid=2016 name=testlinux" -k
YAML
YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。其结构(Structure)通过空格来展示,序列(Sequence)里的项用"-“来代表,Map里的键值对用”:“分隔。下面是一个示例。
name: John Smith
age: 41
gender: Male
spouse:
name: Jane Smith
age: 37
gender: Female
children:
- name: Jimmy Smith
age: 17
gender: Male
- name: Jenny Smith
age: 13
gender: Female
使用PyYAML解析YAML文件非常简单.
import yaml
import json
with open('./data.yaml') as f:
p = yaml.load(f)
j = json.dumps(p, sort_keys=True, indent=2)
#print(p)
print(j)
--------------------------------------
{
"age": 41,
"children": [
{
"age": 17,
"gender": "Male",
"name": "Jimmy Smith"
},
{
"age": 13,
"gender": "Female",
"name": "Jenny Smith"
}
],
"gender": "Male",
"name": "John Smith",
"spouse": {
"age": 37,
"gender": "Female",
"name": "Jane Smith"
}
}
playbook的核心元素
hosts: 主机 tasks: 任务 variables: 变量 templates: 包含了模板语法的文本文件 handlers: 由特定条件触发的任务 roles 角色
基础组件: hosts: 运行指定任务的目标主机 remoute_user: 只远程主机上执行任务的用户 sudo_user tasks: 任务列表 模块,模块参数 格式: action:module arguments module:arguments shell和command模块后面直接跟命令,而非key=value类的参数列表