Ansible快速入门(上)
Ansible快速入门
1.1 什么是Ansible
Ansible是一个IT自动化的配置管理工具,自动化主要体现在:
Ansible集成了丰富模块,以及强大的功能组件,可以通过一个命令行完成一系列的操作。进而能减少我们重复性的工作,以提高工作的效率。
1.2 Ansible主要功能
- 批量执行远程命令,可以对N多台主机同时进行命令的执行。
- 批量配置软件服务,可以进行自动化的方式配置和管理服务。
- 实现软件开发功能,jumpserver底层使用ansible来实现的自动化管理。
- 编排高级的IT任务,Ansible的Playbook是一门编程语言,可以用来描绘一套IT架构。
1.3 Ansible的特点
- 容易学习:无代理,不像saltstack既要学客户端与服务端,还需要学习客户端与服务端中间通讯协议;
- 操作灵活:Ansible有较多的模块,提供了丰富的功能、playbook则提供类似于编程语言的复杂功能;
- 简单易用:体现在Ansible一个命令可以完成很多事情;
- 安全可靠:因为Ansible使用了SSH协议进行通讯,既稳定也安全;
- 移植性高:可以将写好的playbook拷贝至任意机器进行执行;
- 幂等性:一个任务执行1遍和执行n遍效果一样,不会因为重复执行带来意外情况;
1.4 Ansible基础架构
Ansible 架构中的控制节点、被控制节点、inventroy、ad-hoc、playbook、Connection Protocol是什么?
ProcessOn: Ansible 架构流程图
2. Ansible安装与配置
2.1 rpm安装
[root@manager ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@manager ~]# yum install ansible -y
2.2 pip安装
[root@manager ~]# yum install python3 python3-devel python3-pip -y
[root@manager ~]# pip3 install --upgrade pip -i https://pypi.douban.com/simple/
[root@manager ~]# pip3 install ansible -i https://pypi.douban.com/simple/
[root@manger ~]# /usr/local/bin/ansible --version
2.3确认安装
方式一、检查Ansible版本
[root@manager ~]# ansible --version
ansible 2.10.5
config file = None
configured module search path = ['/root/.ansible/plugins/modules','/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/lib/python3.6/site-packages/
ansible executable location = /usr/local/bin/ansible
python version = 3.6.8 (default, Nov 16 2020,16:55:22) [GCC 6.8.5 20150623 (Red Hat 6.8.5-44)]
方式二、测试Ansible是否可用
[root@manager ~]# ansible localhost -m ping
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}
3. Ansible配置解读
3.1 Ansible配置路径
- /etc/ansible/ansible.cfg :主配置文件,配置ansible工作特性
- /etc/ansible/hosts :配置主机清单文件
- /etc/ansible/roles/ :存放ansible角色的目录
3.2 Ansible主配置文件
Ansible 的主配置文件存在/etc/anible/ansible.cfg ,其中大部分的配置内容无需进行修改;
[root@manager ~]# cat /etc/ansible/ansible.cfg
[defaults]
#inventory = /etc/ansible/hosts #主机列表配置文件
#library = /usr/share/my_modules/ #库文件存放目录
#remote_tmp = ~/.ansible/tmp #临时py文件存放在远程主机目录
#local_tmp = ~/.ansible/tmp #本机的临时执行目录
#forks = 5 #默认并发数
#sudo_user = root #默认sudo用户
#ask_sudo_pass = True #每次执行是否询问sudo的ssh密码
#ask_pass = True #每次执行是否询问ssh密码
#remote_port = 22 #远程主机端口
host_key_checking = False #检查对应服务器的host_key,建议取消
log_path = /var/log/ansible.log #ansible日志,建议启用
[privilege_escalation] #如果是普通用户则需要配置提权
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False
3.3 Ansible配置优先级
-
Ansible 的配置文件可以存放在任何位置,但配置文件有读取顺序,查找顺序如下:
- 1、最先查找 $ANSIBLE_CONFIG 变量
- 2、其次查找当前目录下 ansible.cfg
- 3、然后查找用户家目录下的 .ansible.cfg
- 4、最后查找 /etc/ansible/ansible.cfg
-
通过命令行操作演示,验证结论;
配置文件的优先级: # nearly all parameters can be overridden in ansible-playbook # or with command line flags. ansible will read ANSIBLE_CONFIG, # ansible.cfg in the current working directory, .ansible.cfg in # the home directory or /etc/ansible/ansible.cfg, whichever it # finds first 第一步读取:ANSIBLE_CONFIG 第二步读取:当前项目目录下的ansible.cfg 第三步读取:当前用户家目录下的 .ansible.cfg 第四步读取: /etc/ansible/ansible.cfg [root@manager ~]# export ANSIBLE_CONFIG=/tmp/ansible.cfg [root@manager ~]# touch /tmp/ansible.cfg [root@manager ~]# ansible --version ansible 2.9.25 config file = /tmp/ansible.cfg [root@manager ~]# unset ANSIBLE_CONFIG # 取消 为项目单独定义配置文件,非常的重要; [root@manager ~]# mkdir project1 [root@manager ~]# cd project1/ [root@manager project1]# touch ansible.cfg [root@manager project1]# ansible --version ansible 2.9.25 config file = /root/project1/ansible.cfg # 为当前执行的用户家目录植入一个配置文件; [root@manager ~]# touch ~/.ansible.cfg [root@manager ~]# ansible --version ansible 2.9.25 config file = /root/.ansible.cfg # 默认的配置文件加载路径,优先级是最低的 [root@manager project1]# rm -f ~/.ansible.cfg [root@manager ~]# ansible --version ansible 2.9.25 config file = /etc/ansible/ansible.cfg
3.4 普通用户管理被控端
场景说明:ansible 使用 oldxu 普通用户统一管理所有的被控端节点;
1.首先控制端,被控端,都需要有 oldxu 用户;
[root@manager ~]# useradd oldxu
[root@manager ~]# echo "123" | passwd --stdin oldxu
2.将控制端 oldxu 用户的公钥推送到被控端 oldxu 用户下,使普通用户能进行免密码登录;
[root@manager ~]# su - oldxu
[oldxu@manager ~]$ ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
[oldxu@manager ~]$ ssh-copy-id -i ~/.ssh/id.pub oldxu@IP
3.所有主机的 oldxu 用户都必须添加 sudo 权限。
[root@manager ~]# visudo
oldxu ALL=(ALL) NOPASSWD: ALL
4.修改控制端 /etc/ansible/ansible.cfg 主配置文件,配置普通用户提权;
[root@manager ~]# vim /etc/ansible/ansible.cfg
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
5.使用 oldxu 用户测试是否能执行任务;
先上 playbook
- hosts: all
vars:
user: test
password: "$6$rounds=100000$O2BHfT2XIF6oDb9w$8Hhv4vOrLN6JF/nRVYDd8zZdnn9TNkQutyYYywIcPF2kRiHgkwAjqHIN7sDUkd1DcjLRABWT9ULHZPBOF2bZS/"
remote_user: root
tasks:
- name: Add user {{ user }}
user: name={{user}} comment="ceph user" password={{ password }}
- name: Config /etc/sudoers
lineinfile: dest=/etc/sudoers state=present line='{{item}}' validate='visudo -cf %s'
with_items:
- "{{ user}} ALL=(ALL) NOPASSWD: ALL"
- "Defaults: {{user}} !requiretty"
此 playbook 将添加一个具有 sudo 权限的 test 用户密码为 password
更改用户只用更改 vars: 中的 user 即可
生成密码:
#pip install passlib
python -c "from passlib.hash import sha512_crypt; import getpass; print sha512_crypt.encrypt(getpass.getpass())"
输入密码后确认,会生成一长串字符替换 playbook 中的即可
4. Ansible Inventory
4.1 Inventory是什么
Inventory 文件主要用来填写被管理主机以及主机组信息;(逻辑上定义);
默认 Inventory 文件为 /etc/ansible/hosts;
当然也可以自定义一个文件,当执行 ansible 命令时使用 -i 选项指定 Inventory 文件位置;
4.2 Inventory-密码连接方式
1.指定主机IP,指定主机端口,指定主机用户名、密码;
# 详细清单文件;
[webservers]
10.0.0.31 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
10.0.0.41 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass='123456'
# 通过域名的简写方式;
[webservers]
web[1:2].oldxu.com ansible_ssh_pass='123456'
2.通过变量方式定义密码;
[webserver]
web[1:2].oldxu.com
[webservers:vars]
ansible_ssh_pass='123456'
4.3 Inventory-秘钥连接方式
1.创建秘钥对,然后下发秘钥;
[root@manager ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.7
[root@manager ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.8
2.配置 inventory 主机清单;
[webservers]
172.16.1.7
172.16.1.8
#定义别名;
[webservers]
web01 ansible_ssh_host=172.16.1.7 ansible_ssh_port=22
web02 ansible_ssh_host=172.16.1.8
4.4 Inventory-主机匹配方式
ansible 的 host-pattern 主机匹配使用说明;
# 指定操作所有的组
ansible all -m ping
# 通配符;
ansible "*" -m ping
ansible 10.0.0.* -m ping
# 与:在webservers组;并且在dbsservers中的主机;
ansible "webservers:&dbservers" -m ping
# 或:在webservers组,或者在appservers中的主机;
ansible "webservers:appservers" -m ping
# 非:在webservers组,但不在apps组中的主机
ansible 'webservers:!apps' -m ping
# 正则表达式;
ansible "~(web|db).*\.oldxu\.com" -m ping
5. Ansible ad-hoc
5.1 ad-hoc是什么
ad-hoc 简而言之就是 “临时命令”,执行完即结束,并不会保存;
- 应用场景1:查看多台节点的进程是否存在;
- 应用场景2:拷贝指定的文件至本地;
5.2 ad-hoc命令使用
命令示例: ansible 'groups' -m command -a 'df -h'
,含义如下图所示;
5.3 ad-hoc执行过程
- 1.加载自己的配置文件,默认 /etc/ansible/ansible.cfg ;
- 2.查找对应的主机配置文件,找到要执行的主机或者组;
- 3.加载自己对应的模块文件,如 command ;
- 4.通过 ansible 将模块或命令生成对应的临时 py 文件,并将该文件传输至远程服务器对应执行用户$HOME/.ansible/tmp/ansible-tmp-number/XXX.PY ;
- 5.执行用户家目录的 ` ` 文件;
- 6.给文件 +x 执行;
- 7.执行并返回结果;
- 8.删除临时 py 文件, sleep 0 退出;
ad-hoc 模块:
0.测试 shell | command
0.下载 get_url
1.安装 yum | yum_repository
2.配置 copy | template
3.初始化 file 创建文件,创建目录,授权
4.用户|组 user group
4.启动 systemd
6.挂载 mount
7.定时任务 cron
8.防火墙 firewalld | iptables
9.文件内容修改 lineinfile
5.4 ad-hoc执行状态
使用 ad-hoc 执行一次远程命令,注意观察返回结果的颜色;
- 绿色: 代表被管理端主机没有被修改
- 黄色: 代表被管理端主机发现变更
- 红色: 代表出现了故障,注意查看提示