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类的参数列表