深入浅出Ansiable

目录

Ansible的起源

Ansible的发展史

Ansible的功能

Ansible的特性

Ansible的架构

Ansible的注意事项

Ansible入门

Ansible的安装

Ansible配置文件

配置文件解析

inventory主机配置清单

Ansible相关工具

Ansible的常用模块

Command模块

shell模块

Script模块

Copy模块

Fetch模块

File模块

Yum和Apt模块

service模块

User模块

Group模块

Setup模块

Playbook

playbook介绍

三种常见的数据格式

playbook核心组件

Hosts组件

remote_user组件

task列表和action组件


Ansible的起源

Ansible的发展史

ansible的名称来源于科幻小说《安德的游戏》中跨越时空的即时通讯工具,可以在相距数光年的距离,远程实时控制前线舰队战斗。
于2012年3月9日发布0.0.1版,2015年10月17日,Red Hat宣布以1.5亿美元收购

Ansible的功能

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

Ansible的特性

基于Python语言实现
  
模块化:调用特定模块完成特定任务,支持自定义模块,可使用任意编程语言 编写模块
部署简单:基于python和ssh,agentless,无需代理不依赖PKI(无需ssl)
安全,基于OpenSSH
幂等性:一个任务执行一遍和执行n遍效果一样,不因重复执行带来意外情况, 此特性非绝对
支持playbook编排任务, YAML格式,编排任务,支持丰富的数据结构 较强大的多层解决方案role

Ansible的架构

组合INVENTORY、API、MODULES、PLUGINS,为ansible命令工具,其为核心执行工具
INVENTORY: Ansible管理主机的清单,一般默认路径为 /etc/ansible/hosts
MODULES: Ansible执行命令的功能模块,多数为内置核心模块,也可自定义
PLUGINS: 模块功能的补充,如连接类型插件,循环插件,变量插件,过滤插 件等
API: 供第三方程序调用的应用程序编程接口

Ansible的注意事项

执行ansible的主机一般称为管理端,主控端,中控,master或堡垒机 
主控端Python版本需要2.6及以上
被控端Python版本小于2.4,需要安装python-simplejson
被控端如开启SELinux,需要安装libselinux-python
windows不能作为主控端

Ansible入门

Ansible的安装

官方文档
https: docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#installing-ansible-on-specific-operating-systems
3.1.1下载
下载地址:https: releases.ansible.com/ansible/
pip下载: https: pypi.org/project/ansible/

包安装:要先安装epel源
yum install -y ansible
查看ansible版本
yum info ansible

pip安装
yum install -y python-pip
pip install --upgrade pip -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com # 可以忽略
pip install ansible --upgrade -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

确认安装
ansible --version

Ansible配置文件

/etc/ansible/ansible.cfg ansible主配置文件,配置ansible工作特性
/etc/ansible/hosts  主机清单文件,注意:不是/etc/hosts文件
/etc/ansible/roles 角色存放目录

配置文件解析

#host_key_checking = False 推荐取消注释,实现第一次连接自动信任目标主机

inventory主机配置清单

默认inventory_file为/etc/ansible/hosts
inventory_file 可以有多个,也可以通过Dynamic Inventory动态生成 
建议生产环境中,在每个项目的目录下创建独立的hosts文件

# Inventory参数说明
ansible_ssh_host # 将要连接的远程主机名,与想要设定的主机别名 不同时,可以通过此变量设置
ansible_ssh_port # 远程主机ssh端口,如果不是默认端口号,可以 通过此变量设置,如:ip:port(xxx.xxx.xxx.xxx:2222)
ansible_ssh_user
ansible_ssh_pass
行 ask-pass 参数或 ssh密钥形式) ansible_sudo_pass
sudo-pass 参数)
ansible_sudo_exe
ansible_connection
paramiko.
ansible_ssh_provate_key_file ansible_shell_type
为 csh 或 fish ansible_python_interpreter 个python环境,或路径不是/usr/bin/python情况
# 默认ssh用户名
# ssh密码(不推荐,此方法不安全,可以使用命令
# sudo密码(不推荐, 建议使用命令行 ask- # sudo命令路径(适用于1.8及以上版本)
# 与主机连接类型,如: local,ssh 或 # ssh使用的私钥,适用于多个密钥
# 目标系统shell类型,默认使用 sh ,可以设置 # 目标主机python路径,适用情况:系统中存在多

Ansible相关工具

/usr/bin/ansible  主程序,命令行执行工具
/usr/bin/ansible-doc  查看配置文档,模块功能查看工具,相当于man
/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具,相当于脚本
/usr/bin/ansible-vault  文件加密工具
/usr/bin/ansible-console 基于Console界面与用户交互的执行工具s

Ansible的常用模块

Command模块

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

shell模块

功能:和command类似 
支持各种符号,如 $VARNAME<>|;&等 
不具有幂等性
示例:
ansible websrvs -m shell -a 'echo $HOSTNAME'
ansible all -m shell -a 
注意事项:调用bash执行复杂命令,shell模块也可能会调用失败 
解决办法:将复杂命令写入脚本,copy至远程服务器,执行完成后,返回执行

Script模块

功能:再远程主机上运行ansible服务器上的脚本(无需执行权限) 
不具有幂等性
ansible websrvs -m script -a /tmp/test.sh

Copy模块

功能:从ansible服务器主控端复制文件到远程主机
注意:src=file 如果没有指明路径,则为当前目录或当前目录下的files目录下的 file文件
# 如果目标存在,默认为覆盖,可以指定为备份
$ ansible websrvs -m copy -a "src=/root/test1.sh dest=/tmp/test2.sh owner=admin mode=600 backup=yes"
# 指定内容,直接生成目标
$ ansible websrvs -m copy -a "content='test line1\ntest line2\n' dest=/tmp/test.txt"
# 复制/etc目录自身,注意/etc后面不带/
$ ansible websrvs -m copy -a "src=/etc dest=/backup"
# 复制/etc下文件,不包括/etc自身,注意/etc后面带/
$ ansible websrvs -m copy -a "src=/etc/ dest=/backup"

Fetch模块

功能:从远程主机提取文件至ansible主控端,与copy相反,暂不支持目录
$ ansible websrvs -m fetch -a "src=/root/test.sh dest=/data/scripts"
$ ansible websrvs -m fetch -a "src=/etc/redhat-release dest=/data/os"

File模块

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

# 创建空文件
$ ansible all -m file -a 'path=/data/test.txt state=touch' 
$ ansible all -m file -a 'path=/data/test.txt state=absent' 
$ ansible all -m file -a 'path=/root/test.sh owner=admin mode=755'
# 创建目录
$ ansible all -m file -a 'path=/data/mysql state=directory'
# 创建软链接
$ ansible all -m file -a 'src=/data/testfile dest=/data/testfile-link state=link'
# 递归修改目录属性,但不递归至子目录
$ ansible all -m file -a 'path=/data/mysql state=directory owner=mysql group=mysql'= chown
# 递归修改目录及子目录属性
$ ansible all -m file -a 'path=/data/mysql state=directory owner=mysql group=mysql recurse=yes' = chown -R

Yum和Apt模块

功能:yum管理软件包,只支持RHEL,CentOS,fedora,不支持Ubuntu其他版本;
apt模块管理Debian相关版本的软件包
# 安装软件包
$ ansible websrvs -m yum -a 'name=httpd state=present'
# 启用epel源安装软件包
$ ansible websrvs -m yum -a 'name=nginx state=present enablerepo=epel'
# 升级除kernel和foo开头外的所有包
$ ansible websrvs -m yum -a 'name=* state=lastest exclude=kernel*,foo*'
# 删除(卸载)
$ ansible websrvs -m yum -a 'name=httpd state=absent'
# 查看包
$ ansible websrvs -m yum -a 'list=tree'

service模块

功能:管理服务
# 启动服务,并设置开机启动
$ 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 service -a 'name=httpd state=restarted'

User模块

# 创建用户
$ ansible all -m user -a 'name=user1 comment="test user" uid=2000 home=/app/user1 group=root'
$ ansible all -m user -a 'name=nginx comment=nginx uid=1000
group=nginx groups="root,daemon" shell=/sbin/nologin system=yes
create_home=no home=/data/nginx non_unique=yes'
# 删除用户及其家目录
$ ansible all -m user -a 'name=nginx state=absent remove=yes'

Group模块

功能:管理用户组
# 创建组
$ ansible websrvs -m group -a 'name=nginx gid=1000 system=yes'
# 删除组
$ ansible websrvs -m group -a 'name=nginx state=absent'

Setup模块

功能:setup模块用来收集主机系统信息,这些facts信息可以直接以变量形式使用,但如果主机较多,会影响执行速度,可以使用gather_facts: no禁止ansible收集信息
$ 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"
# 获取所有IP地址
$ ansible all -m setup -a "filter=ansible_all_ipv4_addtrsses"
$ 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"

Playbook

playbook介绍

playbook剧本是由一个或多个“play”组成的列表 play的主要功能在于将预定义的一组主机,装扮成事先过ansible中的task定义好的角色

task是调用ansible的一个模块,将多个play组织再一个playbook中,即可以联合 起来,按事先编排好的机制执行预定义的动作

playbook文件采用YAML语言编写

三种常见的数据格式

XML:Extensible Markup Language,可扩展标记语言,可用于数据交换和配置 
JSON:JavaScript Object Notation,JavaScript对象标记法,主要用来数据交换或配置,不支持注释
YAML:YAML Ain't Markup Language,YAML不是一种标记语言,主要用来配置,大小写敏感,不支持tab

可以用工具相互转换,参考网站:
https: www.json2yaml.com/
https: www.bejson.com/json/json2yaml/

playbook核心组件

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

Hosts组件

playbook中的每个play的目的都是为了让特定主机以某个指定用户身份执行任务
hosts主要用于指定要执行的任务主机,须事先定义在主机清单中
示例:
- hosts: websrvs
- hosts: 192.168.0.21
- hosts: websrvs:appsrvs # 两个组的并集
- hosts: websrvs:&appsrvs # 两个组的交集
- hosts: websrvs:!appsrvs # 在websrvs组中,但不在appsrvs中

remote_user组件

可用于Host和Task中,也可以通过指定其通过sudo方式在远程主机上执行任
务,其可用于play全局或某个任务中 可以在sudo时使用sudo_user指定sudo时切换的用户,默认为root 
示例:
- hosts: websrvs
  remote_user: root
  tasks:
    - name: test connection
      ping:
      remote_user: admin
      sudo: yes
      sudo_user: yuan
      # become: yes
      # become_user: yuan

task列表和action组件

play主体部分是task list,task list有一个或多个task,每个task按次序逐个在hosts 中指定的所有主机上执行,即在所有主机上执行完一个task后,再执行下一个 task
task的目的是使用指定的参数执行模块,再模块参数中可以使用变量。模块执行 为幂等的,意味着多次执行是安全的,其结果一致
每个task都应该有其name,用于playbook执行结果输出,建议其内容能够清晰描 述任务执行步骤,如果没有提供name,则action的结果将用于输出
task两种格式:
 action: module arguments #示例: ac
示例1:

- hosts: websrvs
remote_user: root
gather_facts: no # 不收集系统信息,提高执行效率
  tasks:
    - name: test network connection
      ping:
    - name: excute command
      command: wall "hello world!"

Playbook命令

ansible-playbook <filename.yaml> [options] 常见选项:
--syntax-check -C, --check
作,dry run
--list-hosts
--list-tags
--list-tasks
--limit 主机列表
-i INVENTORY
语法检查,可缩写为--syntax,相当于bash -n 模拟执行,只检测可能会发生的变化,但不真正执行操
列出运行任务的主机 列出tag
列出task 只针对主机列表中的特定主机执行
 指定主机清单文件,通常一个项对应一个主机清单文件
--start-at-task START_AT_TASK 从指定的task开始执行任务,而不是从开
头开始,START_AT_TASK 为任务名称
-v, -vv, -vvv 显示具体执行过程,详细程度根据-v数量变化

相关推荐

  1. <span style='color:red;'>Ansible</span>

    Ansible

    2024-07-12 05:46:04      40 阅读
  2. <span style='color:red;'>Ansible</span>

    Ansible

    2024-07-12 05:46:04      52 阅读
  3. <span style='color:red;'>ansible</span>

    ansible

    2024-07-12 05:46:04      43 阅读
  4. <span style='color:red;'>ansible</span>

    ansible

    2024-07-12 05:46:04      53 阅读
  5. <span style='color:red;'>ansible</span>

    ansible

    2024-07-12 05:46:04      49 阅读
  6. Ansible

    2024-07-12 05:46:04       41 阅读
  7. <span style='color:red;'>Ansible</span>

    Ansible

    2024-07-12 05:46:04      33 阅读
  8. <span style='color:red;'>ansible</span>

    ansible

    2024-07-12 05:46:04      55 阅读
  9. Ansible

    2024-07-12 05:46:04       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 05:46:04       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 05:46:04       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 05:46:04       57 阅读
  4. Python语言-面向对象

    2024-07-12 05:46:04       68 阅读

热门阅读

  1. python常用命令

    2024-07-12 05:46:04       22 阅读
  2. 微信小程序中的数据通信

    2024-07-12 05:46:04       27 阅读
  3. TypeScript中的交叉类型

    2024-07-12 05:46:04       29 阅读
  4. CUDA编程 - asyncAPI 学习记录

    2024-07-12 05:46:04       24 阅读
  5. Postman脚本炼金术:高级数据处理的秘籍

    2024-07-12 05:46:04       25 阅读
  6. 使用SOAP与TrinityCore交互(待定)

    2024-07-12 05:46:04       27 阅读
  7. 编程语言如何和计算机交互:深入解析交互机制

    2024-07-12 05:46:04       25 阅读
  8. LLM_入门指南(零基础搭建大模型)

    2024-07-12 05:46:04       25 阅读