Ansible架构图
Ansible特性
- 基于python实现,由Paramike,PyYAML和Jinjia2三个关键模块
- 部署简单,agentless
- 使用ssh协议
- 主从集中化模式
- 支持自定义模块
- 支持playbook
- 幂等性:一种操作可重复多次结果相同
Ansible核心组件
- ansible core:Ansible的核心程序
- host iventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等
- core modules:Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机
- custom modules:自定义模块
- playbook(yaml,jinjia2):YAML格式文件,多个任务定义在一个文件中
- connect plugin:连接插件,Ansible和Host通信使用
Invetory文件说明
参数说明:
- ansible_ssh_host 将要连接的远程主机名,可用于设置别名
- ansible_ssh_port ssh端口,非默认可通过它来设置
- ansible_ssh_user 默认的ssh用户名
- ansible_ssh_pass ssh密码 不安全
- ansible_sudo_pass sudo密码 不安全
- ansible_connection 主机连接类型
- ansible_ssh_private_key_file ssh 使用的私钥文件.适用于有多个密钥
- ansible_shell_type 目标系统的shell类型
- ansible_python_interpreter 目标主机的python路径
查看模块帮助信息
- ansible-doc -l
- ansible-doc -s module_name
变量
- invetory中定义变量
- playbooks中定义变量
在playbook文件中冒号后面的值不能以”{ “开头,解决办法:要在”{ “开始的值加上引号,如:
- 通过系统变量(facts),可直接使用,如ansible_os_family,ansible_ens3.ipv4.address;
- 运行结果当做变量使用-注册变量,register: result ,debug: msg=”“
- 文件模板中使用的变量
- 定义命令行变量如下
用命令行传递参数
- -e或者–extra-vars, -e ‘参数名1=值1 参数名2=值2’
- json格式传递参数 -e ‘{‘hosts’:’local’, ‘user’:’root’}’
- 参数放在json文件里面中 -e “@vars.json”
ansible命令应用
常见模块
- command
- cron
- user
- group
- copy
- file
- ping
- setup
- service
- shell
- script
- yum/apt
cron:计划任务
user:用户管理
group:用户组管理
copy:文件复制
file:文件管理属性
ping:测试主机联通性
setup:收集远程主机的facts
service:常用服务的运行状态
shell:远程执行命令,可传递参数
script:将本地脚本在远程上执行
yum/apt: 安装程序包
playbook
通过yaml将多个模块组装起来运行多个任务
实例说明:https://github.com/ansible/ansible-examples
组成结构:
Playbooks:
Tasks:任务列表,定义的一组hosts映射到task
Variables:变量
Templates:模板
Handlers:处理器,由某事件触发执行的操作,一般用来重启服务,或者触发系统重启操作,handlers按照声明的顺序执行
Roles:角色
Include语句
运行说明:
0)yaml语法检测
ansible-playbook –syntax-check /path/to/playbook.yaml
1)yaml测试运行
ansible-playbook -C /path/to/playbook.yaml
2)运行
ansiable-playbook /path/to/playbook.yml
-t TAGS #给指定的任务定义一个调用标识
–tags=TAGS #给指定的任务定义一个调用标识
–skip-tags=SKIP_TAGS #跳过指定的标签
–start-at-task=START_AT #从哪个任务后执行
–list-tags #查看标签
基本结构:
roles
roles:用于层次化、结构化的组织playbook;role能够根据层次结构自动装载变量文件、task以及handlers等,要使用roles只需要在playbook中使用include指令;roles通过分别将变量、文件、任务、模块及处理器放置在单独的目录中,并可以便捷地通过include它们的一种机制,角色一般用于基于主机构建服务的场景中;Roles 的概念来自于这样的想法:通过 include 包含文件并将它们组合在一起,组织成一个简洁、可重用的抽象对象
创建role的步骤如下:
- 创建以roles命名的目录
- 在roles目录中分别创建以各角色名称命名的目录,如websrvs等
- 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建
- 在palybook文件中调用各角色
roles内各目录中可用的文件
wordpress-nginx 实例如下:
目录结构
site.yml -入口函数
group_vars/all -全局变量
common
roles/common/tasks/main.yml
roles/common/handlers/main.yml
mysql
roles/mysql/tasks/main.yml
roles/mysql/handlers/main.yml
roles/mysql/templates/my.cnf.j2
nginx
roles/nginx/tasks/main.yml
roles/nginx/handlers/main.yml
roles/nginx/templates/default.conf
php-fpm
roles/php-fpm/tasks/main.yml
roles/php-fpm/handlers/main.yml
roles/php-fpm/templates/wordpress.conf
wordpress
roles/wordpress/tasks/main.yml
roles/wordpress/templates/wp-config.php
原文:大专栏 运维 Ansible