Loading

Hello Ansible

Hello Ansible

1 环境初始化

根据参会人数初始化环境,分配IP , 分别确认连接。 One master & One node --失败

2 Ansible 基础知识讲解

2.1 ansible 特性

  • 基于模块运行,有丰富的内置模块支持
  • Parmiko (python 对ssh的实现), PyYAML, Jinja2(模板语言) 三个关键模块
  • 基于Python开发,方便二次开发
  • 基于SSH交互,被管机器不用安装agent
  • 无Server, 在任何安装ansible的机器上执行命令即可
  • 脚本用YAML编写,易读和易维护
  • 幂等性: 一个任务执行一遍和N遍效果一样,不因重复执行带来意外情况

2.2 演示 ansible 安装

yum install ansible
ansible --version

2.3 ansible 架构及工作原理


Ansible 架构

  • ansible (ad hoc) 单条命令

  • ansible-playbook playbook01.yml (playbook) 有很多单条命令组成的脚本

  • ansible-playbook roles.yml (roles)是有复杂任务调度与安排的playbook 的集合


Ansible 组成

  • 连接插件connection plugins:负责和被监控端实现通信;
  • host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
  • 各种模块核心模块、command模块、自定义模块;
  • 借助于插件完成记录日志邮件等功能;
  • playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务

Ansible 常见产品工作原理

使用各产品详细介绍: 主流Ansible Web UI的部署与使用

2.4 ansible相关目录

  • /etc/ansible/ansible.cfg 主配置文件,配置 ansible 工作特性
  • /etc/ansible/hosts 主机清单
  • /etc/ansible/roles/ 存放角色的目录

ll /etc/ansible

番外: 讲解 copy 模块需要用到
-rw-r--r-- 什么意思?
drwxr-xr-x , 什么意思?

U-G-O

2.5 ansible 主配置文件介绍

[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 #主机列表配置文件

remote_port = 22

host_key_checking = False #检查对应服务器的host_key, 建议取消注释

log_path = /var/log/ansible.log #日志文件,建议启用

module_name = command #默认模块,可以修改为shell模块

2.6 ansible 命令执行

2.6.1 ssh 简介

  • 查询openssl软件
    rpm -qa openssh openssl

  • 查询sshd进程
    ps -ef | grep ssh

  • 查看ssh端口

    netstat -lntup | grep ssh
    ss | grep ssh (效果同上,同下,好用)
    netstat -a | grep ssh (记住这个)
    netstat -lnt | grep 22 ==> 查看22端口有没有开/ssh服务有没有开启
    技巧: netstat -lnt | grep ssh | wc -l -->只要大于2个就是ssh服务就是好的

  • 查看ssh的秘钥目录
    ll /root/.ssh/known_hosts # 当前用户家目录的.ssh目录下

  • ssh的配置文件
    cat /etc/ssh/sshd_config

  • ssh服务的关闭
    service sshd stop

  • ssh服务的开启:
    service sshd start

  • ssh服务的重启
    service sshd reload [停止进程后重启]

  • ssh远程登录
    ssh 192.168.1.100 # 默认利用当前宿主用户的用户名登录

  • sftp客户端连接

    sftp -oPort=22 root@192.168.25.137
    put /etc/hosts /tmp
    get /etc/hosts /home/omd

2.6.2 ssh 免密设置

  • 公钥 id_dsp.pub 和私钥 id_dsa 所在位置

    • 普通用户omd: /home/omd/.ssh
    • root 用户: /root/.ssh/
  • 根据DSA 算法生成私钥和公钥 [默认建立在当前用户的 home 目录下]
    ssh-keygen -t dsa

  • 拷贝公钥给目标服务器
    ssh-copy-id -i id_dsa.pub omd@192.168.1.1

-- 查看目标服务器生成的文件
ll /home/omd/.ssh/authorized_keys

2.6.3 ansible命令详解

ansible <host-pattern> [-f forks] [-m module_name] [-a args]

-a MODULE_ARGS   #模块的参数,如果执行默认COMMAND的模块,即是命令参数,如: “date”,“pwd”等等
-k,--ask-pass #ask for SSH password。登录密码,提示输入SSH密码而不是假设基于密钥的验证
--ask-su-pass #ask for su password。su切换密码
-K,--ask-sudo-pass #ask for sudo password。提示密码使用sudo,sudo表示提权操作
--ask-vault-pass #ask for vault password。假设我们设定了加密的密码,则用该选项进行访问
-B SECONDS #后台运行超时时间
-C #模拟运行环境并进行预运行,可以进行查错测试
-c CONNECTION #连接类型使用
-f FORKS #并行任务数,默认为5
-i INVENTORY #指定主机清单的路径,默认为/etc/ansible/hosts
--list-hosts #查看有哪些主机组
-m MODULE_NAME #执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数
-o #压缩输出,尝试将所有结果在一行输出,一般针对收集工具使用
-S #用 su 命令
-R SU_USER #指定 su 的用户,默认为 root 用户
-s #用 sudo 命令
-U SUDO_USER #指定 sudo 到哪个用户,默认为 root 用户
-T TIMEOUT #指定 ssh 默认超时时间,默认为10s,也可在配置文件中修改
-u REMOTE_USER #远程用户,默认为 root 用户
-v #查看详细信息,同时支持-vvv,-vvvv可查看更详细信息

2.6.4 执行过程

  • ansible 单条命令 (也叫 ad hoc 的执行方式)
    • 加载自己的配置文件 默认 /etc/ansible/ansible.cfg
    • 加载自己对应的模块文件,如: command
    • 通过 ansible 将模块或命令生成对应的临时py文件, 并将该文件传输 $HOME/.ansible/tmp/ansible-tmp-数字/xxx.py 文件
    • 给文件 +x 执行
    • 执行并返回结果
    • 删除临时py文件,退出

命令执行过程流程图

2.6.5 命令执行结果

命令执行结果颜色意义:

  • 绿色: 执行成功,未修改目标主机
  • 黄色: 执行成功,修改了目标主机
  • 红色: 执行失败

2.7 ansible 主机清单匹配模式

手动编辑 /etc/ansible/hosts里面的内容
vim /etc/ansible/hosts

ansible all --list-hosts

ansible 的 主机清单匹配模式

  • All : 表示所有Inventory 主机

    ansible all -m ping

    • : 通配符

    ansible "*" -m ping
    ansible 192.168.1.* -m ping
    ansible "*srvs" -m ping

  • 逻辑或

    ansible "websrvs:appsrvs" -m ping
    ansbile "192.168.1.10:192.165.1.20" -m ping

  • 逻辑与

    在websrvs组 并且在 dbsrvs 组中的主机
    ansible "websrvs:&dbsrvs" -m ping

  • 逻辑非

  • 正则表达式
    ansible "~(web | db)srvs" -m ping
    ansible "~(web | db).*\.magedu\.com" -m ping

  • ansible-galaxy

    下载优秀的roles模板 ansible-galaxy
    ansible-galaxy list

2.8 ansible 常用工具

2.8.1 ansible-doc

ansible-doc --help

ansible-doc -l | wc -l

2.8.2 ansible-galaxy

下载优秀的roles模板 ansible-galaxy
ansible-galaxy list
ansible-galaxy collection install community.mysql

2.8.3 ansible-pull

此工具会推送 ansible的命令至远程,效率很大提升,有一定难度

2.8.4 ansible-playbook

此工具用于执行编写好的playbook 任务
范例如下: 特别注意缩进

ansible-plabook hello.yml
cat hello.yml
---

hello world yml file

- hosts: websrvs

remote_user: root

tasks: 

  \- name: hello world

​ command: /user/bin/wall hello world

2.8.6 ansible-vault

此工具可用于加密解密 yml 文件

ansilbe-vault [create| decrypt| encrypt| rekey| view]

ansible-vault encrypt hello.yml # 加密

ansible-vault decrypt hello.yml # 解密

ansible-vault view hello.yml # 查看

ansible-vault edit hello.yml # 编辑加密文件

ansible-vault rekey hello.yml # 修改口令

ansible-vault create hello.yml #创建新文件

3 ansible 常用模块 (Module)

3.1 主机连通性测试

ansible web -m ping

目标服务器密码非

非sudoers 用户

3.2 command 模块

ansible web -m command -a 'ss -ntl'

不支持特殊符号, "<",">","|",";","&" 工作(需要使用(shell)模块实现这些功能

常用参数

chdir       # 在执行命令之前,先切换到该目录
executable # 切换shell来执行命令,需要使用命令的绝对路径
free_form   # 要执行的Linux指令,一般使用Ansible的-a参数代替。
creates   # 一个文件名,当这个文件存在,则该命令不执行,可以
用来做判断
removes # 一个文件名,这个文件不存在,则该命令不执行

ansible web -m command -a 'chdir=/data/ ls'

ansible web -m command -a 'creates=/data/aaa.jpg ls' #如果/data/aaa.jpg存在,则不执行“ls”命令

ansible web -m command -a 'removes=/data/aaa.jpg cat /data/a' #如果/data/aaa.jpg存在,则执行“cat /data/a”命令

3.3 shell 模块

shell模块可以在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等。

ansible web -m shell -a 'cat /etc/passwd |grep "keer"'

3.4 copy 模块

这个模块用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等

其相关选项如下:

src    #被复制到远程主机的本地文件。可以是绝对路径,也可以是相对路径。如果路径是一个目录,则会递归复制,用法类似于"rsync"
content   #用于替换"src",可以直接指定文件的值
dest    #必选项,将源文件复制到的远程主机的绝对路径
backup   #当文件内容发生改变后,在覆盖之前把源文件备份,备份文件包含时间信息
directory_mode    #递归设定目录的权限,默认为系统默认权限
force    #当目标主机包含该文件,但内容不同时,设为"yes",表示强制覆盖;设为"no",表示目标主机的目标位置不存在该文件才复制。默认为"yes"
others    #所有的 file 模块中的选项可以在这里使用

  • 复制文件
    ansible web -m copy -a 'src=~/hello dest=/data/hello'

  • 给定内容生成文件,并制定权限
    ansible web -m copy -a 'content="I am keer\n" dest=/data/name mode=666'

  • 关于覆盖
    ansible web -m copy -a 'content="I am keerya\n" backup=yes dest=/data/name mode=666'

3.5 file 模块

该模块主要用于设置文件的属性,比如创建文件、创建链接文件、删除文件等
下面是一些常见的命令:

force  #需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group  #定义文件/目录的属组。后面可以加上mode:定义文件/目录的权限
owner  #定义文件/目录的属主。后面必须跟上path:定义文件/目录的路径
recurse  #递归设置文件的属性,只对目录有效,后面跟上src:被链接的源文件路径,只应用于state=link的情况
dest  #被链接到的路径,只应用于state=link的情况
state  #状态,有以下选项:

directory:如果目录不存在,就创建目录
file:即使文件不存在,也不会被创建
link:创建软链接
hard:创建硬链接
touch:如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent:删除目录、文件或者取消链接文件

  • 创建目录
    ansible web -m file -a 'path=/data/app state=directory'

  • 创建链接文件
    ansible web -m file -a 'path=/data/bbb.jpg src=aaa.jpg state=link''

  • 删除文件
    ansible web -m file -a 'path=/data/a state=absent''

3.6 fetch 模块

该模块用于从远程某主机获取(复制)文件到本地
有两个选项:

dest:用来存放文件的目录
src:在远程拉取的文件,并且必须是一个file,不能是目录

我们可以在本机上查看一下文件是否复制成功。要注意,文件保存的路径是我们设置的接收目录下的被管制主机ip目录下:
ansible web -m fetch -a 'src=/data/hello dest=/data'

3.7 archive 模块

3.8 unarchive 模块

3.9 corn 模块

3.10 yum 模块

3.11 service 模块

3.12 user 模块

3.13 group 模块

3.14 setup 模块

3.15 service 模块

3.16 script 模块

4 ansible playbook

5 ansible roles

6 ansible 实现部署多个rpm 包到node节点

posted @ 2021-02-28 23:34  Sirius-Wang  阅读(65)  评论(0编辑  收藏  举报