ansible是什么?

可以批量在远程主机上执行命令

准备条件:

  1.创建一台环境干净的虚拟机。

  2.克隆出三台虚拟机。

  3.安装wget:

wget -O /etc/yum.repos.d/CentOS-Base.repo        #http://mirrors.aliyun.com/repo/Centos-7.repo
yum install -y wget  

  4.安装ansible:

wget -O /etc/yum.repos.d/epel.repo #http://mirrors.aliyun.com/repo/epel-7.repo
yum install -y ansible

ps:

  • salt 控制节点需要安装salt-master
  • salt 被控节点需要安装salt-minion
  • ansible通过ssh来连接并控制被控节点

ssh的认证方式是什么?

有两种方式
.通过密码来连接
.通过密钥来连接

补充:

ssh-keygen   #用来生成ssh的密钥对   一直回车即可
ssh-copy-id 192.168.22.129 # 复制秘钥到远程主机

ansible也提供了ping的命令,首先查看ansible的命令格式:    ansible -h

-a MODULE_ARGS, --args=MODULE_ARGS   #模块的参数
-C, --check # 检查
-f FORKS, --forks=FORKS #用来做高并发的
--list-hosts #列出主机列表
-m MODULE_NAME #模块名称
--syntax-check # 语法检查
-k 输入密码

然后执行ansible的ping命令尝试一下:

ansible 192.168.22.129 -m  ping

哎,报错了,显示主机列表是空的

产看ansible安装完成生成了那些文件    rmp -ql ansible| more

查看ansible的host文件

# This is the default ansible 'hosts' file.
#
# It should live in /etc/ansible/hosts
#
# - Comments begin with the '#' character # 用#来表示注释
# - Blank lines are ignored # 空白行被忽略
# - Groups of hosts are delimited by [header] elements # 主机组 需要在【】下面
# - You can enter hostnames or ip addresses #可以写主机名或者ip地址
# - A hostname/ip can be a member of multiple groups # 一台主机可以在多个组里面
www[:].example.com #表示从www001到www006的机器

编辑ansible的主机文件     vi /etc/ansible/hosts,在空白处添加自己克隆的三台虚拟机的IP地址

然后再各自ping一下,查看结果。  发现只有192.168.22.129ping通了,原因是它加了密钥认证,其他的如果不想加密钥认证的话只要要在  ping 后边加-k就OK了   ansible 192.168.22.130  -m ping -k

那么问题来了,如果我想测试我所有的机器在线怎么办呢?

嘿嘿,接下来就NB了,睁大双眼看好了。

ansible all -m ping

哈哈!

那么又有一个新的问题,如何让测试130和131着两台机器在不在线呢?

哈哈,这回不装x了,为了避免代码的重复,其实可以连着写。这样就ok了!

sorry,现在又有了新的问题,如果我的host文件中有100台机器,我只想查看其中的20台机器是否在线,那么现在怎么办呢?

我们可以通过各自的功能来分组,那么就来改一下我们的hosts的配置问价了。  vi /etc/ansible/hosts

修改完成之后我们来查看一下     ansible   web --list-hosts

正如我们想的,添加成功了!

然后我们再来ping一下试一试   ansible  web  -m ping

成功!

之前用逗号隔开也可以ping 那么分组可不可以也用逗号来ping呢?试一下!     ansible  web ,db  -m  ping    也成功了!NB!

还有一种写法:  ansible 'web:db'  -m ping

产看web和db中共同存在的机器   ansible  'web:&db'  -m  ping

如何查看在web中但是不在db中的机器呢 ?     ansible  "web:!db"   -m ping

查看ansible模块的相关参数   ansible-doc -h

ansible-doc [-l|-F|-s] [options] [-t <plugin type> ] [plugin]
-j #以json的方式返回ansible的所有模块
-l, --list#列出所有的ansible的模块
-s#以片段式显示ansible的帮助信息

补充(面试题):

系统自带的ping走的是ICMP协议

ansible与命令相关的模块   command,使用ansible-doc -s  command来查看commend模块的详细信息

我们从文档中已经知道  -a 是参数
ansible web -a "ls /" 查看web组的根目录
ansible web -a 'pwd' 查看web组的当前工作目录
ansible web -a'chdir=/tmp pwd' 切换到tmp目录下来查看当前的工作目录 使用场景: 在编译的时候使用
ansible web -a'creates=/tmp pwd' 判断tpm是否存在,如果存在的话,就不执行操作
ansible web -a'create=/data pwd' 判断data是否存在,不存在就执行操作
ansible web -a 'removes=/tmp pwd' 判断tmp是否存在,存在就执行操作
ansible web -a'removes=/data pwd' 判断data是否存在,不存在就不执行操作

需求: 在web组下面创建一个用户Bound_w

创建用户:ansible web -a 'useradd Bound_w'
查看用户:tail - /etc/passwd
查看用户:tail -1 /etc/shadow
查看用户:id Bound_w
给创建的用户设置密码:passwd
一步直接设置密码:echo '123' | passwd --stdin Bound_w #设置密码

shell模块

ansible web -m shell -a'echo "123" | passwd  --stdin Bound_w'  批量创建密码

ansible 192.168.107.131 -m shell -a 'bash a.sh' # 执行远程文件方式一

ansible 192.168.107.131 -m shell -a '/root/a.sh' #执行远程文件方式二,文件必须有执行权限

ansible 192.168.107.131 -m shell -a '/root/a.py' # 执行远端的Python脚本
备注:增加x权限  chmod +x  a.py

script模块

ansible web -m script -a '/root/m.sh' # 执行本地的文件,执行管控机上的文件
ansible web -m script -a 'removes=/root/m.sh /root/m.sh' # 用来判断被管控机上是不是存在文件,如果存在,存在就执行,不存在就不执行
ansible web -m script -a 'creates=/root/a.sh /root/m.sh' #用来判断被管控机上是不是存在文件,如果存在,就不执行

有一个需求,把本地的文件复制到远程上去?怎么办呢?接下来就看一下ansible的copy模块。

文件相关模块  copy模块

backup 备份,以时间戳结尾
dest 目的地址
group 文件的属组
mode 文件的权限 r w x
owner 文件的属主
src 源文件
# 通过md5码来判断是否需要复制
ansible db -m copy -a 'src=/root/m.sh dest=/tmp/a.sh' #复制本地文件的到远程主机
ansible db -m copy -a 'src=/root/m.sh dest=/tmp/a.sh mode=755' #修改文件的权限
ansible web -m copy -a 'src=/root/m.sh dest=/tmp/a.sh mode=755 owner=alex' 修改文件的属主
ansible web -m copy -a 'src=/etc/init.d dest=/tmp/ mode=755 owner=alex' # 复制本地目录到远程主机,如果改变文件的属性,则文件夹内的文件也会被改变
ansible web -m copy -a 'src=/etc/init.d/ dest=/tmp/ mode=755 owner=alex' # 复制本地目录内的所有文件到远程主机
ansible web -m copy -a "content='大弦嘈嘈如急雨,小弦切切如私语\n' dest=/tmp/b.txt" # 直接将文本内容注入到远程主机的文件中 

file模块

ps:file模块中的src只有当满足这个条件的时候(applies only to `state=link' and `state=hard')才有用

ansible db -m file -a 'path=/lzmly2  state=directory' #在远程机器上创建文件夹
ansible db -m file -a 'path=/root/q.txt state=touch' #用来在远程机器上创建文件
ansible db -m file -a 'path=/tmp/f src=/etc/fstab state=link' #创建软连接src是源地址,path是目标地址
ansible db -m file -a 'path=/tmp/f state=absent' #用来删除文件或者文件夹

总结:

在远程机器上创建文件夹的时候,state = directory
在远程机器上创建文件的时候, state = touch
在远程机器上创建软连接的时候 state = link
在远程机器上创建文件夹或者文件的时候 state = absent

fetch模块

dest 目的地址
src 源地址
ansible web -m fetch -a 'src=/var/log/cron dest=/tmp' # 下载被控节点的文件,每台机器创建一个文件夹,并保留原来的目录结构

rpm和yum的区别?

yum可以解决依赖关系

yum源配置   cat /etc/yum.repos.d/CentOS-Base.repo

[epel]
name=Extra Packages for Enterprise Linux - $basearch #名字
baseurl=http://mirrors.aliyun.com/epel/7/$basearch #rpm源的地址,可以写http,https,ftp,Samba,file:
failovermethod=priority
enabled= # 是否开启,1代表开启,0表示关闭
gpgcheck= #是否校验签名,1代表校验,0表示校验 校验下载的包的安全性
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

yun如何安装一个包组?

yum  grouplist  #查看包组信息
yum groupinstall #安装包组

disablerepo #禁用源
enablerepo #启用源
name #包名
state install (`present' or `installed', `latest'), or remove (`absent' or `removed') 安装 卸载

将yum的epl源拷贝到web组里面

ansible web -m copy -a 'src=/etc/yum.repos.d/epel.repo dest=/etc/yum.repos.d/epel.repo'
ansible web -m yum -a 'name=wget' # 安装wget
ansible web -m yum -a 'name=python2-pip' # 安装python2-pip
ansible web -m yum -a 'name=wget state=absent' # 卸载软件包
ansible web -m yum -a 'name="@Development Tools"' # 安装包组

pip 安装模块

pip install 安装包
pip freeze >a.txt 将Python 中的环境打包到文件中
pip install -r a.txt 安装文件中的包
pip list 查看所有已经安装成功的包
ansible web -m pip -a'name=flask' #安装flask模块

service 启动

ps -ef|grep nginx   查看进程
ss -tnlp 查看端口信息
systemctl start nginx centos7启动nginx
service nginx start centos6启动nginx
systemctl enabled nginx centos7开机自启
chkconfig nginx on centos6开机自启
ansible  web -m service -a'name=nginx   state=started'   启动nginx
ansible web -m service -a 'name=nginx state=stopped' 关闭nginx

有关端口的补充:

nginx  的默认端口   80

http  的默认端口80

https  的默认端口443

redis 的默认端口  6379

mongodb 的默认端口  27017

mysql 的默认端口3306

ssh 的默认端口 22

ftp  的默认端口 21

windows的远程桌面端口  3389

Windows IIS的默认端口是80

cron  定时任务

* * * * * job
分 时 日 月 周 任务
*/ * * * job 每隔两个小时
, * * * job 12点和13点
- * * * job 12点到17点
-/ * * ,,, 周1,周3,周6,周7 12点到17点每隔两个小时
crontab -e # 编辑计划任务
crontab -l # 查看计划任务
crontab -r # 删除计划任务
day  天
disabled 禁用
hour 小时
job 任务
minute 分钟
month 月
name 任务名字
weekday 周
ansible db -m cron -a 'minute=26 job="touch /tmp/xzmly.txt" name=touchfile' # 新建一个计划任务
ansible db -m cron -a 'name=touchfile state=absent' # 删除一个计划任务
ansible db -m cron -a 'minute=26 job="touch /tmp/xzmly.txt" name=touchfile disabled=yes' # 禁用计划任务,以#表示禁用

user

用户:
管理员 root
普通用户
系统用户 不能登录 - centos7 - centos6
登录用户 可以登录 - centos7 - centos6
用户组:
管理员组 root
系统用户组 - centos7 - centos6
登录用户组 - centos7 - centos6 -d 指定用户的家目录
-g 指定用户的组
-G 执行用户的附加组
-s 指定登录后使用的shell
-r 创建一个系统组
useradd -r wusir 创建系统用户, 从999倒序
useradd -s /sbin/nologin alexsb 创建的是普通用户,从1000开始升序
useradd -d /opt/alexsb2 alexsb2 创建用户时指定用户的家目录
useradd -u alexsb6 # 创建用户并指定用户的uid
userdel alex 删除用户
userdel -r alexsb2 删除用户并删除用户的家目录 groupadd yuchao 创建用户组
groupdel yuchao 删除用户组
group 组
groups 附加组
home 家目录
name 用户名
password 密码
remove ?
shell 用户登录后使用的shell
system 创建一个系统用户
uid 用来指定用户的id
state 状态
ansible db -m user -a 'name=wulaoshi uid=4000 home=/opt/wulaoshi groups=root shell=/sbin/nologin' #创建一个用户,并指定用户的id,用户的家目录,用户的附加组,用户的shell
ansible db -m user -a 'name=wulaoshi state=absent' #删除用户但是不删除用户的家目录
ansible db -m user -a 'name=wulaoshi3 state=absent remove=yes' # 删除用户并删除用户的家目录

group

gid 组的id
name 组名
system 系统组
state
ansible db -m group -a 'name=wulaoshi system=yes' #创建系统组
ansible db -m group -a 'name=wulaoshi state=absent' # 删除组

yaml是什么呢?

是一门编程语言,Java的配置文件是由xml写的,yaml也是用来写配置文件的。后缀名以yaml或者yml来结尾

playbook

执行顺序: 从上往下

特性:幂等性 不管执行多少遍,结果都是一样的

ansible-playbook [options] playbook.yml [playbook2 ...]
-C, --check # 检查,白跑,干跑,会执行,但是不会落地 ansible-playbook -C p1.yml
-f FORKS, --forks=FORKS #用来做并发
--list-hosts # 列出主机列表 ansible-playbook --syntax-check p1.yml --syntax-check # 语法检查

举个例子:

- hosts: web
tasks:
- name: creategroup
group: name=alex10
- name: createuser
user: name=wusir10

传参

p2.yml
- hosts: web
tasks:
- name: create{{ user }}
user: name={{ user}}

第一种方式:

ansible-playbook -e 'user=alexsb10' p2.yml   #创建p2.yml文件 并执行

第二中方式: 在/etc/ansible/hosts文件中加入user

[db]
192.168.107.132 user=alexsb11
192.168.107.133 user=alexsb12
ansible-playbook  p2.yml

第三种方式:在/etc/ansible/hosts文件中加入[db:vars]

[db]
192.168.22.134
192.168.22.133
[db:vars]
user=yuan3
ansible-playbook  p2.yml

第四种方式:创建p3.yml 并执行

- hosts: db
vars:
- user: alexsb14
tasks:
- name: create{{ user }}
user: name={{ user}}

第五种传参方式:创建p4.yml 并执行

- hosts: db
tasks:
- name: sum
shell: echo +|bc
register: user
- name: createuser
user: name={{user.stdout}}

传参方式的优先级:

-e > playbook vars > hosts文件

ansible 基础操作的更多相关文章

  1. ansible基础-安装与配置

    一 安装 1.1 ansible架构 ansible是一个非常简单的自动化部署项目,由python编写并且开源.用于提供自动化云配置.配置文件管理.应用部署.服务编排和很多其他的IT自动化需求. an ...

  2. ansible基础-Jinja2模版 | 过滤器

    Jinja2模版介绍 注:本文demo使用ansible2.7稳定版 在ansible基础-变量的「8.2 模版使用变量」章节中关于模版与变量也有所提及,有兴趣的同学可以去回顾一下. ansible通 ...

  3. ansible基础-理解篇

    1. 介绍 要说现在的部署工具,ansible可以说家喻户晓了. ansible是一个开源软件,用于软件供应.配置管理.应用部署.ansible可以通过SSH.remote PowerShell.其他 ...

  4. ansible基础-playbooks

    1. playbooks介绍 如果说ansible的modules是工具,inventory配置文件是原材料,那么playbook就是一封说明书,这里会记录任务是如何如何执行的,当然如果你愿意,这里也 ...

  5. ansible基础-playbook剧本的使用

    ansible基础-playbook剧本的使用 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.YAML概述 1>.YAML的诞生 YAML是一个可读性高,用来表达数据序 ...

  6. 003.Ansible基础使用

    一 Ansible命令用法 Ansible命令行执行方式有:Ad-Hoc.Ansible-playbook两种,Web方式其官方提供付费产品Tower.Ad-Hoc主要用于临时命令的执行,Ansibl ...

  7. 自动化运维工具-Ansible基础

    目录 自动化运维工具-Ansible基础 什么是Ansible 同类型软件对比 Ansible的功能及优点 Ansible的架构 Ansible的执行流程 安装Ansible ansible配置文件 ...

  8. 自动化运维工具-Ansible基础及Ansible Ad-Hoc

    第58章 Ansible 目录 第58章 Ansible 一.Ansible基础概述 1.1)什么是Ansible 1.2)Ansible可以完成哪些功能呢?1.3)Ansible特点 1.4)Ans ...

  9. Ansible--01 ansible基础 Ansible-ad- hoc

    目录 自动化运维工具-Ansible基础 自动化运维的含义 Ansible 基础及安装 Ansible的架构 Ansible的执行流程 ansible配置文件 ansible Inventory(主机 ...

随机推荐

  1. The file is inaccessible to Server.

    ArcGIS Unable to Start serviceserver安装后,启动服务失败,报错信息如下:Unable to Start service. Error (Server object  ...

  2. 阶段3 1.Mybatis_10.JNDI扩展知识_2 补充-JNDI搭建maven的war工程

    使用骨架 src下创建test目录 再新建java和resources两个Directory test下面创建java java的目录,让他作为源码的跟目录 test下的java文件夹 选择 完成之后 ...

  3. SAP简介

    1. 什么是SAP SAP的英文全名为System Application and Products in Data Processing.SAP既是公司名称,又是其产品的软件名称. 2. SAP的诞 ...

  4. 正则表达式——Unicode 属性

      每一个 Unicode 字符,除了有 Code Point 与之对应外,还具体其他属性,在正则表达式中常用到三种 Unicode 属性: Unicode Property.Unicode Scri ...

  5. Html5 Canvas斗地主游戏

    过完年来公司,没什么事,主管说研究下html5 游戏,然后主管就给了一个斗地主的demo,随后我就开始看代码, 现在我看了html5以及canvas相关知识和斗地主的demo后,自己用demo上的素材 ...

  6. CentOS7编译安装sshpass过程

    环境说明:centos 7 cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) 我的sshpass版本 sshpass-1.06. ...

  7. 005 gcc 的简单使用

    0. 前言 本文主要讲关于 gcc 的几种编译方式 不妨设文件名为 test.c 1. 方法一 $ gcc test.c (Windows OS)编译成功的话,没有回馈,在 test.c 所在的文件夹 ...

  8. 通过metaclass实现精简的ORM框架

    摘抄于<python-3-廖雪峰> 使用ORM框架 class User(Model): #定义类的属性到列的映射: id = IntegerFiled('id') name = Stri ...

  9. python文件打包/导入 .so 文件

    打包so文件 见: http://www.cnblogs.com/ke10/p/py2so.html 导入so文件 import sys sys.path.append(r'/home/project ...

  10. Rest_Framework常用插件

    1. 认证Authentication 可以在配置文件中配置全局默认的认证方案 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest ...