Ansible自动化运维之基础用法

作者: admin 分类: 自动化运维 发布时间: 2021-04-22 15:20

Ansible的特点:

  • 1.ansible不需要单独安装客户端,SSH相当于ansible客户端。
  • 2.ansible不需要启动任何服务,仅需安装对应工具即可。
  • 3.ansible依赖大量的python模块来实现批量管理。
  • 4.ansible配置文件/etc/ansible/ansible.cfg

Ansible基本架构

%title插图%num

1、ansible安装

(1)配置epel源
(2)安装

yum install -y ansible

2、ansible语法

ansible [主机清单] -m [模块] -a [动作]

3、配置主机清单

模板:
[组名]      #设置组,使用[]
ip1:22      #如端口不是默认,在ip后面直接加上即可
ip2 ansible_ssh_user='root' ansible_ssh_pass='123456'
#如果没有给对应的主机下发公钥,可以使用密码的方式进行添加
ip3
[组名:children] #组的嵌套
组名1
组名2
[组名:vars]
ansible_ssh_user='root'
ansible_ssh_pass='123456' #如果密码相同,可使用指定变量方式
ansible_ssh_port=2222
例:
[root@qunniao_30 ~]# vim /etc/ansible/hosts
[web]
10.1.1.31:22
10.1.1.32
[db]
10.1.1.33
注:在使用命令之前首先配置相应的主机清单(/etc/ansible/hosts),建议进行免密钥验证

4、ansible常用模块

ping:检测远程主机是否存活
例:
[root@qunniao_30 ~]# ansible all -m ping   #all为主机清单中所有主机
10.1.1.33 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
10.1.1.31 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
10.1.1.32 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
command:在远程主机上执行shell命令(不支持管道等特殊用法)
例:
[root@qunniao_30 ~]# ansible all -a 'hostname'    
10.1.1.33 | CHANGED | rc=0 >>
qunniao_33
10.1.1.31 | CHANGED | rc=0 >>
qunniao_31
10.1.1.32 | CHANGED | rc=0 >>
qunniao_32
注:默认模块为command,可以不写
shell:在远程主机上执行shell命令(与command的命令类似,支持管道等特殊操作)
例:
[root@qunniao_30 ~]# ansible web -m shell -a 'cat /etc/passwd|grep root'
10.1.1.31 | CHANGED | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
10.1.1.32 | CHANGED | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
file:创建文件或目录
  • group:定义文件/目录的属组
  • owner:定义文件/目录的属主
  • mode:定义文件/目录的权限
  • path:必选项,定义文件/目录的路径
  • recurse:递归设置文件的属性,只对目录有效
  • state:
    • directory:如果目录不存在,创建目录
    • touch:如果文件不存在,创建一个新文件
    • absent:删除文件或目录
    • link:链接
例:
(1)创建目录
[root@qunniao_30 ~]# ansible all -m file -a 'path=/data state=directory owner=root group=root mode=644'

(2)创建文件
[root@qunniao_30 ~]# ansible db -m file -a 'path=/data/file state=touch'

(3)创建链接
[root@qunniao_30 ~]# ansible db -m file -a 'src=/etc/fstab dest=/tmp/fstab state=link'

(4)删除
[root@qunniao_30 ~]# ansible db -m file -a 'path=/data/file state=absent'
copy:复制文件或目录
  • src: 源路径
  • dest: 目标路径
  • backup:覆盖之前,是否备份原文件
  • owner:设定文件/目录的属主
  • group:设定文件/目录的属组
  • mode:设定文件/目录的权限
  • content:填充内容
例:
(1)复制文件并修改权限
[root@qunniao_30 ~]# ansible web -m copy -a 'src=/root/ssh_key.sh dest=/data/ owner=root mode=644'
(2)覆盖前备份原文件
[root@qunniao_30 ~]# ansible web -m copy -a 'src=/root/ssh_key.sh dest=/data/ backup=yes'
(3)创建有内容文件
[root@qunniao_30 ~]# ansible db -m copy -a 'content="ansible is test" dest=/data/test.txt'
(4)复制目录
[root@qunniao_30 ~]# ansible web -m copy -a 'src=/data1 dest=/data/'
group:配置用户组
  • name: 指定创建的组名
  • gid : 指定组的gid
  • state
    • absent — 移除远端主机的组
    • present — 创建远端主机的组(默认)
例:
(1)创建组
[root@qunniao_30 ~]# ansible web -m group -a 'name=test1 gid=101'
(2)删除组
[root@qunniao_30 ~]# ansible web -m group -a 'name=test1 state=absent'
user:配置用户
  • home:指定家目录,需要createhome为yes
  • group:用户组
  • groups:附加用户组
  • uid:用户UID
  • password:指定用户密码
  • name:用户名
  • createhome:是否创建家目录
  • system:是否创建为系统用户
  • remove:且state=absent时,删除家目录
  • shell:指定用户shell环境
  • state:
    • present:创建(默认)
    • absent:删除
例:
(1)创建用户
[root@qunniao_30 ~]# ansible web -m user -a 'name=admin uid=100 system=yes shell=/sbin/nologin'
(2)删除用户
[root@qunniao_30 ~]# ansible web -m user -a 'name=admin state=absent remove=yes'
(3)创建带密码用户
[root@qunniao_30 ~]# echo “123123” | openssl passwd -1 -stdin
$1$GfaiWNFj$tWGBbFUA/BwvAjy2FutMe.
[root@qunniao_30 ~]# ansible web -m user -a 'name=admin password="$1$GfaiWNFj$tWGBbFUA/BwvAjy2FutMe." system=yes shell=/bin/bash'
注:创建创建密码时必须根hash值,否则明文密码无效
script:脚本运行
例:
[root@qunniao_30 ~]# ansible all -m script -a '/root/hostname.sh'
yum:用于安装软件包
  • enablerepo:启用某个源
  • name:软件包的名字,也可传递一个url或本地的rpm包的路径
  • state:定义软件包状态
    • present , installed:安装 (默认)
    • absent , removed:删除
    • latest:安装最新的
例:
(1)安装软件
[root@qunniao_30 ~]# ansible web -m yum -a 'name=nginx'
(2)删除软件
[root@qunniao_30 ~]# ansible web -m yum -a 'name=nginx state=absent'
service:服务管理
  • enabled:是否开机启动 yes|no
  • name:必选项,服务名称
  • runlevel:运行级别
  • sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟
  • state:
    • started:启动
    • stopped:停止
    • restarted:重启
    • reloaded:重新加载
例:
(1)启动服务并开机启动
[root@qunniao_30 ~]# ansible web -m service -a 'name=nginx state=started enabled=yes'
(2)关闭服务
[root@qunniao_30 ~]# ansible web -m service -a 'name=nginx state=stopped'
cron:定时任务
  • backup:对远程主机上的原任务计划内容修改之前做备份
  • day:日(1-31,/2,……)
  • hour:小时(0-23,/2,……)
  • minute:分钟(0-59,/2,……)
  • month:月(1-12,/2,……)
  • weekday:周(0-7,*,……)
  • job:要执行的任务,依赖于state=present
  • name:该任务的描述
  • user:以哪个用户的身份执行
  • state:
    • present:创建(默认)
    • absent:删除
例:
(1)创建任务
[root@qunniao_30 ~]# ansible web -m cron -a 'name="check disk" minute=*/5 job="df -h &>/root/check.log"'
(2)禁用任务
[root@qunniao_30 ~]# ansible web -m cron -a 'name="check disk" minute=* job="df -h &>/root/check.log" disabled=yes'
(3)删除任务
[root@qunniao_30 ~]# ansible web -m cron -a 'name="check disk" state=absent'  
[root@qunniao_30 ~]# ansible web -m cron -a 'name="check date" minute=* job="date >>/root/date.log" state=absent'
mount:挂载设备
  • src:挂载设备
  • path:挂载点
  • fstype:文件类型
  • opts:装载选项
  • state:
    • present :开机挂载,仅将挂载配置写入/etc/fstab
    • mounted :挂载设备,并将配置写入/etc/fstab
    • unmounted :卸载设备,不会清除/etc/fstab配置
    • absent :卸载设备,并删除/etc/fstab相关配置及挂载目录
例:
(1)挂载
[root@qunniao_30 ~]# ansible db -m mount -a 'src=/dev/sdb path=/data fstype=xfs opts=defaults state=mounted'
(2)卸载
[root@qunniao_30 ~]# ansible db -m mount -a 'src=/dev/sdb path=/data fstype=xfs opts=defaults state=absent'
fetch:拉取远程主机文件
  • src:远程主机源文件路径
  • dest:当前主机存放路径
例:
[root@qunniao_30 ~]# ansible db -m fetch -a 'src=/data/test.txt dest=/root/'
setup:查询远程主机基本信息
  • filter: 条件过滤(仅返回匹配条件信息)
例:
(1)获取db主机ipv4地址
[root@qunniao_30 ~]# ansible db -m setup -a 'filter=ansible_all_ipv4_addresses'
10.1.1.33 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"10.1.1.33"
],
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
(2)获取db主机内在信息
[root@qunniao_30 ~]# ansible db -m setup -a 'filter=ansible_memory_mb'
10.1.1.33 | SUCCESS => {
"ansible_facts": {
"ansible_memory_mb": {
"nocache": {
"free": 1667,
"used": 152
},
"real": {
"free": 1562,
"total": 1819,
"used": 257
},
"swap": {
"cached": 0,
"free": 1023,
"total": 1023,
"used": 0
}
},
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
(3)模糊查询,如以关键字“dns”
[root@qunniao_30 ~]# ansible db -m setup -a 'filter=*dns*'
10.1.1.33 | SUCCESS => {
"ansible_facts": {
"ansible_dns": {
"nameservers": [
"223.6.6.6"
]
},
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
setup常用信息:
  • 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个数(只显示总的个数)。
查询模块用法
ansible-doc -s [模块名]
例:
[root@qunniao_30 ~]# ansible-doc -s ping
- name: Try to connect to host, verify a usable python and return `pong' on success
ping:
   data: # Data to return for the 'ping' return value. If this,
           parameter is set to `crash',the module will cause an
           exception.

温馨提示:如无特殊说明,本站文章均为作者原创,转载请注明出处!

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论