ansible自动运维

一、Ansible 功能

  • 批量执行远程命令,可以对远程的多台主机同时进行命令的执行
  • 批量安装和配置软件服务,可以对远程的多台主机进行自动化的方式配置和管理各种服务
  • 编排高级的企业级复杂的IT架构任务, Ansible的Playbook和role可以轻松实现大型的IT复杂架构
  • 提供自动化运维工具的开发API, 有很多运维工具,如jumpserver(堡垒机)就是基于 ansible 实现自动化管理功能

二、Ansible 特性

  • 模块化:调用特定的模块完成特定任务,支持自定义模块,可使用任何编程语言写模块(账号,软件等)
  • Paramiko(python对ssh的实现),PyYAML,Jinja2(模板语言)三个关键模块
  • 基于Python语言实现
  • 部署简单,基于python和SSH(默认已安装),agentless,无需代理不依赖PKI(无需ssl)
  • 安全,基于OpenSSH
  • 幂等性:一个任务执行1遍和执行n遍效果一样,不因重复执行带来意外情况,此特性非绝对
  • 支持playbook编排任务,YAML格式,编排任务,支持丰富的数据结构 剧本演员要按照 系统按照你规定的方式去执行命令
  • 较强大的多层解决方案 role

三、Ansible 安装和入门

########yum源安装###############
vim CentOS-Base.repo 
#加入 epel源

[epel]
name=gn
baseurl=https://mirrors.aliyun.com/epel/$releasever/x86_64
        https://mirrors.cloud.tencent.com/epel/$releasever/x86_64
        https://mirrors.huaweicloud.com/epel/$releasever/x86_64
        https://mirrors.tuna.tsinghua.edu.cn/epel/$releasever/x86_64
gpgcheck=0

yum info  ansible
yum install ansible -y

四、ansible相关文件

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

  • /etc/ansible/hosts 主机清单

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

1.hosts 主机清单文件

ansible的主要功用在于批量主机操作,为了便捷地使用其中的部分主机,可以在inventory 主机清单文件中将其分组组织
默认的inventory file 位置在:

/etc/ansible/hosts

例子:

[local]
192.168.91.100 ansible_connection=local

[web]
192.168.91.101
192.168.91.102

[accp]
192.168.91.103
192.168.91.105


[webserver]
192.168.91.[101:103]
192.168.91.105
#192.168.91.[101:103]:这是一个IP范围表达式,
#表示包含 192.168.91.101、192.168.91.102 和 192.168.91.103 这三个主机。
#192.168.91.105:这是另一个单独的主机IP地址。

[web:children]
web
accp
#web 和 accp:这两个组被包含在 web:children 组中。
#这意味着 web:children 组的所有主机就是 web 组和 accp 组的所有主机的总和。

ansible 192.168.91.105 -m ping
用这个命令可以测试和远程管理的机子是否能通

注:需要设置ssh免密登录

五、ansible命令

执行临时任务一次性任务

1.用法

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

2.选项

--version 					#显示版本
-m module   				#指定模块,默认为command
-v 							#详细过程 -vv -vvv更详细
--list-hosts 				#显示主机列表,可简写 --list
-C, --check   				#检查,并不执行
-T, --timeout=TIMEOUT 		#执行命令的超时时间,默认10s
-k, --ask-pass     			#提示输入ssh连接密码,默认Key验证 
-u, --user=REMOTE_USER 		#执行远程执行的用户,默认root
-b, --become    			#代替旧版的sudo 切换
--become-user=USERNAME  	#指定sudo的runas用户,默认为root  vim /etc/sudoers 用户权限
-K, --ask-become-pass  		#提示输入sudo时的口令
-f FORKS, --forks FORKS 	#指定并发同时执行ansible任务的主机数
-a                          #指定执行的命令

例:以root的用户连接用户,并利用root用户执行whoami命令

ansible cc -m shell -a 'whoami' -u root -b -k --become-user=root

六、ansible模块

ansible常用的模块也就2,30个而已,针对特定业务只用10几个模块。

1.Command 模块

功能:在远程主机执行命令,此为默认模块,可忽略 -m 选项
注意:此命令不支持 $VARNAME < > | ; & 等,可能用shell模块实现
注意:此模块不具有幂等性

2.shell模块

功能:和command相似,用shell执行命令,支持各种符号,比如:*,$, > ,
比起command模块shell模块支持复杂的shell命令、管道操作、重定向等,更灵活。
可以使用shell特有的功能和语法。

例子:

ansible cc -m shell -a "echo hello > /opt/hello.txt"
#使用shell模块,执行echo命令在远程管理的主机上新建一个hello.txt文件

3.Script模块

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

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

例:

ansible web -m script -a '/root/test.sh'

4.copy模块

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

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

关键字:

src   	代表源文件路径
dest  	代表文件落地路径
owner 	属主
group 	属组
mode  	代表权限
backup  如果复制时有同名文件会先备份再复制

例子:

ansible web -m copy -a "src=/etc dest=/backup"
ansible web -m copy -a "src=/etc/ dest=/backup"

#etc  	不加  	/   	连etc  一起复制
#etc   	加      /	   	只复制etc下的文件

5.Get_url模块

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

例子:

ansible web -m get_url -a "url=https://nginx.org/download/nginx-1.18.0.tar.gz dest=/opt"

6.Fetch模块

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

例:

ansible web -m fetch -a 'src=/etc/passwd dest=/mnt'

7.File模块

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

关键字

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

例子:

ansible web -m file -a 'path=/mnt/web.txt state=touch owner=zhangsan group=zhangsan mode=755'
#创建空文件
ansible web -m file -a 'path=/mnt/web state=directory'
#新建目录
ansible web -m file -a 'src=/mnt/web path=/opt/web-link state=link'
#新建软连接 path|dest|name   这三个选项都可以使用
ansible web -m file -a 'path=/opt/web-link state=absent'
#删除文件

8.stat模块

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

选项

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

例子:

ansible web -m stat -a 'path=/mnt/test.txt'
#查看是否存在


192.168.91.102 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/opt/mysql", 
    "secontext": "unconfined_u:object_r:usr_t:s0", 
    "size": 18, 
    "state": "directory", 
    "uid": 0
}

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  代表压缩文件不是去本机上查找 

10.Yum模块

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

关键字

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

例子:

ansible websrvs -m yum -a 'name=httpd state=present'  #安装
ansible websrvs -m yum -a 'name=nginx state=present enablerepo=epel'  #启用epel源
进行安装
ansible websrvs -m yum -a 'name=* state=lastest exclude=kernel*,foo*' #升级除
kernel和foo开头以外的所有包
ansible websrvs -m yum -a 'name=httpd state=absent'   #删除

playbook文件中格式

- name: 安装httpd包
  yum:
    name: httpd
    state: present

- name: 删除nginx包
  yum:
    name: nginx
    state: absent

- name: 更新所有系统包
  yum:
    name: '*'
    state: latest

11.Yum_repository

用途:用于管理YUM软件库的配置。
功能:可以添加、删除和配置YUM软件库。它主要用于设置和管理软件源仓库。

例子:

- name: 添加EPEL库
  yum_repository:
    name: epel
    description: Extra Packages for Enterprise Linux
    baseurl: https://download.fedoraproject.org/pub/epel/$releasever/Everything/$basearch
    gpgcheck: yes
    enabled: yes

- name: 删除自定义库
  yum_repository:
    name: custom-repo
    state: absent

12.Service模块

功能:管理服务

关键字

name参数:
此参数用于指定需要操作的服务名称,比如 nginx。

state参数:
此参数用于指定服务的状态,比如,我们想要启动远程主机中的 nginx,则可以将 state 的值设置为 started;
如果想要停止远程主机中的服务,则可以将 state 的值设置为 stopped。此参数的可用值有 started、stopped、restarted、reloaded。

enabled参数:
此参数用于指定是否将服务设置为开机 启动项,设置为 yes 表示将对应服务设置为开机启动,设置为 no 表示不会开机启动。

例子:

ansible all -m service -a 'name=httpd state=started enabled=yes'
ansible all -m service -a 'name=httpd state=stopped'
ansible all -m service -a 'name=httpd state=reloaded'
ansible all -m shell -a "sed -i 's/^Listen 80/Listen 8080/' 
/etc/httpd/conf/httpd.conf"
ansible all -m service -a 'name=httpd state=restarted'

13.User模块

功能:管理用户

例子:

#创建用户
ansible all -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root‘

14.Group模块

功能:管理组

例子:

#创建组
ansible websrvs -m group  -a 'name=nginx gid=88 system=yes'
#删除组
ansible websrvs -m group  -a 'name=nginx state=absent'

15.reboot模块

功能:重启

ansible websrvs -m reboot

16.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="^#"'

17.replace模块

类似于sed命令,主要也是基于正则进行匹配和替换,建议使用

例子:

ansible all -m replace -a "path=/etc/fstab regexp='^(UUID.*)' replace='#\1'"  

ansible all -m replace -a "path=/etc/fstab regexp='^#(UUID.*)' replace='\1'"

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

18.setup模块

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

在每次运行 Playbook 时,Ansible 会自动运行 setup 模块,可以在 Playbook 的任务中直接使用这些变量,而不需要手动调用 setup 模块。

可以使用 gather_facts: no 来禁止 Ansible 收集 facts 信息

常用的 Ansible 变量列表

主机和操作系统信息
ansible_hostname:主机名
ansible_nodename:节点名称(主机名)
ansible_domain:域名
ansible_fqdn:完全限定域名
ansible_os_family:操作系统家族(如 Debian, RedHat)
ansible_distribution:操作系统发行版名称(如 Ubuntu, CentOS)
ansible_distribution_version:操作系统发行版版本
ansible_distribution_major_version:操作系统发行版主版本号
ansible_kernel:内核版本
ansible_architecture:系统架构(如 x86_64)

网络信息
ansible_all_ipv4_addresses:所有 IPv4 地址的列表
ansible_all_ipv6_addresses:所有 IPv6 地址的列表
ansible_default_ipv4:默认 IPv4 路由信息,包括 address(IP 地址)和 gateway(网关)
ansible_default_ipv6:默认 IPv6 路由信息
ansible_interfaces:所有网络接口的列表
ansible_eth0:特定接口(eth0)的详细信息,包括 IP 地址、子网掩码等

硬件信息
ansible_memtotal_mb:总内存大小(MB)
ansible_memfree_mb:可用内存大小(MB)
ansible_processor:处理器信息列表
ansible_processor_vcpus:虚拟 CPU 数量
ansible_processor_cores:每个处理器的核心数
ansible_processor_count:物理处理器数量
ansible_processor_threads_per_core:每个核心的线程数

存储信息
ansible_mounts:挂载点信息,包括挂载点、文件系统类型、大小等
ansible_devices:设备信息,包括磁盘大小、分区信息等

时间和区域信息
ansible_date_time:包含详细日期和时间信息的字典,包括 date(日期)、time(时间)、iso8601(ISO 8601 格式的时间)、tz(时区)等

用户和环境信息
ansible_user_id:当前用户 ID
ansible_user_shell:当前用户的 Shell
ansible_env:当前用户的环境变量

七、Playbook

建议修改vim配置

vim   ~/.vimrc
set ai
set ts=2
检查yml文件语法
ansible-playbook --syntax-check 文件名

playbook特点

  • playbook 剧本是由一个或多个"play"组成的列表
  • play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作
  • Playbook 文件是采用YAML语言编写的

playbook核心组件

一个playbook 中由多个组件组成,其中所用到的常见组件类型如下:

  • Hosts 执行的远程主机列表
  • Tasks 任务集,由多个task的元素组成的列表实现,每个task是一个字典,一个完整的代码块功能需最少元素需包括 name 和 task,一个name只能包括一个task
  • Variables 内置变量或自定义变量在playbook中调用
  • Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
  • Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
  • tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断

host组件和remote_user组件

Hosts: playbook 中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务,须事先定义在主机清单中

remote_user: 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务

例子:
- hosts: websrvs 
- #选择websrvs组的主机
  remote_user: root
  #选择远程主机的root用户

task列表

play的主体部分是task list,task list中有一个或多个task,各个task 按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个task后,再开始第二个task

task两种格式:

action: module arguments	
#示例: action: shell wall hello

module: arguments	
#示例: shell: wall hello

playbook实例

1.发送广播

---
- hosts: web
  remote_user: root

  tasks:
    - name: ping
      ping:
    - name: wall
      shell: wall hello
---
# first yaml file
- hosts: web
  remote_user: root
  gather_facts: no	#不收集系统信息,提高执行效率

  tasks:
    - name: test network connection 
      ping:
    - name: excute command 
      command: wall "hello world!"

2.安装httpd,再启动服务

---
- hosts: cc
  remote_user: root

  tasks:
    - name: install httpd
      yum:
        name: httpd
        state: present
    - name: start httpd
      service:
        name: httpd
        state: started
        enabled: yes                       

3.安装nginx并且启动

---
- hosts: cc
  remote_user: root

  tasks:
  - name: add repository
    yum_repository:
      name: epel
      description: EPEL YUM repo
      baseurl: https://download.fedoraproject.org/pub/epel/$releasever/$basearch/
      gpgcheck: no

  - name: install nginx
    yum:
      name: nginx
      state: present

  - name: config file
    copy: src=/data/nginx.conf dest=/etc/nginx/nginx.conf

  - name: web page
    copy: src=/data/index.html dest=/usr/share/nginx/html/index.html

  - name: start nginx
    service:
      name: nginx
      state: started
      enabled: yes
  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值