Bootstrap

Ansible简单应用介绍

自动化管理工具,远程批量管理主机,基于ssh服务

1、部署安装ansible

包安装

自带版本
ubuntu2004:2.9.6
rocky8.5:5.4.0,实际上是2.12
centos7:2.9.27
#在centos或者rocky使用epel源下载失败时可参考
https://blog.csdn.net/cxyxt/article/details/127426611

1.1、相关文件

  • /etc/ansible/ansible.cfg :主配置文件,配置ansible工作特性,也可以在项目的目录中创建此文件,当前目录下如果也有ansible.cfg,则此文件优先生效,建议每个项目目录下,创建独有的ansible.cfg文件
  • /etc/ansible/hosts :主机清单,将需要管理的主机ip存放在其中,可改路径,可设置分类,分组,单一主机可添加为多个分组
  • /etc/ansible/roles/ :存放角色的目录

Ansible 的配置文件可以放在多个不同地方,优先级从高到低顺序如下

ANSIBLE_CONFIG #环境变量,目录下的文件必须存在才能生效
./ansible.cfg  #当前目录下的ansible.cfg,一般一个项目对应一个专用配置文件,推荐使用
~/.ansible.cfg #当前用户家目录下的.ansible.cfg
/etc/ansible/ansible.cfg  #系统默认配置文件
1.1.1、主配置文件/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                 #默认模块,可以修改为shell模块

[privilege_escalation]                 #普通用户提权配置
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False
1.1.2、主机清单/etc/ansible/hosts
##范例
[dbservers]
db1.wang.org
db2.wang.org
db3.wang.org
#或者
db[1:3].wang.org

#组嵌套
[webservers]
www[1:100].example.com
[dbservers]
db-[a:f].example.com
[appservers]
10.0.0.[1:100]
#定义testsrvs组中包括两个其它分组,实现组嵌套
[testsrvs:children] 
webservers
dbservers

##基于用户名和密码的ssh连接主机清单
[test]
10.0.0.8  ansible_connection=local   #指定本地连接,无需ssh配置
#每个主机分别指定用户和密码
#第一次连接会需要敲yes,因此需要更改配置文件host_key_checking = False或者更改ssh配置文件StrictHostKeyChecking no
10.0.0.7  ansible_connection=ssh  ansible_ssh_port=22  ansible_ssh_user=wang ansible_ssh_password=123456  
10.0.0.6  ansible_ssh_user=root  ansible_ssh_password=123456  

#对每个分组的所有主机统一定义用户和密码,执行ansible命令时显示别名,如web01
[websrvs]
web01 ansible_ssh_host=10.0.0.101
web02 ansible_ssh_host=10.0.0.102
[websrvs:vars]
ansible_ssh_password=magedu

some_host         ansible_ssh_port=2222     ansible_ssh_user=manager
aws_host          ansible_ssh_private_key_file=/home/example/.ssh/aws.pem
freebsd_host      ansible_python_interpreter=/usr/local/bin/python
ruby_module_host  ansible_ruby_interpreter=/usr/bin/ruby.1.9.3

连接测试

[root@rocky8 ~]#ansible 10.0.0.7 -m ping         #测试连接
[root@rocky8 ~]#ansible 10.0.0.7 -a "ls /root"   #测试执行命令

1.2、相关工具

常用命令

[root@ubuntu2004 ~]# ansible
ansible             ansible-connection  ansible-doc         ansible-inventory   ansible-pull        
ansible-config      ansible-console     ansible-galaxy      ansible-playbook    ansible-vault 
  • /usr/bin/ansible 主程序,临时命令执行工具
  • /usr/bin/ansible-doc 查看配置文档,模块功能查看工具,相当于man ,-l 列出全部模块
  • /usr/bin/ansible-playbook 定制自动化任务,编排剧本工具,相当于脚本
  • /usr/bin/ansible-pull 远程执行命令的工具
  • /usr/bin/ansible-vault 文件加密工具
  • /usr/bin/ansible-console 基于Console界面与用户交互的执行工具
  • /usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
#列出所有模块
ansible-doc -l  
#查看指定模块帮助用法
ansible-doc ping  
#查看指定模块帮助用法
ansible-doc -s  ping

ansible-console  #临时更改
#设置并发数: forks n 例如: forks 10
#切换组: cd 主机组 例如: cd web
#列出当前组主机列表: list
#列出所有的内置命令: ?或help
1.2.1、ansible

Ad-Hoc:一次性的执行,不会保存执行命令信息,只适合临时性或测试性的任务

相关选项

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

范例

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

使用普通用户连接远程主机执行代替另一个用户身份执行操作

#sudo授权
[root@centos8 ~]#grep wang /etc/sudoers
wang    ALL=(ALL) NOPASSWD: ALL
[root@centos8 ~]#echo 'wang    ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers

#以wang的身份连接,并指定连接wang且利用sudo执行whoami命令
[root@ansible ~]#ansible 10.0.0.8 -m shell -a 'whoami' -u wang -b
10.0.0.8 | CHANGED | rc=0 >>

2、playbook

类似于 shell 脚本

  • Playbook是对多个 AD-Hoc 的一种编排组合的实现方式
  • Playbook能控制任务执行的先后顺序
  • Playbook可以持久保存到文件中从而方便多次调用运行,而Ad-Hoc只能临时运行。
  • Playbook适合复杂的重复性的任务,而Ad-Hoc适合做快速简单的一次性任务

2.1、组成

  • 一个 playbook(剧本)文件是一个YAML语言编写的文本文件
  • 通常一个playbook只包括一个play,但可以有多个
  • 一个 play的主要包括两部分:主机和tasks任务,即实现在指定一组主机上执行一个tasks定义好的任务列表。
  • 一个tasks中可以有一个或多个task任务
  • 每一个Task本质上就是调用ansible的一个module
  • 在复杂场景中,一个playbook中也可以包括多个play,实现对多组不同的主机执行不同的任务

yaml语法简介

  • 在单一文件第一行,用连续三个连字号"-" 开始,还有选择性的连续三个点号( … )用来表示文件的结尾
  • 次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
  • 使用#号注释代码
  • 缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的
  • 缩进不支持tab,必须使用空格进行缩进
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • YAML文件内容是区别大小写的,key/value的值均需大小写敏感
  • 多个key/value可同行写也可换行写,同行使用,分隔
  • key后面冒号要加一个空格 比如: key: value
  • value可是个字符串,也可是另一个列表
  • YAML文件扩展名通常为yml或yaml

参考ubuntu的apt仓库

2.2、角色roles

目标主机和task任务分离,代码和业务数据分离

2.2.1、roles目录结构

把需要干的活分类、拆分,再决定由谁来做

playbook1.yml      #单独创建yml文件来调用下面的子文件夹,跟roles平级,决定的是在哪些主机上执行
playbook2.yml
#分类存放,将相对应的任务内容分别存放在不同的子文件夹中
roles/
  nginx/
    tasks/
    files/
    vars/       
    templates/
    handlers/
    default/    
    meta/       
  mysql/
    tasks/
    files/
    vars/       
    templates/
    handlers/
    default/    
    meta/
    
#创建初始化目录结构,仅会创建空目录结构,不太建议
[root@ansible roles]#ansible-galaxy role init test_role
- Role test_role was created successfully
[root@ansible roles]#tree test_role/
test_role/
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── templates
├── tests
│   ├── inventory
│   └── test.yml
└── vars
   └── main.yml
8 directories, 8 files

[root@rocky8 opt]#tree
.
├── ansible.cfg
├── hosts
├── index.html
├── nginx_role.yml
└── roles
    ├── mysql
    │   ├── handlers
    │   ├── tasks
    │   └── templates
    ├── nginx
    │   ├── handlers
    │   │   └── main.yml
    │   ├── tasks
    │   │   └── main.yml
    │   └── templates
    │       ├── nginx.conf.j2
    │       └── nginx.service.j2
    ├── php-fpm
    │   ├── files
    │   │   └── test.php
    │   ├── handlers
    │   │   └── main.yml
    │   ├── php-fpm_role.yml
    │   ├── tasks
    │   │   └── main.yml
    │   └── templates
    │       ├── php-fpm.conf.j2
    │       ├── php.ini.j2
    │       └── www.conf.j2
    └── wordpress
        ├── handlers
        ├── tasks
        └── templates

18 directories, 15 files
2.2.2、yaml文件的相互调用

include

利用include 或 include_tasks 可以在某个task 中调用其它的只有task 内容的yaml文件

[root@ansible ansible]#cat a.yml 
---
- hosts: websrvs
  
  tasks:
    - name: run a job
      command: wall run a job
    - name: excute b.yml
      include: b.yml    #调用另一个yaml文件
      #include_tasks: b.yml #另一种写法

[root@ansible ansible]#cat b.yml      #只写有任务动作
- name: run b job
  command: wall run b job

import_playbook

将多个yml文件合并成一个,即执行该合并文件时会调用执行里面的多个文件

[root@ansible ansible]#cat a1.yml 
---
- hosts: websrvs
  
  tasks:
    - name: run a1 job
      command: wall run a1 job
    - name: excute b.yml
      include: b.yml    #调用另一个yaml文件
      #include_tasks: b.yml #另一种写法

[root@ansible ansible]#cat b.yml      #只写有任务动作
- name: run b job
  command: wall run b job
  
[root@ansible ansible]#cat a2.yml 
---
- hosts: websrvs
  
  tasks:
    - name: run a2 job
      command: wall run a2 job
    - name: excute b.yml
      include: b.yml    #调用另一个yaml文件

[root@ansible ansible]#cat main.yml   #执行该文件会执行a1,a2和里面都调用的b文件
- import_playbook: a1.yml
- import_playbook: a2.yml

第十一周作业:

ansible playbook简单应用
在这里插入图片描述

;