01-ansible安装与架构配置说明

ansible安装

ansible 的特点

  • 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
  • 默认使用SSH协议对设备进行管理;
  • 有大量常规运维操作模块,可实现日常绝大部分操作;
  • 配置简单、功能强大、扩展性强;
  • 支持API及自定义模块,可通过Python轻松扩展;
  • 通过Playbooks来定制强大的配置、状态管理;
  • 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
  • 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。

ansible安装方式

yum -y install epel-release
yum list all *ansible*
yum info ansible
yum -y install ansible
ansible --version
  • apt(ubuntu)系统
sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible
  • 编译安装
yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
wget -c https://releases.ansible.com/ansible/ansible-1.5.4.tar.gz
tar xf ansible-1.5.4.tar.gz
cd ansible-1.5.4
python setup.py build
python setup.py install
mkdir /etc/ansible
cp -r examples/* /etc/ansible
  • git方式
git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup
  • 通过pip安装
yum install -y python-pip
pip install --upgrade pip
easy_install pip pip install ansible --upgrade
ansible --version

ansible架构

  • Ansible:Ansible核心程序。
  • Host Inventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。
  • Playbooks:“剧本”,YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
  • CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。
  • CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。
  • ConnectionPlugins:连接插件,Ansible和Host通信使用
  • API:供第三方程序调用的应用程序编程接口 

Ansible任务执行流程

Ansible系统由控制主机对被管节点的操作方式可分为两类(ad-hoc)和(playbook)

  • ad-hoc支持单个模块,支持批量执行单条命令;
  • playbook通过多个task集合完成一类功能,可以理解为通过组合多条ad-hoc操作的配置文件;

公钥认证

  • Ansible1.2.1及其之后的版本都会默认启用公钥认证,编辑/etc/ansible/ansible.cfg 或~/.ansible.cfg
[defaults]
host_key_checking = False
#也可以通过设置环境变量来实现 export ANSIBLE_HOST_KEY_CHECKING
=False
  • ssh免密登录
ansible all -m authorized_key -a "user=nameke state=present key=\"{{ lookup('file','~/.ssh/id_rsa.pub') }} \"" -k

Ansible 相关文件

  • /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性,也可以在项目的目录中创建此文件,当前目录下如果也有ansible.cfg,则此文件优先生效,建议每个项目目录下,创建独有的ansible.cfg文件
  • /etc/ansible/hosts 主机清单
  • /etc/ansible/roles/ 存放角色的目录 
  • Ansible 的默认配置文件 /etc/ansible/ansible.cfg ,其中大部分的配置内容无需进行修改 
[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 #每次执行ansible命令是否询问ssh密码
#ask_pass     = True   
#remote_port   = 22
#host_key_checking = False     #检查对应服务器的host_key,建议取消此行注释,实现第一次连
接自动信任目标主机
#log_path=/var/log/ansible.log #日志文件,建议启用
#module_name = command   #默认模块,可以修改为shell模块
[privilege_escalation] #普通用户提权配置
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False

inventory文件

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

主机与组

  • /etc/ansible/hosts 文件的格式与windows的ini配置文件类似:
mail.example.com

[webservers]
foo.example.com
bar.example.com

[dbservers]
one.example.com
two.example.com
three.example.com
  • 端口号不是默认设置时,可明确的表示为:
badwolf.example.com:5309
  • 设置一些别名,但不是在系统的 host 文件中设置,又或者你是通过隧道在连接
jumper ansible_ssh_port=5555 ansible_ssh_host=192.168.1.50
  • 一组相似的 hostname , 可简写如下:
[webservers]
www[01:50].example.com

#数字的简写模式中,01:50 也可写为 1:50,意义相同.你还可以定义字母范围的简写模式:
[databases]
db-[a:f].example.com
  • 常用配置
[targets]

localhost              ansible_connection=local
other1.example.com     ansible_connection=ssh        ansible_ssh_user=mpdehaan
other2.example.com     ansible_connection=ssh        ansible_ssh_user=mdehaan

主机变量

#配变量给主机,变量定义后可在 playbooks 中使用
[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestsPerChild=909

组的变量

[atlanta]
host1
host2

[atlanta:vars]
ntp_server=ntp.atlanta.example.com
proxy=proxy.atlanta.example.com

把一个组作为另一个组的子成员

  • 可以把一个组作为另一个组的子成员,以及分配变量给整个组使用. 这些变量可以给 /usr/bin/ansible-playbook 使用,但不能给 /usr/bin/ansible 使用
[atlanta]
host1
host2

[raleigh]
host2
host3

[southeast:children]
atlanta
raleigh

[southeast:vars]
some_server=foo.southeast.example.com
halon_system_timeout=30
self_destruct_countdown=60
escape_pods=2

[usa:children]
southeast
northeast
southwest
northwest

inventory 参数说明

ansible_ssh_host   #将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible_ssh_port   #ssh端口号.如果不是默认的端口号,通过此变量设置.
ansible_ssh_user   #默认的 ssh 用户名
ansible_ssh_pass   #ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥)
ansible_sudo_pass  #sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass)
ansible_sudo_exe   #sudo 命令路径(适用于1.8及以上版本)
ansible_connection #与主机的连接类型.比如:local,ssh 或paramiko. Ansible 1.2 以前默认使用 paramiko.1.2
以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行.
ansible_ssh_private_key_file #ssh使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况.
ansible_shell_type  #目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为 'csh''fish'.
ansible_python_interpreter  #目标主机的python路径.适用于的情况:系统中有多个Python,或者命令路径不是"/usr/bin/python",比如\*BSD,
或者/usr/bin/python不是2.X 版本的Python.我们不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python"可执行程序名不可为python以外的名字
(实际有可能名为python26).与 ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径....

Ansible相关工具

/usr/bin/ansible 主程序,临时命令执行工具
/usr/bin/ansible-doc 查看配置文档,模块功能查看工具,相当于man
/usr/bin/ansible-playbook 定制自动化任务,编排剧本工具,相当于脚本
/usr/bin/ansible-pull 远程执行命令的工具
/usr/bin/ansible-vault 文件加密工具
/usr/bin/ansible-console 基于Console界面与用户交互的执行工具
/usr/bin/ansible-galaxy 下载/上传优秀代码或Roles模块的官网平台
  • 实现基于key验证的脚本1
[root@centos8 ~]#vim /etc/ssh/ssh_config
#修改下面一行
StrictHostKeyChecking no
[root@centos8 ~]#cat hosts.list
192.168.56.14
192.168.56.15
[root@centos8 ~]#vim push_ssh_key.sh
#!/bin/bash
rpm -q sshpass &> /dev/null || yum -y install sshpass  
[ -f /root/.ssh/id_rsa ] || ssh-keygen -f /root/.ssh/id_rsa  -P ''
export SSHPASS=magedu
while read IP;do
   sshpass -e ssh-copy-id  -o StrictHostKeyChecking=no $IP
done < hosts.list
  • 实现基于key验证的脚本2
[root@centos8 ~]#cat ssh_key.sh 
#!/bin/bash
#Author:chenwei
#Time:2020-01-11 00:43:56
#Name:file.sh
#Version:V1.0
#Description:This script is used for
. /home/nameke/scripts/functions

IPLIST="
192.168.56.11
192.168.56.13
192.168.56.14
192.168.56.15
192.168.56.16"

rpm -q sshpass &> /dev/null || yum -y install sshpass  
[ -f /root/.ssh/id_rsa ] || ssh-keygen -f /root/.ssh/id_rsa  -P ''
export SSHPASS=zhongguo
for IP in $IPLIST;do
   { sshpass -e ssh-copy-id -o StrictHostKeyChecking=no $IP; } &
done
wait
posted @ 2022-08-08 02:20  西瓜的春天  阅读(91)  评论(0)    收藏  举报