Ansible整理笔记

Ansible 自动化运维笔记

ansible-简介

![image-20221009132320175](/Users/admin/Library/Application Support/typora-user-images/image-20221009132320175.png)

介绍ansible

Ansible 是一种常用的自动运维化工具,基于 python 开发,分布式,无需客户端,轻量级,配置语言采用 YAML。

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,
实现了批量系统配置、批量程序部署、批量运行命令等功能,无客户端。

ansible特性

  • 模块化:调用特定的模块,完成特殊的任务。
  • Paramiko (python 对 ssh 的实现),PyYaml,jinja2 (模块语言) 三个关键模块。
  • 支持自定义模块,可使用任何编程语言写模块。
  • 基于 python 语言实现。
  • 部署简单,基于 python 和 SSH (默认已安装),agentless,无需代理不依赖 KPI (无需 SSL)。
  • 安全,基于 OpenSSH
  • 幂等性:一个任务执行一次和执行 n 遍效果一样,不因重复执行带来意外情况。
  • 支持 playbook 编排任务,YAML 格式,编排任务,支持丰富的数据结构。
  • 较强大的多层解决方案 role。

ansible作用目标

  • 自动化部署 APP
  • 自动化管理配置项
  • 自动化的持续交付
  • 自动化的云服务管理

ansible架构

img

工作原理

img

部署ansible

yum install -y epel-release 安装epel源,建议使用下方阿里YUM

systemctl stop NetworkManager

systemctl disable NetworkManager

sestatus 查看SELLinux 是否自启,enabled ,需修改

vi /etc/selinux/config

SELINUX=disabled

setenforce 0 (临时关闭selinux防火墙 getenforce可查看selinux的状态)

阿里yum源配置

  1. 进入yum配置文件的目录下

cd /etc/yum.repos.d/

  1. 备份当前yum源(注:如果改目录下有其他关联的.repo文件也需要一起重命名备份,mv成xxx.bak文件)

mv CentOS-Base.repo CentOS-Base-repo.bak

  1. 使用之前请确保服务器上已经安装wget,如未安装执行下条命令进行安装

    yum -y install wget

  2. 使用wget下载阿里yum源repo文件

    wget http://mirrors.aliyun.com/repo/Centos-7.repo

  3. 清理默认缓存包

    yum clean all

  4. 把下载下来的阿里云repo文件设置成默认源

    mv Centos-7.repo CentOS-Base.repo

  5. 生成阿里云yum源缓存并更新yum源

    yum makecache

    yum update

  • 安装ansible

    yum -y install ansible

  • 检查部署是否完成

    • rpm -ql ansible 列出所有文件
    • rpm -qc ansible 查看配置文件
    • ansible --help 查看ansible帮助
    • ansible-doc -l 看所有模块(A10,华为,docker,EC2,aws等等广大厂商设备)
    • ansible-doc -s yum 看yum模块,了解其功能

免密方式登陆(可选)

ssh-keygen

ssh-copy-id 目标ip地址 推送公钥

ansible基础

域名解析(可选,如果不做直接添加客户机IP即可)

vi /etc/hosts

添加文件最下面

192.168.23.10 ansible 192.168.23.11 host1 192.168.23.12 host2 192.168.23.13 host3

定义主机清单

vi /etc/ansible/hosts

添加到文件最下面

host1、host2、host3 因为做了域名解析所以可添加名称,如果未做域名解析请添加客户机IP地址

测试连通性

ansible服务器上执行下面命令

ansible host1 -m ping

简洁输出

ansible host1 -m ping -o

  • 拆解命令:测试host1连通性,-m指定模块,什么功能,ping只是其中一个模块
    • know_hosts 增加用户名选项,增加密码选项
      • ansible host2 -m ping -u root -k

Inventory—主机清单

简介:清查;存货清单;财产目录;主机清单

增加主机组

官网链接

  • vim /etc/ansible/hosts

  • 在最下面添加一下内容 用中括号[]扩起来,中括号里添加信息为 组名(可自定义)

    • [webserver]

      host1

      host2

      host3

测试是否生效

ansible webserver -m ping -o

输出提示

[root@localhost ~]# ansible webserver -m ping -u root -k -o SSH password: host3 | SUCCESS => {"changed": false, "ping": "pong"} host1 | SUCCESS => {"changed": false, "ping": "pong"} host2 | SUCCESS => {"changed": false, "ping": "pong"}

增加用户名 密码

  • vim /etc/ansible/hosts

    • [webserver]

      host[1:4] ansible_ssh_user='root' ansible_pass='123456'

测试是否配置成功

ansible webserver -m ping -o 免用户名和密码成功

主机和主机的用户名密码不同配置

[webservers] host1 ansible_ssh_user='root' ansible_ssh_pass='777777' host[2:4] ansible_ssh_user='root' ansible_ssh_pass='666666

增加端口

如果遇到服务器sshd程序不是22的情况下需进行以下配置

  • vim /etc/ansible/hosts
    • [webserver] host1 ansible_ssh_user='root' ansible_ssh_pass='777777' ansible_ssh_port='指定端口号' host[2:4] ansible_ssh_user='root'

组:变量

ansible内部变量可以帮助我们简化主机清单的设置

  • vim /etc/ansible/hosts
    • [webserver] host[1:4] [webserver:vars] vars指定是‘变量的意思 ansible_ssh_user='root' ansible_ssh_pass='666666'

常用变量

![image-20221009143454595](/Users/admin/Library/Application Support/typora-user-images/image-20221009143454595.png)

子分组

将不同的分组进行组合

  • vim /etc/ansible/hosts
    • [apache] host[1:2] [nginx] host[3:4] [webserver:children] children内置变量,可以理解定义一个组叫webserver apache nginx [webserver:vars] ansible_ssh_user='root' ansible_ssh_pass='666666'

自定义主机列表

  • vim hosylist 创建文件插入一下内容
    • [dockers] host1 host2 [dockers:vars] ansible_ssh_user='root' ansible_ssh_pass='666666'

测试是否配置成功

**ansible -i hostlist dockers -m ping -o **

**ansible -i 绝对路径 dockers -m ping -o **

**-i 指的是链接外部主机清单,后边应该加上绝对路径(如果本身就在文件目录下直接指定’文件名‘即可) **

**hostlist 文件名 **

dockers 主机组 组名

ansible -i hostlist dockers -m ping -o

Ad-Hoc-点对点模式

  • 简介

临时的,在ansible中是指需要快速执行的单条命令,并且不需要保存的命令。对于复杂的命令则为 playbook。

复制模块

帮助 ansible-doc copy

这里我想把 ansible 服务器下的 nginx 源码包下发到所有添加过主机清单下的主机

复制文件到客户机某个目录下

ansible webserver -m copy -a 'src=/root/nginx-1.8.1.tar.gz dest=/tmp'

  • 拆解
    • webservser:主机清单下的组 -m :应用什么模块 copy :应用复制模块 -a :接模块对应的参数 src : source 资源 /root/nginx-1.8.1.tar.gz nginx:源码包路径 dest :destination 目的地 /tmp:对方主机/tmp目录下

修改文件主人、账号、权限

ansible webserver -m copy -a 'src=/root/nginx-1.8.1.tar.gz dest=/tmp/ owner=root group=bin mode=777'

  • 拆解
    • owner = 主人 group = 账号 mode = 权限

这里是把ansible服务器下/root目录下的/nginx-1.8.1.tar.gz源码包复制到主机清单下的所有主机的tmp目录下 主人是root group账号是bin mode权限777 如果默认不写owner和group那么主人和账号全部是root

备份

如果文件有多份,可以进行备份。

ansible webserver -m copy -a 'src=/root/hostlist/ dest=/tmp owner=root group=bin mode=777 backup=yes

  • 拆解
    • backup 备份

把ansible服务器下的root目录下的hostlist文件分别复制到所有主机清单下的/tmp目录,主人是root 账号是bin 权限是777 进行备份 备份这里可以理解为如果客户机下已经有hostlist这个文件了,那么如果不改变文件,那么执行命令ansible虽然显示成功其实是没有变化的 那么如果修改了文件执行命令的时候不加入backup(备份)参数的话,复制到客户机下默认是会把之前的原文件覆盖掉的,那么如果加了backup进行复制的话 会在原文件修改成另一个名字 source.5653.2022-09-30@16:20:14~ 类似这种

用户模块

帮助 ansible-doc user

创建用户

ansible wbserver -m user -a 'name=aofa state=present'

创建用户,用户名叫aofa

修改密码

  • 生成加密密码

    • echo '2911779835' | openssl passwd -1 -stdin 生成加密密码值
    • $1$AfW8MPE.$mnV0Qo2UMYAKJEDoHkDlh.
  • 修改密码

    • ansible webserver -m user -a 'name=aofa password="$1$AfW8MPE.$mnV0Qo2UMYAKJEDoHkDlh."'

修改shell

ansible webserver -m user -a 'name=aofa shell=/sbin/nologin append=yes' append 追加

删除用户

ansible webserver -m user -a 'name=aofa state=absent' absent删除

软件包管理模块

帮助 ansible-doc yum

ansible webserver -m yum -a 'name="*" state=latest' 升级服务器所有包

ansible webserver -m yum -a 'name="httpd" state=latest' 安装apache

ansible webserver -m yum -a 'name="httpd" state=absent' 卸载apache

服务模块

帮助 ansible-doc service

ansible webserver -m service -a 'name=httpd state=started' 启动httpd服务

ansible webserver -m service -a 'name=httpd state=started enabled=yes' 开机自启httpd服务

ansible webserver -m service -a 'name=httpd state=stopped' 停止httpd服务

ansible webserver -m service -a 'name=httpd state=restarted'重启httpd服务

ansible webserver -m service -a 'name=httpd state=started enabled=no' 开机不自启httpd服务

文件模块

帮助 ansible-doc file

ansible host1 -m file -a 'path=/tmp/88.txt mode=777 state=touch' 在host1主机的tmp目录下创建文件为88.txt,权限为777

ansible webserver -m file -a 'path=/tmp/99 mode=775 state=directory' 把webserver组的所有主机/tmp目录下创建一个名字为99的目录,权限为775

收集模块

帮助 ansible-doc setup

ansible host1 -m setup 收集host1系统的全部信息

ansible host1 -m setup -a 'filter=ansible_processor' 收集出host1系统的信息 过滤出CPU的信息 filter过滤 ansible_processorCPU信息

Shell模块

帮助ansible-doc shell

ansible webserver -m shell -a 'yum install -y vim' 把webserver下的所有主机都安装上vim

ansible webserver -m shell -a 'df -h' 查看webserver下所有主机的磁盘挂载信息

ansible webserver -m shell -a 'useradd hanqingdian' 把webserver下的所有主机都创建一个名字为hanqingdian的用户

YAML-YAML

  • 语法:

    • 列表

      • fruits:

        • - Apple

        • - Orange

        • - Strawberry

        • - Mango

    • 字典

      • martin:
        • name: Martin D'vloper
        • job: Developer
        • skill: Elite

需求:通过YAML编写一个简单的剧本,完成web的部署,配置,启动的全过程。

准备工作

ansible webserver -m shell -a 'yum -y remove httpd thhpd-tools'卸载要部署主机上的的软件服务避免冲突

yum -y install httpd 在ansible服务器上安装httpd服务方便我们后续修改配置文件进行下发给其他主机

mkdir apache创建一个目录名字为apache

cd apache

cp -rf /etc/httpd/conf/httpd.conf . 把httpd.conf文件复制到apache目录下

vim httpd.conf 找到Listen 把80改成8080

编写剧本

touch apache.yaml创建剧本文件名字为 apache.yaml

- hosts: host2
tasks:
- name: install apache packages
yum: name=httpd state=present
- name: copy apache conf
copy: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
- name: ensure apache is running
service: name=httpd state=started enabled=yes

这里的hosts代表要应用哪台主机

tasks:任务

name:解释

yum、copy、service分别是软件包管理模块,复制模块以及服务模块

注意这里有很多空格,建议粘贴到记事本上进行手敲

剧本验证

ansible-playbook apache.yaml --syntax-check 检验语法

ansible-playbook apache.yaml --list-tasks列出任务

ansible-playbook apache.yaml --list-hosts 列出主机

ansible-playbook apache.yaml执行

handlers

  • 场景使用
    • 一般用到handlers都体现在配置文件发生了变化需要重新分发到不同的主机上

例如:当然apache的端口为8080,将其修改为80

vim httpd.conf

修改:Listen为80,那么这种情况下在使用之前的剧本只是起到了覆盖效果配置还是没有生效,所以要增加处理程序,设置触发器。

因为apache修改端口完成之后需要重新启动httpd程序,当然生产环境下是不可能没事就重启的,这样会给我们造成用户丢失的现象,那么这个时候我们就会用到handlers

vim apache 编写之前的剧本
- hosts: webserver
tasks:
- name: install apache packges
yum: name=httpd state=present
- name: copy apacher conf
copy: src=./httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart httpd service 2、引用处理程序 这里冒号后面的必须要和handlers下面的name一摸一样否则会失败
- name: ensure apache is running
service: name=httpd state=started enabled=yes
handlers: 1、定义处理程序
- name: restart httpd service
service: name=httpd state=restarted
:wq退出
命令行执行:ansible-playbook apache.yaml 再次执行,配置生效,触发成功

Role-角色扮演

  • 简介
    • roles则是在ansible中,playbooks的目录组织结构。将代码或文件进行模块化,成为roles的文件目录组织结构,易读,代码可重用,层次清晰。

需求:通过role远程部署nginx并配置

准备工作

目录结构

yum -y install tree

![image-20221014102735452](/Users/admin/Library/Application Support/typora-user-images/image-20221014102735452.png)

准备目录结构

mkdir roles/nginx/{files,handlers,tasks,templates,vars} -p
touch roles/site.yaml roles/nginx/{handlers,tasks,vars}/main.yaml
echo 1234 > roles/nginx/files/index.html
yum install -y nginx && cp /etc/nginx/nginx.conf /root/roles/nginx/templates/nginx.conf.j2

编写任务

tasks任务

vim /root/roles/nginx/tasks/main.yaml
--- 这个三个减号必须添加
- name: install epel-release packge
yum: name=epel-release state=latest
- name: install nginx packge
yum: name=nginx state=latest
- name: copy index.html
copy: src=index.html dest=/usr/share/nginx/html/index.html
- name: copy nginx.conf template
template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
notify: restart nginx
- name: make sure nginx sservice running
service: name=nginx state=started enabled=yes

准备配置文件

templates金甲模版文件,可支持自定义变量以及ansible已有变量

vim /root/roles/nginx/templates/nginx.conf.j2
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes {{ ansible_processor_cores }}; {{ ansible_processor_cores }} ansible已知变量 执行剧本之后会自动识别cpu个数添加到这里
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections {{ worker_connections }}; {{ worker_connections }}ansible自定义变量需要在vars下指定变量值
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;

编写变量

vars只添加自定义变量文件 只要是自定义变量就应该添加在这里

vim vars/main.yaml
worker_connections: 10241 添加 这里是你设置的自定义变量指定值为多少金甲模版就会应用

编写处理程序

handlers相当于触发器和任务里的notify起到关联作用

vim /root/roles/nginx/handlers/main.yaml
---
- name: restart nginx
service: name=nginx state=restarted

编写总剧本

vim /root/roles/site.yaml
- hosts: webserver 应用到webserver主机组
roles:
- nginx 这是文件名称,你的roles目录下nginx目录叫什么就要写什么

实施

进入roles目录
ansible-playbook site.yaml --syntax-check 语法测试
ansible-playbook site.yaml 执行
访问:http://192.168.23.11:80

练习题

如何在ansible中,使用不同的用户登录不同的主机?

在主机清单中指定不同主机的用户名密码

vi /etc/ansible/hosts
## db-[99:101]-node.example.com
[webserver]
host1 ansible_ssh_user='aaa' ansible_ssh_pass='hanqingdian666' ansible_ssh_port='2222'
host2 ansible_ssh_user='bbb' ansible_ssh_pass='hanqingdian666'

如何加密hosts主机清单文件

ansible-vault encrypt /etc/ansible/hosts
New Vault password: 设置加密密码
Confirm New Vault password: 重新输入加密密码
Encryption successful
cat /etc/ansible/hosts 查看加密之后主机清单文件样式
$ANSIBLE_VAULT;1.1;AES256
35313261613633343933623363633835396238356566376165653365666235613262326533363864
6631616566323864303335303731663236323763636430620a623664343432353435323966353665
61656163323435333335613635396634636231323630626131316233346436356461323162323262
6439366565646264390a376132653538366361363265396439303833623335653461636139313437
64336631626232613466336430343731313931363939326634303338656561616230336232646666
61346264336135633630356561303364316236306164353665376463363538326234353738343964
64636432386364333532366565313837376463306563333330383162623763613038623839623863
35363264663266346131653332373962343939323034633433363263326538316364353435393331
[root@ansible ~]#ansible-vault decrypt /etc/ansible/hosts 进行解密
[root@ansible ~]# cat /etc/ansible/hosts 解密之后进行查看
## db-[99:101]-node.example.com
[webserver]
host1 ansible_ssh_user='aaa' ansible_ssh_pass='hanqingdian666' ansible_ssh_port='2222'
host2 ansible_ssh_user='bbb' ansible_ssh_pass='hanqingdian666'

在进行测试会出现报错

[root@ansible ~]# ansible webserver -m ping -o
[WARNING]: * Failed to parse /etc/ansible/hosts with yaml plugin: Attempting to decrypt but no vault secrets found
[WARNING]: * Failed to parse /etc/ansible/hosts with ini plugin: Attempting to decrypt but no vault secrets found
[WARNING]: Unable to parse /etc/ansible/hosts as an inventory source
[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
[WARNING]: Could not match supplied host pattern, ignoring: webserver

判断主机地址为192.168.23.11的主机。关闭该主机

- hosts: webserver
tasks:
- name: "shut down 192.168.23.11 systems"
command: /usr/sbin/init 0
when: ansible_all_ipv4_addresses == "192.168.23.11"
关闭两台
- hosts: webserver
tasks:
- name: "shut down 192.168.23.11 192.168.23.12 systems"
command: /usr/sbin/init 0
when: (ansible_all_ipv4_addresses == "192.168.23.11") or(ansible_all_ipv4_addresses == "192.168.23.12")

循环创建多个用户

- hosts: webserver
tasks:
- name: add several users
user: name={{ item }} state=present groups=wheel
with_items:
- testuser1
- testuser2
posted @   我真的兔了  阅读(204)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示