linux自动化运维之ansible实战

ansible基础介绍

优点

  • 相比于saltatack和puppet,没有客户端,更轻量级

  • 只是一个工具,可以很容易实现分布式拓展

  • 更强的远程执行命令

特点

  • 模块化

  • 支持自定义模块,可以用任何语言编写模块

  • 基于python语言实现

  • 部署简单,基于python和ssh,agentless,无需代理

  • 安全

安装

yum安装

首先安装epel源:yum install epel-release -y

下载ansible:yum install ansible

ansible目录结构

root@bogon ansible\]# tree . ├── ansible.cfg ├── hosts └── roles └── role_httpd.yml ansible.cfg:主配置文件,一般无需更改 hosts:主机清单,添加主机 roles:存放角色的目录 ![img](https://file.jishuzhan.net/article/1775320410628296705/2d74f139893f76362c5c1b8899d3d207.webp)![](https://file.jishuzhan.net/article/1775320410628296705/de4d37e6ee441c2bebfb7dd2196390af.webp)编辑 上面共有三个分组,使用时写上组名,一般格式为:ansible \[组名\] -m \[模块名\] -a \[命令

ansible执行过程

1 加载自己的配置文件,默认/etc/ansible/ansible.cfg

2 加载自己的模块,如commond

3 通过ansible将对应的模块或者命令生成.py文件,并将文件传输到远程服务器

4 给文件增加x权限

5 执行并返回结果

6 删除文件,退出

./elasticsearch

执行结果

黄色:执行成功并且有修改

绿色:执行成功,没有改变

红色:执行失败

ansible模块介绍

commond
复制代码
默认模块,不支持特殊符号,不支持变量
ansible test -m ping 
[root@bogon ~]# ansible test -m ping
192.168.199.155 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
192.168.199.150 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}
代表执行成功,没有任何改变
ansible test -a "systemctl status nginx"
#查看test组中主机的nginx运行情况
shell
复制代码
用shell执行命令,支持特殊符号,重定向符号,变量等操作
[root@bogon ~]# ansible test -m shell  -a "echo 'helloddd' >> /data/a.txt"
192.168.199.155 | CHANGED | rc=0 >>
​
192.168.199.150 | CHANGED | rc=0 >>
​
这里使用commond模块显示黄色且没有报错,但是a.txt文件没有发生改变
[root@bogon ~]# ansible test   -a "echo 'hellodaad' >> /data/a.txt"
192.168.199.155 | CHANGED | rc=0 >>
hellodaad >> /data/a.txt
192.168.199.150 | CHANGED | rc=0 >>
hellodaad >> /data/a.txt
[root@bogon ~]# ansible test -m shell  -a "echo 'helloddd' >> /data/a.txt"
192.168.199.155 | CHANGED | rc=0 >>
​
192.168.199.150 | CHANGED | rc=0 >>
​
​
使用shell模块后修改成功
[root@bogon data]# cat a.txt
hello
helloddd
​
script
复制代码
在远端主机执行本地脚本
在远端执行本地nginx.sh脚本,判断远端主机的nginx服务是否启动

creates表示如果远端主机上有指定的问价,则不执行后面的脚本,如果没有,则执行指定的脚本,如图远端主机都有a.txt文件,所以不执行nginx.sh脚本

copy
复制代码
从本地主机复制文件到远端主机
src 本地文件路径
dest    目标主机路径
mode    设置权限
backup  备份源文件
#把本地的/opt/test.txt文件复制到远端/opt/test.txt中
[root@bogon opt]# ansible test -m copy -a "src=/opt/test.txt dest=/opt/test.txt"
​
#把本地问价中的指定内容复制到远端主机的文件中,内容带上''(单引号)
ansible test -m copy -a "content='6 删除文件' dest=/opt/test.txt"
fetch
复制代码
与copy相反,从远端主机复制文件到本地主机
从远端主机中的复制文件到本地,生成以远端IP为名称的文件夹
[root@bogon opt]# ansible test -m fetch -a "src=/data/a.txt  dest=/opt/"
#结果为
[root@bogon opt]# cat 192.168.199.150/data/a.txt
hello
helloddd
file
复制代码
设置文件属性
path 要设置的文件路径
recurse 递归
state状态:absent(删除) touch(创建) directory(指定创建的是目录)
#在远端主机/opt/创建c.txt文件
[root@bogon opt]# ansible test -m file -a "path=/opt/c.txt state=touch"
#在远端主机/opt/创建/data/目录
[root@bogon opt]# ansible test -m file -a "path=/opt/data/ state=directory"
#在远端主机上床架软链接
[root@bogon opt]# ansible test -m file -a "src=/data/a.txt dest=/data/link-a.txt state=link"
​
unarchive
复制代码
copy=no将远程主机上的压缩包压缩到指定目录下
copy=yes将本地主机上的压缩包传到远端主机上并解压
src 源路径
dest 目标路径
mode 权限
#copy=no,在远端主机上解压压缩包到指定目录下
[root@bogon opt]# ansible test -m unarchive -a "src=/data/test.tar.gz dest=/opt/ copy=no"
#copy=yes 把本地的压缩文件床送到远端主机并解压
[root@bogon opt]# ansible test -m unarchive -a "src=/opt/test.tar.gz dest=/opt/rh/ "
​
archive
复制代码
将远程主机下的文件路径打包
format 打包格式
owner 指定所属者
path: 指定路径
dest: 指定目标文件
#把远程目录下的文件或者目录打包到指定目录下
[root@bogon opt]# ansible test -m archive -a "path=/opt/data/ dest=/opt/a.tar.bz2"
Cron
复制代码
主要修改,添加,删除主机的crontab定时任务
在远端主机上新建定时任务
[root@bogon ~]# ansible test -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 192.168.199.149 &>/dev/null' name="hahha" "
删除任务
ansible websrvs -m cron -a 'state=absent name=hahha'
yum
复制代码
在远端执行yum操作
present 下载
absent  删除
在远端主机上安装httpd服务
ansible websrvs -m yum -a 'name=httpd state=present' 安装
service
复制代码
功能:实现远程管理服务的生命周期
enabled #开机启动 yes|no
name #服务名称,必选项
runlevel #运行级别
state
started
stopped
restarted
reloaded
重启nginx服务
[root@bogon ~]# ansible test -m service  -a "name=nginx state=reloaded"
停止nginx服务
ansible test -m service -a "name=nginx state=stopped"
stystemd
复制代码
与service类似
User
复制代码
User:管理用户
# 关键参数
group # 属组
groups # 附加组
home # 设置家目录
name # 用户名
remove # 删除用户并删除用户的家目录
shell # 用户登录后的shell
system # 系统用户
uid # 用户的id
state #创建或删除
shell #制定用户shell环境
创建用户(自动创建用户组)
ansible test -m user -a "name=test1"
setup
复制代码
用于收集远端主机的信息,如cpu,内存,磁盘
获取远端主机名
[root@bogon ~]# ansible test -m setup -a "filter=ansible_fqdn"
过滤信息
[root@bogon ~]# ansible test -m setup -a "filter=*mb"
firewalld
复制代码
远程管理目标主机的防火墙
开启端口443并且设置为开机启动
[root@bogon ~]# ansible test -m firewalld -a 'port=443/tcp permanent=no state=enabled'

ansible-playbook

复制代码
将多个任务写在一个.yml结尾的文件中,使用ansible-playbiik执行

例一:在远端开mysql服务
[root@bogon ~]# cat test1.yml
---
- hosts: test
  remote_user: root

  tasks:
    - name: start  mysql service
      service: name=mysqld state=started
hosts
复制代码
playbook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中。相当于test组
remote_user
复制代码
可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户

在远端主机上执行任务时时切换到指定用户(用户必须存在且对文件具有一定权限)
[root@bogon ~]# cat test1.yml
---
- hosts: test
  become: yes
  become_user: test2

  tasks:
    - name:  add fiile
      command: echo "h" >> /opt/a.txt
task列表和action组件
复制代码
task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量
[root@bogon ~]# cat test3.yml
---
- hosts: test
  remote_user: root

  tasks:
    - name: install httpd
      yum: name=httpd state=present
案例
复制代码
利用ansible-playboo在远端上安装nginx
[root@bogon ~]# cat test2.yml
---
- hosts: test
  remote_user: root
  tasks:
    - name: add group nginx
      user: name=nginx state=present
    - name: add user nginx
      user: name=nginx state=present group=nginx
    - name: Install Nginx
      yum: name=nginx state=present
    - name: web page
      copy: src=files/index.html dest=/usr/share/nginx/html/index.html
    - name: Start Nginx
      service: name=nginx state=started
变量的使用
复制代码
定义:
	variable=value

通过{{ variable_name }} 调用变量,且变量名前后必须有空格,有时用"{{variable_name }}”才生效
    ansible-playbook –e 选项指定
    ansible-playbook test.yml -e "hosts=www user=xingyun"

系统变量
    主机名相关变量:

        ansible_hostname: 目标主机的短主机名。
        ansible_fqdn: 目标主机的完全限定域名(Fully Qualified Domain Name, FQDN)。
        ansible_nodename: 与 ansible_hostname 类似,提供主机名。
    操作系统和平台信息:

        ansible_os_family: 提供操作系统的家族名称,如Debian、RedHat、Windows等。
        ansible_distribution: 操作系统的具体发行版名称,如Ubuntu、CentOS等。
        ansible_distribution_version: 操作系统发行版的具体版本号。
        ansible_architecture: 主机的架构,如"x86_64"或"arm64"。
    网络信息:

        ansible_default_ipv4.address: 默认第一块网卡的IPv4地址。
        ansible_all_ipv4_addresses: 包含主机所有IPv4地址的列表。
        ansible_all_ipv6_addresses: 包含主机所有IPv6地址的列表。
    用户和组信息:

        ansible_users: 列出目标主机的所有用户账户信息。
        ansible_env.HOME: 当前用户的家目录。
    文件和目录信息:

        ansible_selinux_python_present: 指示目标主机上是否安装了用于SELinux操作的python库。
        服务状态信息:

	使用ansible_service_mgr可以得知目标主机使用的服务管理器类型,如'systemd'、'sysvinit'等。

#使用系统变量新建一个以本地用户名命名的文文件
[root@bogon ~]# cat test1.yml
---
- hosts: test
  remote_user: root
  tasks:
    - name:  add a new file named by user
      file: path=/opt/{{ ansible_nodename }}.txt state=touch


自定义变量
	在主机清单中定义变量
	port是局部变量,port=82是组中的全局变量
	[test]
    192.168.199.150 port=81
    192.168.199.155
    [test:vars]
    port=82
    
    命令行指定变量(优先级最高)
    [root@bogon ~]# ansible-playbook port=83 test1.yml
	
	在yml文件中定义变量
	[root@bogon ~]# cat test3.yml
    ---
    - hosts: test
      remote_user: root
      vars:
        - name1: httpd
        - name2: nginx

      tasks:
        - name: install httpd
          yum: name={{ name1 }} state=present
        - name: install nginx
          yum: name={{ name2 }} state=present
变量的优先级:命令行中的-e > playbook中定义的变量 > 主机清单中定义的变量
模板templates
复制代码
模板是一个文本文件,可以做为生成文件的模版,并且模板文件中还可嵌套jinja语法
template功能:可以根据和参考模块文件,动态生成相类似的配置文件
template文件必须存放于templates目录下,且命名为 .j2 结尾
yaml/yml 文件需和templates目录平级,目录结构如下示例:
./
├── temnginx.yml
└── templates
└── nginx.conf.j2
相关推荐
LunarCod20 分钟前
Ubuntu使用Docker搭建SonarQube企业版(含破解方法)
linux·运维·服务器·ubuntu·docker·开源·sonarqube
什么半岛铁盒38 分钟前
Linux信号的保存
linux·运维·网络
noravinsc1 小时前
国产化中间件 替换 nginx
运维·nginx·中间件
惜.己1 小时前
Linux常用命令(十四)
linux·运维·服务器
linkingvision2 小时前
H5S 视频监控AWS S3 对象存储
linux·运维·aws·视频监控s3对象存储
doupoa2 小时前
Fabric 服务端插件开发简述与聊天事件监听转发
运维·python·fabric
BillKu2 小时前
服务器多JAR程序运行与管理指南
运维·服务器·jar
QQ2740287563 小时前
BlockMesh Ai项目 监控节点部署教程
运维·服务器·web3
南棱笑笑生4 小时前
20250512给NanoPi NEO core开发板在Ubuntu core20.04系统更新boot.img
linux·运维·ubuntu
小锋学长生活大爆炸4 小时前
【教程】Docker更换存储位置
运维·docker·容器