Ansible入门

一、运维自动化发展历程及技术应用

IaaS Infrastructure as a Service 基础设施即服务

PaaS Platform as a Service 平台即服务

SaaS Software as a Service 软件即服务

1、特性

模块化:调用特定的模块,完成特定的功能

有Paramoki、PyYAML、Jinja2(模块语言)三个关键模块

支持自定义模块

基于Python语言实现

部署简单、基于Python和SSH

安全,基于OpenSSH

支持playbook编排任务

幂等性,一个任务执行一遍和执行N遍效果一样,不因重复执行带来意外情况

无需代理不依赖PKI(无需ssl)

可以使用用任何编程语言写模块

YAML格式,编排任务,支持丰富的数据结构

较强大的多层解决方案

2、Ansible架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RHGCYP3T-1602662745820)(ansible架构.png)]

3、Ansible主要组成部分

  • Ansible-playbook(剧本)执行过程:

    将已有编排好的任务集写入Ansible-Playbook

    通过Ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐条执行

  • Ansible主要操作对象

    HOSTS主机

    NETWORKING网络设备

  • 注意事项

    ansible主机称为主控端,master或者堡垒机

    不能在windows系统

4、安装

  • rpm包安装: EPEL源
yum install ansible
  • 编译安装:
yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
tar -xf ansible-1.5.4.tar.gz
cd ansible-1.5.4
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible
  • Git方式:
git clone git://github.com/ansible/ansible.git--recursive 
cd ./ansible
source ./hacking/env-setup
  • pip安装:
#pip是安装Python包的管理器,类似yum
yum install python-pip python-devel
yum install gcc glibc-devel zibl-devel rpm-bulid openssl-devel pip install --upgrade pip
pip install ansible --upgrade
  • 确认安装:
ansible --version

5、相关文件

  • 配置文件

    /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性

    /etc/ansible/hosts 主机清单

    /etc/ansible/roles/ 存放角色的目录

    #ansible配置文件
    vi /etc/ansible/ansible.cfg	
    
    #inventory      = /etc/ansible/hosts #主机列表配置文件
    #library        = /usr/share/my_modules/ #库文件存放目录
    #module_utils   = /usr/share/my_module_utils/ 
    #remote_tmp     = ~/.ansible/tmp #临时py命令文件放在远程主机目录
    #local_tmp      = ~/.ansible/tmp #本机的临时命令执行目录
    #plugin_filters_cfg = /etc/ansible/plugin_filters.yml
    #forks          = 5 #默认的并发数
    #poll_interval  = 15
    #sudo_user      = root #默认sudo用户
    #ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码
    #ask_pass      = True 
    #transport      = smart
    #remote_port    = 22
    #module_lang    = C
    #module_set_locale = False
    #host_key_checking = False #检查对应服务器host_key,建议取消注释
    #log_path = /var/log/ansible.log #日志文件
    
    
  • 程序

    /usr/bin/ansible 主程序,临时命令执行工具

    /usr/bin/ansible-doc 查看配置文档,模块功能查看工具

    /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台

    /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具/usr/bin/ansible-pull 远程执行命令的工具

    /usr/bin/ansible-vault 文件加密工具

    /usr/bin/ansible-console 基于console界面与用户交互的执行工具

6、Inventory主机清单

  • Inventory主机清单

    ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以 在inventory file中将其分组命名

  • 默认的inventory file为/etc/ansible/hosts

  • inventory file可以有多个,且也可以通过Dynamic Inventory来动态生成

二、Ansible命令使用

#help
ansible --help

#ping module 此处ping指定ip模块,需要配置免密
ansible [ip1,ip2] -m ping
#如果没有配置免密需要通过参数 -k 来指定我要输入密码
ansible [ip] -m ping -k

1、ansible系列命令

  • Ansible系列命令
ansible 
ansible-doc 
ansible-playbook
ansible-vault 
ansible-console 
ansible-galaxy 
ansible-pull 
  • ansible-doc:显示模块帮助
ansible-doc [options] [module...]
-a 				显示所有模块的文档
-l,--list		列出可用模块
-s,--snippet	显示指定模块的playbook片段 
#示例:
ansible-doc -l 		列出所有模块
ansible-doc ping	查看指定模块帮助用法
ansible-doc -s ping	查看指定模块帮助用法
  • ansible通过ssh实现配置管理、应用部署、任务执行等功能,建议配置ansible 端能基于密钥认证的方式联系各被管理节点

  • ansible [-m module_name][-a args]

    –version显示版本

    -m module指定模块,默认为command

    -v详细过程-vv -vvv更详细

    –list-hosts显示主机列表,可简写—list

    -k,–ask-pass提示输入ssh连接密码,默认Key验证

    -K, --ask-become-pass提示输入sudo时的口令

    -C, --check检查,并不执行

    -T,–timeout=TIMEOUT执行命令的超时时间,默认10s

    -u, --user=REMOTE_USER 执行远程执行的用户

    -b, --become代替l旧版的sudo切换

  • ansible的Host-pattern 匹配主机列表

    All:表示所有Inventory中的所有主机
    ansible all -m ping
    * :通配符
    ansible “*” -m ping
    ansible 192.168.1.* -m ping
    ansible “*srvs” -m ping
    或关系
    ansible “websrvs:appsrvs” -m ping
    ansible “192.168.1.10:192.168.1.20” -m ping

    逻辑与
    ansible “websrvs:&dbsrvs” -m ping
    在websrvs组并且在dbsrvs组中的主机
    逻辑非
    ansible ‘websrvs:!dbsrvs’ -m ping
    在websrvs组,但不在dbsrvs组中的主机
    注意:此处为单引号
    综合逻辑
    ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ -m ping
    正则表达式
    ansible “websrvs:&dbsrvs” -m ping
    ansible “~(web|db).*.magedu.com” -m ping

  • ansible命令执行过程

    ansible命令执行过程
    1.加载自己的配置文件默认/etc/ansible/ansible.cfg
    2.加载自己对应的模块文件,如command
    3.通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.arsible/tmp/ansible-tmp-数字/XXX.PY文件
    4.给文件+x执行

    ? 5.执行并返回结果
    ? 6.删除临时py文件,sleep o退出
    执行状态:
    ? 绿色︰执行成功并且不需要做改变的操作
    ? 黄色∶执行成功并且对目标主机做变更
    ? 红色∶执行失败

  • ansible使用示例

    示例:

    • 以wang用户执行ping存活检测
      ansible all -m ping-u wang -k
    • 以wang sudo至root执行ping存活检测
      ansible allrm ping-u wang -b-k
    • 以wang sudo至mage用户执行ping存活检测
      ansible all-m ping-u wang-b-k --become-user mage
    • 以wang sudo至root用户执行ls
      ansible all -m command -u wang --become-user=root-a ‘ls /root’ -b -k -K

三、Ansible常用模块详解

1、Command:在远程主机执行命令,默认模块,可忽略-m选项

ansible srvs -m command -a ‘service vsftpd start’
ansible srvs -m command -a ‘echo magedu |passwd --stdin wang’ 不成功

此命令不支持$VARNAME< > │;&等,用shell模块实现

#示例1:查看命令
ansible-doc command
- removes	
#A filename or (since 2.0) glob pattern. If it already exists, this step *will* be run.

ansible all -a "removes=/root cat /etc/hosts"
#返回:
192.168.75.153 | CHANGED | rc=0 >>
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.75.137 | CHANGED | rc=0 >>
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

ansible all -a "removes=/null cat /etc/hosts"
#返回:
192.168.75.153 | SUCCESS | rc=0 >>
skipped, since /null does not exist
192.168.75.137 | SUCCESS | rc=0 >>
skipped, since /null does not exist

- chdir
#Change into this directory before running the command.
ansible all -a "chdir=/boot ls"

#示例2:执行脚本
ansible all -a " /root/test.sh"
192.168.75.153 | FAILED | rc=8 >>
[Errno 8] Exec format error
#解决:
#必须在test.sh 加 #!/bin/bash

#示例3:添加用户
#添加用户
ansible all -a "useradd test_user"
	#返回
	192.168.75.153 | CHANGED | rc=0 >>
	192.168.75.137 | CHANGED | rc=0 >>

#查询用户是否存在
ansible all -a "getent passwd test_user"
	#返回
	192.168.75.137 | CHANGED | rc=0 >>
	test_user:x:1001:1001::/home/test_user:/bin/bash
	192.168.75.153 | CHANGED | rc=0 >>
	test_user:x:1001:1001::/home/test_user:/bin/bash
	
#添加口令
ansible all -a "echo koulin|passwd --stdin test_user"
	#返回,此处没有成功添加口令,只是将echo后面的内容进行打印
	192.168.75.153 | CHANGED | rc=0 >>
	koulin|passwd --stdin test_user
	192.168.75.137 | CHANGED | rc=0 >>
	koulin|passwd --stdin test_user
#需要使用shell模块
ansible all -m shell -a "echo koulin|passwd --stdin test_user"	
	#返回
	192.168.75.153 | CHANGED | rc=0 >>
	Changing password for user test_user.
	passwd: all authentication tokens updated successfully.
	192.168.75.137 | CHANGED | rc=0 >>
	Changing password for user test_user.
	passwd: all authentication tokens updated successfully.

#查看口令	
ansible all -a "getent shadow test_user"
	#返回,没有添加口令返回内容
	ansible all -a "getent shadow test_user"
	192.168.75.153 | CHANGED | rc=0 >>
	test_user:!!:18544:0:99999:7:::
	192.168.75.137 | CHANGED | rc=0 >>
	test_user:!!:18544:0:99999:7:::
	#成功添加后口令返回内容
	192.168.75.153 | CHANGED | rc=0 >>
	test_user:$1$/oH7aZ99$2PU3KS3N04n1vnBHMW62k0:18544:0:99999:7:::
	192.168.75.137 | CHANGED | rc=0 >>
	test_user:$1$SDQ4h5ZP$241sP1v653fREfo2q06Fq/:18544:0:99999:7:::

2、Shell:和command相似,用shell执行命令

ansible srv -m shell -a ‘echo magedu |passwd -stdin wang’
调用bash执行命令类似cat/tmp/stanley.md | awk-F’I’iprint $1,$2y& > /tmp/example.txt这些复杂命令,即使使用shell也可能会失败,解决办法∶写到脚本时,copy到远程,执行,再把需要的结果拉回执行命令的机器

注意:shell模块不是标准模块,需要加参数 -m shell

#示例1:查看命令
ansible-doc shell

#示例2:使用变量,查看$HOSTNAME
ansible all -m shell -a 'echo $HOSTNAME'	#注意:必须使用单引号
	#返回
	192.168.75.153 | CHANGED | rc=0 >>
	e-bdap-mn-2.exp.linxi.com
	192.168.75.137 | CHANGED | rc=0 >>
	e-bdap-mn-3.exp.linxi.com

3、Script:运行脚本

-a “/PATH/TO/SCRIPT_FILE”
snsible websrvs -m script -a f1.sh

#示例1:
ansible-doc script

#示例2:
ansible all -m script -a "host.sh"

cat host.sh
#!/bin/bash
hostname

4、Copy:从服务器复制文件到客户端

ansible srv-m copy-a “src=/root/f1.sh dest=/tmp/f2.sh owner=wang mode=600
backup=yes”
如目标存在,默认覆盖,此处指定先备份
ansible srv-m copy-afcontent='test content\n’dest=/tmp/f1.txt”利用内容,直接生成
目标文件

#示例1:
ansible all -m copy -a 'src=/root/ansible/selinux dest=/etc/selinux/config backup=yes'

ansible all -a "getenforce"	#重启生效
ansible all -a "reboot"

#示例2:
ansible all -a 'src=/etc/shadow dest=/data/ mode=000 owner=wang'

#示例3:
ansible all -m copy -a 'content="hello\nthanks\n" dest=/data/test.txt'
ansible all -a 'cat /root/test.txt'
	#返回
	192.168.75.153 | CHANGED | rc=0 >>
	hello
	thanks
	192.168.75.137 | CHANGED | rc=0 >>
	hello
	thanks

5、Fetch:从客户端取文件至服务器端,copy相反,目录可先tar

ansible srv-m fetch-a ‘src=/root/a.sh dest=/data/scripts’

#示例1:
ansible-doc fetch
src: # (required) The file on the remote system to fetch. This `must' be a file, not a directory. Recursive fetching may be supported in a later release.

#示例2:
ansible all -m fetch -a 'src=/var/log/messages dest=/data'

6、File:设置文件属性

ansible srv-m file -a “path=/root/a.sh owner=wang mode=755”
ansible web -m file -a ‘src=/app/testfile dest=/app/testfile-link state=link’

#示例1:
ansible all -m file -a 'name=/data/test state=absent'	#删除/data/test 
ansible all -m file -a 'name=/data/test state=directory'	#创建文件夹/data/test

#示例2:创建/删除软链接
ansible all -m file -a 'src=/etc/fstab dest=/data/fstab.link state=link'
ansible all -m file -a 'dest=/data/fstab.link state=absent'

#注意:
name=path=state

7、Hostname:管理主机名

ansible node1-m hostname -a “name=websrv”

8、Cron:计划任务

支持时间:minute , hour,day , month , weekday

  • ansible srv-m cron -a"minute=*/5 job=’/usr/sbin/ntpdate 172.16.0.1&>/dev/null" name=Synctime”创建任务
  • ansible srv-m cron -a 'state=absent name=Synctime’删除任务
#每分钟执行一次告警
ansible all -m cron -a 'minute=* weekday=1,3,5 job="/usr/bin/wall FBI warning" name=warningcron'
#禁用定时任务,此处必须加那么,不然会创建一个新的进行禁止
ansible all -m cron -a 'disabled=true job="/usr/bin/wall FBI warning" name=warningcron'
#再次启用
ansible all -m cron -a 'disabled=false job="/usr/bin/wall FBI warning" name=warningcron'

9、待更新。。。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值