ansible 自动化运维

ansible 部署应用程序 (在操作系统层面之上)

系统初始化过程

主机名,yun源,网络,服务,时间同步,内核参数 (可以在pxe这里完成)

ansible可以方便100多台服务器来变更,不至于pxe重新安装

PXE  预启动的执行环境
PXE (Pre-boot Execution Environment)协议使计算机可以通过网络启动。 当硬盘没有OS时可以选择
光盘
u盘
网络
启动

网络 (网卡) ip 当前的环境也得有dhcp服务器来分配ip 引导程序 启动 安装系统 脚本 anacoda

anacoda.cfg 为预写配置

主控端安装ansible软件就行

pupput
ruby saltstack
python
安装包
服务 master与agent对接 (属于saltstack) 客户端服务需要汇报心跳
模块化 ansible
python
安装包
基于ssh服务 (被管的客户端,在主机清单写)
模块化 ssh 加密
telent 被抓包都是明文

配一个aliyun的epel源

下载ansible并写主机清单。来测试

[root@workstation ansible]# cat hosts
192.168.230.165
192.168.230.166
[root@workstation ansible]#



红色为报错



黄色有改动,且成功

使用相应的模块完成会更好 虽然shell是万金油

shell不能保证ansible的幂等性 重复执行效果一样



从上图可以看出差别。user模块发现符合要求,则不在重新创建,而shell重新创建且引发了报错

ansible 基于ssh 所以并发连接会受限,ssh并发1000台,那么ssh就会顶不住

ansible可以多级控制 ansible嵌套ansible下发命令

ansible拥有playbook,按顺序执行指令

配置域名,写主机清单

[root@workstation ansible]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.230.164 workstation.example.com workstation
192.168.230.165 servera.example.com servera
192.168.230.166 servera.example.com serverb
[root@workstation ansible]# vi hosts
[root@workstation ansible]# cat hosts
servera
serverb
[root@workstation ansible]# [root@workstation ansible]# ansible all --list-hosts
hosts (2):
servera
serverb
[root@workstation ansible]#



遇到此问题,手动接收密钥

查看联通性

成功-k后,短时间内就不需要-k了

我使用ssh的哪个用户登录?

[root@workstation ansible]# ansible all -m shell -a 'whoami' -k
SSH password:
serverb | CHANGED | rc=0 >>
root
servera | CHANGED | rc=0 >>
root

登录后的工作目录为家目录

[root@workstation ansible]# ansible servera -m shell -a 'pwd' -u xiaomao -k
SSH password:
servera | CHANGED | rc=0 >>
/home/xiaomao
[root@workstation ansible]#

使用xiaomao来连接,并且发现家目录为xiaomao

通过家目录来判断当前用户更加靠谱

pwd未切换用户,读不到root的环境变量

补充ce内容

提权之后,角色会从普通用户变为root

[xiaomao@servera ~]$ sudo id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[xiaomao@servera ~]$ id
uid=1000(xiaomao) gid=1000(xiaomao) groups=1000(xiaomao) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[xiaomao@servera ~]$ [xiaomao@servera ~]$ sudo cat /etc/sudoers.d/xiaomao
xiaomao ALL=(ALL) NOPASSWD:ALL
[xiaomao@servera ~]$

ini格式定义变量

YAML格式的静态清单文件

webservers:
hosts:
server[a:b].lab.example.com
vars:
user_name: kevin dbservers:
hosts:
serverc.lab.example.com:
user_name1: user1 all_servers:
children:
webservers:
dbservers:
vars:
course_name: DO447 ungrouped:
hosts:
servere.lab.example.com
vars:
course_day: 4
[student@workstat
ansible-inventory --yaml -i inventory-bak --list --output inventory
ini格式转换为yaml

动态清单(知道可以用python写这个东西就行)

定义变量

1> 在命令行中输入变量
[student@workstation ansible]$ ansible-playbook -e user_name=kevin playbook.yml -e 参数指定 2> 定义主机和主机组的变量
1~ 在资产清单定义: 第一个例子 2~ 通过特定的目录来定义
[student@workstation ansible]$ mkdir group_vars
[student@workstation ansible]$ mkdir host_vars
[student@workstation ansible]$ tree group_vars/
group_vars/
├── dbservers
└── webservers 这两个文件书写格式
web_pack: abc
在group_vars内的文件名就是你的组名
[student@workstation ansible]$ ansible -m debug -a "var=web_pack" webservers
[student@workstation ansible]$ ansible -m debug -a "var=db_version" dbservers [student@workstation ansible]$ tree host_vars/
host_vars/
├── servera.lab.example.com
└── serverb.lab.example.com [student@workstation ansible]$ ansible -m debug -a "var=server_name" servera.lab.example.com
servera.lab.example.com | SUCCESS => {
"server_name": "servera"
}
host_vars内的文件名就是你在资产清单中定义的inventory_name 3> Role定义的变量
[student@workstation ansible]$ cat roles/httpd/vars/main.yml
---
# vars file for httpd
server_port: 8080
pack_name: httpd 4> 在Play中定义:
1~ 通过关键字来定义
---
- name: debug var
hosts: webservers
vars:
username: user1
vars_files:
- vars
tasks:
- name: debug vars
debug:
msg: "{{ username }} {{ age }}" 2~ 在tasks中定义var
---
- name: debug var
hosts: webservers
tasks:
- name: debug vars
vars:
username: user1
age: 50
debug:
msg: "{{ username }} {{ age }}"
~
在一个任务中定义的变量,不可以在其他任务去调用
---
- name: debug var
hosts: webservers
tasks:
- name: debug vars
set_fact:
username: user1
age: 50
- name: copy content
copy:
content: "{{ username }} {{ age }}\n"
dest: /root/kevin 3~ 在Play中也可以通过register来注册变量

提权与连接

1~ 在ansible的配置文件中,提升权限
[defaults]
remote_user = devops
inventory = inventory
ask_pass = false
roles_path = roles [privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False 2~ 在Play中提升权限
---
- name: install httpd
become: true
hosts: webservers
tasks:
- name: install httpd
yum:
name: httpd
state: present ---
如果是在task中替身权限,那么后续中的任务,就没有提升了
- name: install httpd
hosts: webservers
tasks:
- name: install httpd
become: true
yum:
name: httpd
state: present 在block中提升权限
---
- name: install httpd
hosts: dbservers
tasks:
- block:
- name: install httpd
yum:
name: httpd
state: present - name: prepare webcontent
copy:
content: "Hello,World\n"
dest: /var/www/html/index.html
become: true 在Role中提升权限
- name: Example play with one role
hosts: localhost
roles:
- role: role-name
become: true 通过变量来提升
ansible_become = true
ansible_become_method = sudo
ansible_become_user = root
ansible_become_pass = false [privilege_escalation]
become=False
become_method=sudo
become_user=root
become_ask_pass=False [student@workstation ansible]$ cat inventory
[webservers]
servera.lab.example.com ansible_become=true [student@workstation ansible]$ cat inventory
[webservers]
servera.lab.example.com ansible_become=true ansible_become_method=sudo ansible_become_user=root [dbservers]
serverb.lab.example.com #########
ansible_user
[webservers]
servera.lab.example.com ansible_become=true ansible_become_method=sudo ansible_become_user=root ansible_user=devops [dbservers]
serverb.lab.example.com 类似于你在在配置文件中的remote_user
ansible_ssh_host #用于指定被管理的主机的真实IP
ansible_ssh_port #用于指定连接到被管理主机的ssh端口号,默认是22
ansible_ssh_user #ssh连接时默认使用的用户名 # 特定ssh连接
ansible_connection #SSH连接的类型:local, ssh, paramiko,在ansible 1.2 之前默认是paramiko,后来智能选择,优先使用基于ControlPersist的ssh(如果支持的话) ansible_ssh_pass #ssh连接时的密码
ansible_ssh_private_key_file #秘钥文件路径,如果不想使用ssh-agent管理秘钥文件时可以使用此选项 ansible_ssh_executable #如果ssh指令不在默认路径当中,可以使用该变量来定义其路径 # 特权升级
ansible_become #相当于ansible_sudo或者ansible_su,允许强制特权升级
ansible_become_user #通过特权升级到的用户,相当于ansible_sudo_user或者ansible_su_user
ansible_become_pass # 提升特权时,如果需要密码的话,可以通过该变量指定,相当于ansible_sudo_pass或者ansible_su_pass ansible_sudo_exec #如果sudo命令不在默认路径,需要指定sudo命令路径 # 远程主机环境参数
ansible_shell_executable # 设置目标机上使用的shell,默认为/bin/sh ansible_python_interpreter #用来指定python解释器的路径,默认为/usr/bin/python 同样可以指定ruby 、perl 的路径
ansible_*_interpreter #其他解释器路径,用法与ansible_python_interpreter类似,这里"*"可以是ruby或才perl等其他语言

ansible 001 ansible介绍 原理 主机清单 定义变量 提权与连接的更多相关文章

  1. Ansible主机清单Inventory文件hosts

    Ansible主机清单Inventory文件hosts 发表于 2017-05-14 | 分类于 运维相关 , Ansible | | 阅读次数 4638 | 字数统计 1,442 | 阅读时长预计 ...

  2. 1、Ansible初识简要介绍及安装

    1.Ansible简介 1.1 Ansible介绍 Ansible 是一个简单的自动化运维管理工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fab ...

  3. Ansible2:主机清单【转】

    Ansible 通过读取默认的主机清单配置/etc/ansible/hosts,可以同时连接到多个远程主机上执行任务, 默认路径可以通过修改 ansible.cfg 的 hostfile 参数指定路径 ...

  4. Ansible-免密登录与主机清单Inventory

    Ansible的指定用户与密码登录.免密登录.指定ssh端口以及主机清单Inventory配置 在实际使用中并不需要对ansible配置进行修改,或者说只有需要的时候才修改ansible配置. 添加用 ...

  5. Windows原理深入学习系列-Windows内核提权

    这是[信安成长计划]的第 22 篇文章 0x00 目录 0x01 介绍 0x02 替换 Token 0x03 编辑 ACL 0x04 修改 Privileges 0x05 参考文章 继续纠正网上文章中 ...

  6. Ansible安装部署和常用命令,及其主机清单inventory(二)

    1.ansible的安装方式 1.1使用yum源安装 yum install ansible -y 1.2使用rpm包安装 https://dl.fedoraproject.org/pub/epel/ ...

  7. 【Ansible 文档】【译文】主机清单文件

    Inventory 主机清单文件 Ansible 可以对你的基础设施中多个主机系统同时进行操作.通过选择在Ansible的inventory列出的一部分主机来实现.inventory默认保存在/etc ...

  8. Ansible 小手册系列 五(inventory 主机清单)

    Ansible 可同时操作属于一个组的多台主机,组和主机之间的关系通过 inventory 文件配置. 默认的文件路径为 /etc/ansible/hosts 主机清单示例 mail.example. ...

  9. (2)ansible主机清单文件inventory

    1)inventory作用 作用:通常用于定义要管理主机的认证信息,例如ssh登录用户名,密码等相关信息 缺省文件:/etc/ansible/hosts 2)定义主机组方式 #vim /etc/ans ...

  10. 细说Ansible主机清单inventory

    Ansible是一个系列文章,我会尽量以通俗易懂.诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些. Ansible系列博文直达链接:Ansible入门系列 前言 关于Ansible是 ...

随机推荐

  1. Autolayout 下面的 Layer.cornerRadius

    一.问题: 如何在Autolayout模式中设置一个UIView的layer.cornerRadius? 二.解决: UiView的layer目前还不支持Autolayout设置约束,因此如果想设置一 ...

  2. python脚本将ascii码形式的文件转换为真正的二进制文件

    1.通过tcpdump在越狱手机上面抓取所有包,包含环路包 将手机通过USB线连接电脑,并将其映射到本地端口,启动抓包 rvictl -s bb44203ca128c7b13bfc66fa34f6c1 ...

  3. ansible 报错 "changed": false, "msg": "Failed to connect to the host

    报错: "changed": false, "msg": "Failed to connect to the host via ssh: root@n ...

  4. mkfs.xfs报错 mkfs.xfs: /dev/new/new_box appears to contain an existing filesystem (ext4). mkfs.xfs: Use the -f option to force overwrite.

    在设置逻辑卷文件类型时候报错 mkfs.xfs: /dev/new/new_box appears to contain an existing filesystem (ext4). mkfs.xfs ...

  5. Java中可以用的大数据推荐算法

    在Java中实现大数据推荐算法时,通常会使用一些开源的机器学习库,如Apache Mahout.Weka.DL4J(DeepLearning4j,用于深度学习)或者Spark MLlib(用于在Spa ...

  6. 剑指Offer-62.二叉搜索树的第k个结点(C++/Java)

    题目: 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8)    中,按结点数值大小顺序第三小结点的值为4. 分析: 二叉搜索树的中序遍历结果正好是按数值升序排列的结 ...

  7. PMP 变更专题

    在浏览器Console中输入下列对应命令 document.getElementsByTagName('video')[0].requestPictureInPicture()--进入画中画 docu ...

  8. spring-boot-admin 监控

    监控单体应用 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spri ...

  9. Isolution

    <template> <div style="float:left;width: 100%; margin-left: 0"> <el-row > ...

  10. 浅析Vite本地构建原理

    前言 随着Vue3的逐渐普及以及Vite的逐渐成熟,我们有必要来了解一下关于vite的本地构建原理. 对于webpack打包的核心流程是通过分析JS文件中引用关系,通过递归得到整个项目的依赖关系,并且 ...