ansible 001 ansible介绍 原理 主机清单 定义变量 提权与连接

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等其他语言
posted @ 2022-08-28 01:05  supermao12  阅读(143)  评论(0编辑  收藏  举报