ansible

1.ansible简介

Ansible通过一个基于Python的agentless架构来实现自动化和配置管理。它使用SSH协议连接到远程服务器或设备,然后在远端服务器上执行模块,最后将执行结果汇报回来告知控制节点执行结果。这种通信模式保证了所有Ansible任务都是在目标主机上运行的,而不是在控制节点上运行,因此可以最大程度地降低传输成本和安全风险。

 

2.ansible安装

2.1设置EPEL仓库
Ansible仓库默认不在yum仓库中,因此我们需要使用下面的命令启用epel仓库
yum install epel-release -y
2.2使用yum安装Ansible
复制代码
yum install ansible -y

#安装后生成的主要文件

/etc/ansible/ansible.cfg #配置文件
/etc/ansible/hosts #主机库(host inventory)管理被监控的主机
/usr/bin/ansible #主程序
/usr/bin/ansible-doc #文档
/usr/bin/ansible-playbook #剧本

复制代码
2.3查看ansible的版本
复制代码
ansible --version

ansible 2.9.27
config file = /etc/ansible/ansible.cfg    #通过这个可以确定当前读取的cfg文件
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

复制代码

ansible获取ansible.cfg文件的顺序

1.当前目录下的ansible.cfg文件

2.用户家目录(~/.)下ansible.cfg文件

3./etc/ansible/ansible.cfg全局配置文件

4.以上都没有则用ansible默认配置

2.4配置ansible.cfg文件

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
复制代码

 

复制代码
#/etc/ansible/ansible.cfg文件常用格式,可借鉴
[defaults] inventory
= /home/student/ansible/inventory #主机文件,默认为/etc/ansible/hosts
roles_path = /home/student/ansible/roles #role路径,默认路径为/usr/share/ansible/roles
remote_user = root #连接远程主机时默认使用root用户名

[privilege_escalation] #建议配置提权
become=True #连接后是否自动在受管主机上切换用户(通常切换为root)。
become_method=sudo #如何切换用户(通常为sudo,这也是默认设置,但也可选su)
become_user=root #要在受管主机上切换到的用户(通常时root,这也是默认值)。
become_ask_pass=False #是否需要为become_method提示输入密码。默认为false。
复制代码

3.前期准备

3.1设置ssh免密登录

详看《SSH配置免密登录方法

3.2构建主机清单

vi /etc/ansible/hosts

复制代码
[dev]        #组名
10.80.39.77
10.80.39.78 [test]
10.80.39.79
[webservers:children]     #dev和teset组是webservers主机组的成员
dev
test
复制代码

如果没有配置ssh免密登录,需要在hosts文件中写入密码,格式如下

[dev]
ansible_ssh_host=10.80.39.77 ansible_ssh_port=22 ansible_ssh_user="root" ansible_ssh_pass="123456"
ansible_ssh_host=10.80.39.78 ansible_ssh_port=22 ansible_ssh_user="root" ansible_ssh_pass="123456"

4.常用临时命令

4.1 ping模块检查节点联通性
ansible dev -m ping     #默认在/etc/ansible/hosts文件寻找组,也可以用-i指定hosts文件
4.2 command模块(干脆直接用shell)

ansible的默认模块,不指定-m参数的时候,使用的就是command模块; 常见的命令都可以使用,但命令的执行不是通过shell来执行的,所以< > | and & z这些操作都不可以,不支持管道,没法批量执行命令

4.3 shell模块

使用shell模块的时候默认是通过/bin/sh来执行的,所以在终端输入的各种命令都可以使用.

ansible -i /etc/ansible/hosts  dev -m shell -a "source ~/.bash_profile && df -h|head -n 1"
4.4 scripts模块

使用scripts模块可以在本地写一个脚本,在远程服务器上执行。

cat /etc/ansible/test.sh
#!/bin/bash
date
hostname
echo "大家好,我是互联网小李,脚本执行成功"
ansible -i /etc/ansible/hosts web-servers -m script -a "/etc/ansible/test.sh"
4.5 copy模块

copy模块:实现主控端向目标主机拷贝文件,类似scp功能

#src源地址,dest目的地址
ansible -i /etc/ansible/hosts web-servers -m copy -a "src=/etc/hosts dest=/root owner=root group=root mode=0777"
4.6 file模块给文件设置权限
ansible -i /etc/ansible/hosts dev -m file -a "path=/root/hosts mode=0755"
4.7 stat模块获取远程文件信息
ansible -i /etc/ansible/hosts web-servers -m stat -a "path=/root/hosts"
4.8 get_url模块实现远程主机下载指定的url地址
ansible -i /etc/ansible/hosts web-servers -m get_url -a "url=https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm  dest=/tmp/ mode=0440 force=yes"
#force=yes 的作用是强制下载此RPM文件并覆盖目标文件
4.9 yum模块
 yum模块可以提供的status状态: latest (确保安装最新版本),present,installed #这三个代表安装;removed, absent #这两个是卸载
ansible -i /etc/ansible/hosts web-servers -m yum -a "name=httpd state=latest"
4.10 cron模块远程管理主机crontab配置
#设置任务
ansible -i /etc/ansible/hosts web-servers -m cron -a "name='list dir' minute='*/30' job='echo 我是互联网小李'" #name为任务名称,可通过此确定任务进行修改
#查看任务
ansible web-servers -m cron -a "user=root state=list" #user=root,root用户下的任务
#删除任务
ansible web-servers -m cron -a "user=root name='backup' state=absent" #删除‘backup’任务
4.11 service 远程管理主机系统服务模块
ansible -i /etc/ansible/hosts web-servers -m service -a "name=httpd state=started enabled=yes"
#state参数: started、stopped、restarted、reloaded,不能查看状态
4.12 user模块管理远程主机的用户
ansible -i /etc/ansible/hosts web-servers -m user -a "name=itlaoxin state=present"
#state参数:present增加用户,absent删除用户,locked锁定用户,unlocked解锁用户

 5.role角色

5.1安装rhel-system-roles
yum install -y rhel-system-roles
ansible-galaxy list #查看可以使用的角色,角色默认下载在/usr/share/ansible/roles
ansible-galaxy install geerlingguy.mysql -p roles/ #从官网下载角色到指定目录
5.2将roles模板复制到roles_path下
#路径和ansible.cfg中的roles_path相对应
cp -r /usr/share/ansible/roles/rhel-system-roles.timesync /home/student/ansible/roles/timesync
5.3创建yaml执行文件
复制代码
cat timesync/README.md  #根据使用需求,到README.md中寻找示例
vi timesync.yml

---
- hosts: all
 vars:
   timesync_ntp_servers:
     - hostname: pool.ntp.org
       iburst: yes
 roles:
   - rhel-system-roles.timesync
复制代码
5.4yaml文件语法检查
ansible-playbook --syntax-check timesync.yml   #语法检查
ansible-playbook timesync.yml --check #模拟运行yaml
5.5运行yaml
ansible-playbook timesync.yml
5.6验证结果
ansible all -m shell -a 'chronyc sources -v '

 6.playbook剧本

6.1playbook介绍
6.1.1 配置文件格式
playbook 由 YMAL 语言编写,以下为 playbook 常用到的YMAL格式

1、文件的第一行应该以  "---"  (三个连字符)开始,表明 YMAL 文件的开始。
2、在同一行中,# 之后的内容表示注释,类似于 shell,python 和 ruby。
3、YMAL 中的列表元素以 ”-” 开头然后紧跟着一个空格,后面为元素内容。
4、同一个列表中的元素应该保持相同的缩进。否则会被当做错误处理。
5、play 中 hosts,variables,roles,tasks 等对象的表示方法都是键值中间以 ":" 分隔表示,":" 后面还要增加一个空格。
6.1.2 配置文件的基础组件
Hosts:运行指定任务的目标主机
remoute_user:在远程主机上执行任务的用户;
sudo_user:
tasks:任务列表
6.1.3 playbook核心元素
Hosts:主机组;
Tasks:任务列表;
Variables:变量,设置方式有四种;
Templates:包含了模板语法的文本文件;
Handlers:由特定条件触发的任务;
6.2 variables变量

variables变量有四种定义方法。如下

6.2.1 facts :可直接调用

ansible中有setup模块,这个模块就是通过facts组件来实现的。这里的variables也可以直接调用facts组件的facters我们可以使用setup模块来获取,然后直接放入我们的剧本之中调用即可

6.2.2 用户自定义变量
方法1:
通过命令行传入:ansible-playbook 命令的命令行中的 -e VARS, --extra-vars=VARS,这样就可以直接把自定义的变量传入。
ansible-playbook nginx.yml -e rpmname=keepalived #
rpmname为yaml中的变量名
方法2: 在 playbook 中定义变量:我们也可以直接在yaml中定义我们的变量。示例如下: 、
vars:
- var1: value1
- var2: value2
6.2.3通过roles传递变量

 playbook执行角色调用时,读取变量优先级roles/vars/main.yml>playbook > hosts

后面有角色专门的描述

6.2.4 在Inventory主机清单中定义
#向不同的主机传递不同的变量
IP/HOSTNAME varaiable=value var2=value2
 
#向组中的主机传递相同的变量
[groupname:vars]
variable=value
6.3 templates模板
Ansible 模板(templates)是一种使用户能够快速轻松生成配置文件的方法。模板允许用户使用编程语言(如 Jinja2 和 Mako)将变量插入到文件中。
这些模板文件包含了一些占位符用来替换为在 Ansible Playbook 中定义的变量或者主机级别的变量,从而根据具体环境动态生成文件。
使用roles角色时,template文件必须存放于templates目录下,且命名为 .j2 结尾

范例:利用template 同步nginx配置文件

  • 定义模板
复制代码
[root@ansible ansible]# mv /tmp/nginx.conf /tmp/nginx.conf.j2
[root@ansible ansible]# vi /tmp/nginx.conf.j2 
ddworker_processes {{ ansible_processor_vcpus }};
listen {{ nginxport }};      #定义变量替换
 
user  nginx;
worker_processes  1;
 
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
 
 
events {
    worker_connections  1024;
}
 
 
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
 
    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;
 
    keepalive_timeout  65;
 
    #gzip  on;
server {
 
listen 8888;
}
复制代码
  • 修改剧本,如下两个地方

6.4 条件测试
  • when语句:在task中使用,jinja2的语法格式
    tasks:
    - name: install conf file to centos7
      template: src=files/nginx.conf.c7.j2
      when: ansible_distribution_major_version == "7"
    - name: install conf file to centos6
      template: src=files/nginx.conf.c6.j2
      when: ansible_distribution_major_version == "6"
  • 循环:迭代,需要重复执行的任务,对于迭代项的引用,固定变量名为“item”,而后在task中使用with_items给定的迭代的元素列表
tasks:
- name: unstall web packages
  yum: name={{ item }} state=absent
  with_items:
  - httpd
  - php
  - php-mysql
6.5 字典
  • ansible playbook也支持字典功能,举例如下:
复制代码
- name: install some packages
  yum: name={{ item }} state=present
  with_items:
    - nginx
    - memcached
    - php-fpm
- name: add some groups
  group: name={{ item }} state=present
  with_items:
    - group11
    - group12
    - group13
- name: add some users
  user: name={{ item.name }} group={{ item.group }} state=present
  with_items:
    - { name: 'user11', group: 'group11' }
    - { name: 'user12', group: 'group12' }
    - { name: 'user13', group: 'group13' }
复制代码

 

 7.角色定制

7.1 简介
  • 对于以上所有方式有个缺点就是无法实现同时部署web、database、keepalived等不同服务或者不同服务器组合不同的应用就需要写多个yaml文件,很难实现灵活的调用roles用于层次性,结构化地组织playbook。roles能够根据层次结果自动装载变量文件、tasks以及handlers等。
  • 要使用roles只需要在playbook中使用include指令即可。
  • 简单来讲,roles就是通过分别将变量(vars)、文件(files)、任务(tasks)、模块(modules)以及处理器(handlers)放置于单独的目录中,并且可以便捷的include它们地一种机制。
  • playbook执行角色调用时,读取变量优先级roles/vars/main.yml>playbook > hosts
7.2 角色集合
复制代码
files/:存储由copy或script等模块调用的文件;

tasks/:此目录中至少应该有一个名为main.yml的文件,用于定义各task;其它的文件需要由main.yml进行“包含”调用;

handlers/:此目录中至少应该有一个名为main.yml的文件,用于定义各handler;其它的文件需要由main.yml进行“包含”调用;

vars/:此目录中至少应该有一个名为main.yml的文件,用于定义各variable;其它的文件需要由main.yml进行“包含”调用;

templates/:存储由template模块调用的模板文本;

meta/:此目录中至少应该有一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yml进行“包含”调用;

defaults/:此目录中至少应该有一个名为main.yml的文件,用于设定默认变量;
复制代码
7.3 添加新角色
ansible-galaxy init *****  #使用init命令初始化新角色的基本结构,节省创建各种目录和main.yml文件的时间
7.4 示例-部署apache服务的自动安装
7.4.1 添加apache角色
cd /home/devops/ansible
mkdir roles          #创建角色目录
cd roles             #进入角色目录
ansible-galaxy init apache      #使用init命令添加新角色apache
cd /home/devops/ansible         #进入ansible目录
ansible-galaxy list              #列出已安装角色

7.4.2 创建任务tasks
cd /home/devops/ansible/roles/apache        #进入apache目录
rm -fr tests        #删除测试目录
cd tasks            #进入任务目录
vim main.yml        #编写配置文件
复制代码
---
- name: install apache        #安装apache服务
  yum:
    name: httpd
    state:  present
    
- name: config apache        #配置apache服务
  template:
    src:  httpd.conf.j2
    dest: /etc/httpd/conf/httpd.conf
  notify: restart httpd     #与下面触发器相对应
  
- name: start apache        #开启apache服务
  service:
    name: httpd
    state: started 
- name: stop firewalld        #关闭防火墙
  service:
    name: firewalld
    state: stopped
- name: copy index.html #拷贝默认发布文件
copy:
src: index.html
dest:
/var/www/html/index.html
复制代码
7.4.3 创建触发器handlers
cd handlers            #进入任务目录
vim main.yml        #编写配置文件
---
- name: restart httpd  #此处的name与task/main.yml中的notify一致,重启apach服务
  service:
    name: httpd
    state: restarted
7.4.4 创建发布文件
vim index.html            #编辑默认发布文件
    haohao
7.4.5 创建httpd.conf

在本机上提前安装好httpd服务,将生成的配置文件httpd.conf拷贝到templates目录下。

sudo cp /etc/httpd/conf/httpd.conf /home/devops/ansible/roles/apache/templates        #拷贝配置文件
sudo chown devops.devops httpd.conf            #修改所有人和所有组
mv httpd.conf httpd.conf.j2                    #修改文件类型    
7.4.6 定义变量
vim vars/main.yml

http_host: "{{ ansible_hostname }}"   #ansible_hostname是Ansible中的一种变量替换方式,用于获取目标主机的主机名信息
http_port: 80
7.4.7 编辑apache.yml文件
cd /home/devops/ansible        #进入ansible目录
vim apache.yml

---
- hosts: db            #在指定主机调用执行角色
  roles:
    - apache
7.4.8 检查并执行apache.yml文件
ansible-playbook apache.yml  --check   #模拟运行,也是检查语法
ansible-playbook apache.yml 
7.4.9 测试结果
curl 172.25.66.3

 8. 巧用ansible-doc

复制代码
#命令格式:
ansible-doc -l        #列出所有的模块列表
ansible-doc -l |grep -i lvm #-i 忽略大小写 ansible
-doc -s 模块名 #查看指定模块的参数 ansible-doc 模块名 #查看指定模块的详细参数及示例EXAMPLE #示例 ansible-doc copy #查看copy模块的帮助 ansible-doc yum #查看yum模块的帮助 #查看yum帮助信息 EXAMPLES: - name: install the latest version of Apache yum: name: httpd state: latest - name: ensure a list of packages installed yum: name: "{{ packages }}" vars: packages: - httpd - httpd-tools - name: remove the Apache package yum: name: httpd state: absent
复制代码

提示

#在传送命令下载的时候如果此前有操作过,那些会显示执行成功,但是会显示绿色

#传送显示颜色信息说明
    1.黄色:对远程节点进行相应修改
    2.绿色:对远程节点不进行相应修改
    3.红色:操作执行有问题
    4.紫色:表示对命令执行发出警告信息(可能存在问题)

 9.block rescue always三件套

block任务块是主要的tasks,如果运行正确,不会运行rescue;
block里的tasks运行失败了,才会运行rescue里的tasks;
block和rescue里的tasks无论是否运行成功,都会运行always里的tasks。

范例

复制代码
---
- name: block_rescue_always演示
  hosts: all
  tasks: tasks1
    - name: 更新数据库
      block:
        - name: 执行更新数据库
          shell:
            cmd: /usr/local/lib/upgrade_database
      # 如果执行更新数据库失败,就会执行回滚数据库进行补救
      rescue:
        - name: 回滚数据库
          shell:
            cmd: /usr/local/lib/revert_database
      # 不管block和rescue的执行结果,都会重启数据库服务
      always:
        - name: 总是重启数据库服务
          service:
            name: mariadb
            state: restarted
复制代码

 10.变量

ansible变量(vars)、机密(vaults)与事实(facts)

变量优先级(高--低)

  • 命令行定义变量--> yaml文件中的变量(vars_file  --->   vars)--->主机清单中单独定义主机变量--->主机清单公共变量
10.1 事实变量

facts组件是ansible用于采集被管理机器设备信息的一个功能, 采集的机器设备信息主要包含IP地址,操作系统,以太网设备,mac地址,时间/日期相关数据,硬件信息等。

ansible有一个模块叫setup,用于获取远程主机的相关信息,并可以将这些信息作为变量在playbook里进行调用,而setup模块获取这些信息的方法就是依赖于fact。

10.1.1通过setup查看变量

我们可以使用setup模块获取被管理机器的所有facts信息,可以使用filter来过滤指定的信息。setup模块获取的整个facts信息被包装在一个json格式的数据结构中,ansible_facts是最外层的值。

 

 

10.1.2 Ansible事实变量示例:

方式3为2.5之前版本,但新版兼容

 

 

 

 

 

posted @   阿锋888  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示