运维自动化ansible

一、ansible发展史及功能

官网:https;//www.ansible.com/

官方文档:https://docs.ansible.com/

  1.1 ansible功能

  • 批量执行远程命令,可以控制多台主机进行操作
  • 批量安装和配置软件服务,可以对多台主机进行自动化的方式配置和管理各种服务
  • 编排高级的企业级复杂IT架构任务,例如:playbook、role
  • 提供自动化韵味工具的开发API,例如:jumpserver

  1.2 ansible特性

  • 模块化
  • 三个关键模块:Paramiko(python),pyYAML,Jinja2(模版语言)
  • 基于python语言实现
  • 部署简单,依赖于python和SSH
  • 安全,它是基于OpenSSH
  • 幂等性
  • 支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构
  • 较强大的多层解决方案role

  1.3 ansible架构

  1.3.1 Ansible组成
  • INVENTORY:Ansible管理主机的清单 /etc/anaible/hosts 需要管理的服务清单
  • MODULES:Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
  • PLUGINS:模块功能的补充,如连接类型插件、循环插件、变量插件、过滤插件等,该功能不常用
  • API:供第三方程序调用的应用程序编程接口

  1.3.2 ansible命令执行来源
  • USER 普通用户,即SYSTEM ADMINISTRATOR
  • PLAYBOOKS:任务剧本(任务集),编排定义Ansible任务集的配置文件,由Ansible顺序依次执行,通常是JSON格式的YML文件
  • CMDB(配置管理数据库) API 调用
  • PUBLIC/PRIVATE CLOUD API调用

二、ansible安装及入门

  2.1 安装

  2.1.1 安装epel源和ansible

  2.1.2 查看ansible配置项 

  2.1.3 编辑hosts 

  2.1.4 远程连接虚拟机二 

  2.1.5 远程连接虚拟机三

  2.1.6 同时ping通两台虚拟机

  2.1.7 查看web主机名

  2.1.8 分别在web下创建文件test 
   2.1.9 分别在两台虚拟机上查看test文件

  2.1.10 免密登陆

  2.2 查看基本信息

  2.3 相关信息

  • /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性,也可以在项目的目录中创建此文件,当前目录下如果也有ansible.cfg,则此文件优先生效,建议每个项目目录下,创建独有的ansible.cfg文件
  • /etc/ansible/hosts 主机清单
  • /etc/ansible/roles/ 存放角色的目录

  2.4 ansible主配置文件

ANSIBLE_CONFIG #环境变量,注意此项用 ansible --version 看不到,但可以生效
./ansible.cfg   #当前目录下的ansible.cfg
~/.ansible.cfg #当前用户家目录下的.ansible.cfg
/etc/ansible/ansible.cfg  #系统默认配置文件

    Ansible 的默认配置文件 /etc/ansible/ansible.cfg ,其中大部分的配置内容无需进行修改

[defaults]
#inventory     = /etc/ansible/hosts     #主机列表配置文件
#library = /usr/share/my_modules/         #库文件存放目录
#remote_tmp = $HOME/.ansible/tmp         #临时py命令文件存放在远程主机目录
#local_tmp     = $HOME/.ansible/tmp     #本机的临时命令执行目录
#forks         = 5                       #默认并发数
#sudo_user     = root                     #默认sudo 用户
#ask_sudo_pass = True                     #每次执行ansible命令是否询问ssh密码
#ask_pass     = True   
#remote_port   = 22
#host_key_checking = False                 #检查对应服务器的host_key,建议取消此行注释,实现第一次连接自动信任目标主机
#log_path=/var/log/ansible.log             #日志文件,建议启用
#module_name = command           、mod        #默认模块,可以修改为shell模块
[privilege_escalation]                     #普通用户提权配置
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False

  2.5 inventory主机清单文件

    默认的inventory file文件在:/etc/ansible/hosts

参数详细说明

ansible_ssh_host 
#将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.


ansible_ssh_port 
#ssh端口号.如果不是默认的端口号,通过此变量设置.这种可以使用 ip:端口
192.168.1.100:2222

ansible_ssh_user 
#默认的 ssh 用户名

ansible_ssh_pass 
#ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)

ansible_sudo_pass 
#sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)

ansible_sudo_exe (new in version 1.8)
#sudo 命令路径(适用于1.8及以上版本)

ansible_connection 
#与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行.

ansible_ssh_private_key_file
#ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.

ansible_shell_type 
#目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为'csh' 或 'fish'.

ansible_python_interpreter 
#目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 \*BSD, 或者 /usr/bin/python 不是 2.X 版本的Python.之所以不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26).与ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....

  2.6 ansible相关工具

  • /usr/bin/ansible 主程序,临时命令执行工具
  • /usr/bin/ansible-doc 查看配置文档,模块功能查看工具,相当于man ansible-doc -l |grep 关键字 具体模块名字
  • /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具,相当于脚本
  • /usr/bin/ansible-pull 远程执行命令的工具
  • /usr/bin/ansible-vault 文件加密工具
  • /usr/bin/ansible-console 基于Console界面与用户交互的执行工具
  • /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台

  2.6.1 ansible

    执行临时任务一次性任务

    格式:

ansible     <host-pattern>          [-m module_name]       [-a args]
命令     主机或者清单中的组          -m 指定模块      -a  执行的任务

    或、且、非 

  ansible执行命令过程

1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg
#[root@node1 ~]#ansible all -a "sleep 100" -f4
#cd /root/.ansible/tmp
2. 加载自己对应的模块文件,如:command
3. 通过ansible将模块或命令生成对应的临时py文件,并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
4. 给文件+x执行
5. 执行并返回结果
6. 删除临时py文件,退出

    执行返回结果

  • 绿色:执行成功并且不需要做改变的操作
  • 黄色:执行成功并且对目标主机做变更
  • 红色:执行失败

  2.6.2 ansible-doc

  2.6.3 ansible-console

  2.6.4 playbook

此工具用于执行编写好的 playbook 任务
范例
ansible-playbook hello.yml
cat hello.yml
---
#hello world yml file
- hosts: websrvs
 remote_user: root
 gather_facts: no
  
 tasks:
    - name: hello world
      command: /usr/bin/wall hello world 

  2.7 模块

  2.7.1 Command模块

    功能:在远程主机执行命令,此为默认模块,可忽略 -m 选项

    注意:此命令不支持 $VARNAME < > | ; & 等,可能用shell模块实现,此模块不具有幂等性  

  2.7.2 shell模块

    功能:和command相似,用shell执行命令,支持各种符号,比如:*,$, >

    注意:此模块不具有幂等性

  2.7.3 scripts

  功能:在远程主机上运行ansible服务器上的脚本(无需执行权限)

  注意:此模块不具有幂等性

  2.7.4 copy模块

  功能:从ansible服务器主控端复制文件到远程主机

  注意: src=file 如果是没指明路径,则为当前目录或当前目录下的files目录下的file文件

  2.7.5 Get_url模块

    功能: 用于将文件从http、https或ftp下载到被管理机节点上

   2.7.6 Fetch

    功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录

[root@localhost data]#ansible web -m fetch -a 'src=/etc/passwd dest=/mnt'
[root@node1 ~]#ansible web -m fetch -a 'src=/var/log/messages dest=/mnt'
[root@node1 mnt]#tree
.
├── 192.168.91.101
│   └── var
│       └── log
│           └── messages
└── 192.168.91.102
    └── var
        └── log
            └── messages

6 directories, 2 files

  2.7.7 File模块

     功能:设置文件属性,创建软链接等

path指定文件路径
state文件状态 有:新建(touch) 删除(absent) 文件夹(directory)  连接文件(link)等
src源文件
mode权限
owner属主
group属组
recurse递归

   2.7.8 stat模块

    功能:检查文件或文件系统的状态

    注意:对于Windows目标,请改用win_stat模块

    选项:

path:文件/对象的完整路径(必须)

    常用的返回值判断:

exists: 判断是否存在
isuid: 调用用户的ID与所有者ID是否匹配

  2.7.9 unarchive 模块

    功能:解包解压缩

    实现有两种用法:

  1. 将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes,此为默认值,可省略
  2. 将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no

    常见参数:

copy:默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,如果设置为copy=no,会在远程主机上寻找src源文件


remote_src:和copy功能一样且互斥,yes表示在远程主机,不在ansible主机,no表示文件在ansible主机上


src:源路径,可以是ansible主机上的路径,也可以是远程主机(被管理端或者第三方主机)上的路径,如果是远程主机上的路径,则需要设置copy=no


dest:远程主机上的目标路径


mode:设置解压缩后的文件权限

ansible web -m unarchive -a 'src=/data/ky.tar.bz2 dest=/mnt'

ansible websrvs -m unarchive -a 'src=https://nginx.org/download/nginx-1.18.0.tar.gz dest=/usr/local/src/ copy=no'


# copy=no  代表压缩文件不是去本机上查找 去远端服务器查找

  2.7.10 archive模块

    功能:打包压缩保存再被管理节点

ansible web -m archive -a 'path=/var/log/ dest=/data/log.tar.bz2 format=bz2 owner=wang mode=0600'

  2.7.11 hostname模块

  2.7.12 cron模块

  功能:计划任务

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

  关键字:

name  会生成一行注释
job   执行的命令

  2.7.13 yum和apt模块

    功能:yum 管理软件包,只支持RHEL,CentOS,fedora,不支持Ubuntu其它版本apt 模块管理 Debian 相关版本的软件包

    关键字:

name参数:必须参数,用于指定需要管理的软件包


state参数:用于指定软件包的状态 ,默认值为。present,表示确保软件包已经安装,除了。present,其他可用值有 installed、latest、absent、removed,其中 installed 与present 等效,latest 表示安装 yum 中最新的版本,absent 和removed 等效,表示删除对应的软件包。
disable_gpg_check参数:用于禁用对 rpm 包的公钥 gpg 验证。默认值为 no,表示不禁用验证,设置为 yes 表示禁用验证,即不验证包,直接安装。在对应的 yum 源没有开启 gpg 验证的情况下,需要将此参数的值设置为 yes,否则会报错而无法进行安装。


enablerepo参数:用于指定安装软件包时临时启用的 yum 源。假如你想要从A源中安装软件,但是你不确定A源是否启用了,你可以在安装软件包时将此参数的值设置为 yes,即使A源的设置是未启用,也可以在安装软件包时临时启用A源。


disablerepo参数:用于指定安装软件包时临时禁用的 yum 源。某些场景下需要此参数,比如,当多个 yum 源中同时存在要安装的软件包时,你可以使用此参数临时禁用某个源,这样设置后,在安装软件包时则不会从对应的源中选择安装包。enablerepo 参数和 disablerepo 参数可以同时使用。

name所安装的包的名称
statepresent——安装,lastest——安装最新的,absent——卸载软件
update_cache强制更新yum缓存
conf_file指定远程yum安装时所以来的配置文件(安装本地已有的包)
disable_gpg_check是否禁止GPG checking,只用于presentor latest
disablerepo临时禁止使用yum库,只用于安装或更新时
enablerepo临时使用的yum库。只用于安装或更新时

 

   2.7.14 yum_repository模块

    功能:建立yum仓库模块

    关键字:

name参数必须参数,用于指定要操作的唯一的仓库ID,也就是”.repo”配置文件中每个仓库对应的”中括号”内的仓库ID。
baseurl参数baseurl参数:此参数用于设置 yum 仓库的 baseurl。
description参数此参数用于设置仓库的注释信息,也就是”.repo”配置文件中每个仓库对应的”name字段”对应的内容。
file参数此参数用于设置仓库的配置文件名称,即设置”.repo”配置文件的文件名前缀,在不使用此参数的情况下,默认以 name 参数的仓库ID作为”.repo”配置文件的文件名前缀,同一个”.repo” 配置文件中 可以存在多个 yum 源。
enabled参数此参数用于设置是否激活对应的 yum 源,此参数默认值为 yes,表示启用对应的 yum 源,设置为 no 表示不启用对应的 yum 源。
gpgcheck参数此参数用于设置是否开启 rpm 包验证功能,默认值为 no,表示不启用包验证,设置为 yes 表示开启包验证功能。
gpgcakey参数当 gpgcheck 参数设置为 yes 时,需要使用此参数指定验证包所需的公钥。
state参数默认值为 present,当值设置为 absent 时,表示删除对应的 yum 源。

  2.7.15 service模块

    功能:管理服务

    关键字:

name参数此参数用于指定需要操作的服务名称,比如:nginx
state参数  此参数用于指定服务的状态,比如,我们想要启动远程主机中的 nginx,则可以将 state 的值设置为 started;如果想要停止远程主机中的服务,则可以将 state 的值设置为 stopped。此参数的可用值有startedstoppedrestartedreloaded
enabled参数此参数用于指定是否将服务设置为开机 启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动

 

  2.7.16 mount挂载和卸载

    功能: 挂载和卸载文件系统

#临时挂载
mount websrvs -m mount -a 'src="UUID=b3e48f45-f933-4c8e-a700-22a159ec9077" path=/home fstype=xfs opts=noatime state=present'
#临时取消挂载
mount websrvs -m mount -a 'path=/home fstype=xfs opts=noatime state=unmounted'
#永久挂载
ansible websrvs -m mount -a 'src=10.0.0.8:/data/wordpress path=/var/www/html/wp-content/uploads opts="_netdev" state=mounted'
#永久卸载
ansible websrvs -m mount -a 'src=10.0.0.8:/data/wordpress path=/var/www/html/wp-content/uploads state=absent'

  2.7.17 User模块

    功能:管理用户

comment用户的描述信息
createhome是否创建家目录
force在使用state=absent时, 行为与userdel –force一致.
group指定基本组
groups指定附加组,如果指定为(groups=)表示删除所有组
home指定用户家目录
move_home如果设置为home=时, 试图将用户主目录移动到指定的目录
name指定用户名
non_unique该选项允许改变非唯一的用户ID值
password指定用户密码,使用 SHA512 hash
remove在使用state=absent时, 行为是与userdel –remove一致
shell指定默认shell
state设置帐号状态,不指定为创建,指定值为absent表示删除
system当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
uid指定用户的uid
update_ password
always如果password参数设置的值与用户当前的加密过的密码字符串不一致,则直接更新用户的密码,默认值即为always
on_create如果password参数设置的值与用户当前的加密过的密码字符串不一致,则不会更新用户的密码字符串,保持之前的密码设定

   2.7.18 group模块

    功能:管理组

  2.7.19 reboot模块

  2.7.20 lineinfile模块

    ansible在使用sed进行替换时,经常会遇到需要转义的问题,而且ansible在遇到特殊符号进行替换时,存在问题,无法正常进行替换 。其实在ansible自身提供了两个模块:lineinfile模块和replace模块,可以方便的进行替换一般在ansible当中去修改某个文件的单行进行替换的时候需要使用lineinfile模块

    regexp参数 :使用正则表达式匹配对应的行,当替换文本时,如果有多行文本都能被匹配,则只有最后面被匹配到的那行文本才会被替换,当删除文本时,如果有多行文本都能被匹配,这么这些行都会被删除。

    如果想进行多行匹配进行替换需要使用replace模块

    功能:相当于sed,可以修改文件内容

    关键字:

path指定要操作的文件
regexp使用正则表达式匹配对应的行
line修改为新的内容
insertafter将文本插入到“指定的行”之后
insertbefore将文本插入到“指定的行”之前
state删除对应的文本时,需要state=absent
backrefs

1.支持向后引用

2.当未匹配到内容则不操作文件

backup是否在修改文件之前对文件进行备份
create当要操作的文件并不存在时,是否创建对应的文件

ansible web -m lineinfile -a "path=/etc/httpd/conf/httpd.conf regexp='^Listen' line='Listen 80'"

ansible all -m   lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled'"

ansible all -m lineinfile  -a 'dest=/etc/fstab state=absent regexp="^#"'

  2.7.21 replace

    该模块有点类似于sed命令,主要也是基于正则进行匹配和替换

  2.7.22 setup模块

    功能: setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用,但是如果主机较多,会影响执行速度

    可以使用 gather_facts:

no禁止
Ansible收集
facts信息

ansible all -m setup

ansible all -m setup -a "filter=ansible_nodename" 

ansible all -m setup -a "filter=ansible_hostname" 

ansible all -m setup -a "filter=ansible_domain" 

ansible all -m setup -a "filter=ansible_memtotal_mb" 

ansible all -m setup -a "filter=ansible_memory_mb"  

 

ansible all -m setup -a "filter=ansible_memfree_mb" 

 

ansible all -m setup -a "filter=ansible_os_family" 

ansible all -m setup -a "filter=ansible_distribution_major_version" 

ansible all -m setup -a "filter=ansible_distribution_version" 

ansible all -m setup -a "filter=ansible_processor_vcpus" 

ansible all -m setup -a "filter=ansible_all_ipv4_addresses" 

ansible all -m setup -a "filter=ansible_architecture" 

ansible all -m setup -a "filter=ansible_uptime_seconds" 

ansible all -m setup -a "filter=ansible_processor*" 

ansible all -m setup -a 'filter=ansible_env' 

  • 23
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值