Ansible自动化运维(二)

简介: Ansible自动化运维

hostname模块

       hostname模块用于管理远程主机上的主机名。

🍤常用参数如下:

name:指明主机名。

[root@ansible ~]# ansible 192.168.1.20 -m hostname -a "name=demo"
192.168.1.20 | CHANGED => {
    "ansible_facts": {
        "ansible_domain": "", 
        "ansible_fqdn": "demo", 
        "ansible_hostname": "demo", 
        "ansible_nodename": "demo", 
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "name": "demo"
}
[root@node1 ~]# hostname                //在node1主机查看
demo

yum模块

       yum模块基于yum机制,对远程主机管理程序包。

🍤常用参数如下:

name:程序包的名称,可以带上版本号。若不指明版本,则默认为最新版本。

state=present|latest|absent:指明对程序包执行的操作,present表示安装程序包,latest表示安装最新版本的程序包,absent表示卸载程序包。

disablerepo:再用yum安装时,临时禁用某个仓库的ID。

enablerepo:再用yum安装时,临时启用某个仓库的ID。

conf_file:yum运行时的配置文件,而不是使用默认的配置文件。

diable_gpg_check=yes|no:其否启用完整性效验功能。

       管理端只是发送yum指令到被管理端,被管理端要存在可用的yum仓库才可以安装成功。

1. [root@ansible ~]# ansible web -m yum -a "name=httpd state=present"
2. ......//因为两台服务器都配置了yum所以安装成功
3. [root@ansible ~]# ssh 192.168.1.20 rpm -qa | grep httpd
4. httpd-tools-2.4.6-97.el7.centos.5.x86_64
5. httpd-2.4.6-97.el7.centos.5.x86_64
6. [root@ansible ~]# ssh 192.168.1.30 rpm -qa | grep httpd
7. httpd-tools-2.4.6-97.el7.centos.5.x86_64
8. httpd-2.4.6-97.el7.centos.5.x86_64

service模块

       servicee模块为用来管理远程主机上的服务的模块。

🍤常用参数如下:

name:被管理的服务器名称。

state=started|stopped|restarted:动作包含启动、关闭、重启。

enabled=yes|no:表示是否设置该服务开机自动启动。

runlevel:如果设定了enabled开机自启动,则要定义在那些运行目标下自动启动。

[root@ansible ~]# ansible web -m service -a "name=httpd state=started enabled=yes"      //启动httpd服务,并设置为开机自启

user模块

       user模块用于管理远程主机上的用户账号。

🍤常用参数如下:

name:必选参数,账号名称。

state=present|absent:创建账号或者删除账号,present表示创建,absent表示删除。

system=yes|no:是否为系统账号。

uid:用户UID。

group:用户的基本组。

groups:用户的附加组。

shell:默认使用的shell。

home:用户的家目录。

move_home=yes|no:如果设置的家目录已经存在,是否将已存在的家目录进行移动。

password:用户的密码,建议使用后加密后的字符串。

comment:用户的注释信息。

remove=yes|no:当state=absent时,是否要删除用户的家目录。

🍤创建用户示例如下:

1. [root@ansible ~]# ansible web -m user -a 'name=user1 system=yes uid=501 group=root groups=sshd shell=/sbin/nologin home=/home/user1 password=user1 comment="testuser"'
2. ......//省略部分内容
3. [root@ansible ~]# ssh 192.168.1.20 tail -1 /etc/passwd
4. user1:x:501:0:testuser:/home/user1:/sbin/nologin
5. [root@ansible ~]# ssh 192.168.1.30 tail -1 /etc/passwd
6. user1:x:501:0:testuser:/home/user1:/sbin/nologin

🍤删除用户及家目录示例如下:

1. [root@ansible ~]# ansible web -m user -a "name=user1 remove=yes state=absent"
2. ......//省略部分内容
3. [root@ansible ~]# ssh 192.168.1.20 tail -1 /etc/passwd
4. apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
5. [root@ansible ~]# ssh 192.168.1.30 tail -1 /etc/passwd
6. apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

playbook配置文件

执行配置文件

       playbook配置文件使用YAML语法,具有简洁明了、结构清晰等特点。playbook配置文件类似于Shell脚本,是一个YAML格式的文件,用于保存针对特定需求的任务列表。YAML语法和其他高级语言类似,其结构通过缩进来展示,通过“-”来代表项,通过冒号“:”来分隔键和值,整个文件以“---”开始并以“...”结束,示例如下。

1. [root@ansible ~]# vim /etc/ansible/hosts            //修改hosts文件
2. [web1]
3. 192.168.1.20
4. [web2]
5. 192.168.1.30
6. [root@ansible ~]# vim /etc/ansible/a.yml            //创建a.yml文件
7. ---
8. - hosts: web1                                       //针对web1的操作
9.   remote_user: root                                 //远端执行用户身份为root
10.   tasks:                                            //任务列表
11.         - name: adduser                             //任务名称
12.           user: name=user2 state=present            //执行user模块,创建用户
13.           tags:                                     //创建tag标签
14.           - aaa                                     //tag标签为aaa
15.         - name: addgroup                            //任务名称
16.           group: name=root system=yes               //执行group模块,创建组
17.           tags:                                     //创建tag标签
18.           - bbb                                     //tag标签为bbb
19. - hosts: web2                                       //针对web2的操作
20.   remote_user: root                                 //远端执行用户身份为root
21.   tasks:                                            //任务列表
22.        - name: copy file to web                     //任务名称
23.          copy: src=/etc/passwd dest=/home           //执行copy模块,复制文件
24.          tags:                                      //创建tag标签
25.                   - ccc                             //tag标签为ccc
26. ...

🍤注意:所有的“-”和“:”都有空格,注意缩进和对齐。

       playbook文件定义的任务需要通过ansible-playbook命令进行调用并执行,ansible-playbook命令用法如下:

ansible-playbook [option] /PATH/TO/PLAYBOOK.yaml

🍤[option]部分功能如下:

--syntax-check:检测yaml文件的语法。

-C(--check):预测试,不会改变目标主机的任何设置。

--list-hosts:列出yaml文件影响的主机列表。

--list-tasks:列出yaml文件的任务列表。

--list-tags:列出yaml文件中的标签。

-t TAGS(--tags=TAGS):表示只执行指定标签的任务。

--skip-tags=SKIP_TAGS:表示出了指定标签的任务,执行其他任务。

--start-at-task=START_AT:从指定的任务开始往下运行。

🍤示例如下:

1. [root@ansible ~]# ansible-playbook --syntax-check /etc/ansible/a.yml            //语法检查
2. 
3. playbook: /etc/ansible/a.yml        //没有报错提示
4. [root@ansible ~]# ansible-playbook -C /etc/ansible/a.yml                        //预测试
5. 
6. PLAY [web1] ***************************************************************************
7. 
8. TASK [Gathering Facts] ****************************************************************
9. ok: [192.168.1.20]
10. 
11. TASK [adduser] ************************************************************************
12. changed: [192.168.1.20]
13. 
14. TASK [addgroup] ***********************************************************************
15. ok: [192.168.1.20]
16. 
17. PLAY [web2] ***************************************************************************
18. 
19. TASK [Gathering Facts] ****************************************************************
20. ok: [192.168.1.30]
21. 
22. TASK [copy file to web] ***************************************************************
23. changed: [192.168.1.30]
24. 
25. PLAY RECAP ****************************************************************************
26. 192.168.1.20               : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
27. 192.168.1.30               : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
28. 
29. [root@ansible ~]# ansible-playbook --list-hosts /etc/ansible/a.yml              //列出主机
30. 
31. playbook: /etc/ansible/a.yml
32. 
33.   play #1 (web1): web1  TAGS: []
34.     pattern: [u'web1']
35.    hosts (1):
36.      192.168.1.20
37. 
38.   play #2 (web2): web2  TAGS: []
39.     pattern: [u'web2']
40.    hosts (1):
41.      192.168.1.30
42. [root@ansible ~]# ansible-playbook --list-tasks /etc/ansible/a.yml              //列出任务列表
43. 
44. playbook: /etc/ansible/a.yml
45. 
46.   play #1 (web1): web1  TAGS: []
47.     tasks:
48.       adduser   TAGS: [aaa]
49.       addgroup  TAGS: [bbb]
50. 
51.   play #2 (web2): web2  TAGS: []
52.     tasks:
53.       copy file to web  TAGS: [ccc]
54. [root@ansible ~]# ansible-playbook --list-tags /etc/ansible/a.yml               //列出标签
55. 
56. playbook: /etc/ansible/a.yml
57. 
58.   play #1 (web1): web1  TAGS: []
59.       TASK TAGS: [aaa, bbb]
60. 
61.   play #2 (web2): web2  TAGS: []
62.       TASK TAGS: [ccc]
63. [root@ansible ~]# ansible-playbook /etc/ansible/a.yml                           //执行任务
64. 
65. PLAY [web1] ***************************************************************************
66. 
67. TASK [Gathering Facts] ****************************************************************
68. ok: [192.168.1.20]
69. 
70. TASK [adduser] ************************************************************************
71. changed: [192.168.1.20]
72. 
73. TASK [addgroup] ***********************************************************************
74. ok: [192.168.1.20]
75. 
76. PLAY [web2] ***************************************************************************
77. 
78. TASK [Gathering Facts] ****************************************************************
79. ok: [192.168.1.30]
80. 
81. TASK [copy file to web] ***************************************************************
82. changed: [192.168.1.30]
83. 
84. PLAY RECAP ****************************************************************************
85. 192.168.1.20               : ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
86. 192.168.1.30               : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
87. 
88. [root@ansible ~]# ssh 192.168.1.20 tail -1 /etc/passwd         //确认结果
89. user2:x:1001:1001::/home/user2:/bin/bash
90. [root@ansible ~]# ssh 192.168.1.30 ls -l /home/passwd
91. -rw-r--r--. 1 root root 2226 8月  11 20:15 /home/passwd

触发器

       需要触发器才能执行的任务,当之前定义在tasks中的任务执行成功后,若希望在此基础上触发其他的任务,这时就需要定义handlers。

handlers触发器具有以下特点。

  1. handlers是Ansible提供的条件机制之一。handlers和task很类似,但是它只在被task通知的时候才会触发执行。
  2. handlers只会在所有任务执行完后执行。而且即使被通知了多次,它也只会执行一次。handlers按照定义的顺序依次执行。

🍤示例如下:

1. [root@ansible ~]# ssh 192.168.1.20 netstat -anpt | grep 80
2. tcp6       0      0 :::80                   :::*                    LISTEN      6987/httpd          
3. [root@ansible ~]# vim /etc/ansible/httpd.yml
4. ---
5. - hosts: web1
6.   remote_user: root
7.   tasks:
8.         - name: aaa
9.           command: sed -i 's/Listen\ 80/Listen\ 8080/g' /etc/httpd/conf/httpd.conf
10.           notify:                               //配置触发条件
11.                 - yy                            //触发器任务名称
12.   handlers:                                     //配置触发器
13.         - name: yy                              //执行触发器名称
14.           service: name=httpd state=restarted   //触发任务重启httpd服务
15. ...
16. 
17. [root@ansible ~]# ansible-playbook /etc/ansible/httpd.yml 
18. 
19. PLAY [web1] ***************************************************************************
20. 
21. TASK [Gathering Facts] ****************************************************************
22. ok: [192.168.1.20]
23. ......//省略部分内容
24. [root@ansible ~]# ssh 192.168.1.20 netstat -anpt | grep 8080            //远端主机已经运行8080端口
25. tcp6       0      0 :::8080                 :::*                    LISTEN      48440/httpd

角色

       多种不同的tasks的文件集中存储在某个目录下,则该目录就是角色。/etc/ansible/roles目录存放着角色,目录下有多个子目录,每个子目录对应一个角色,每个角色也有自己的目录角色。

/etc/ansible/roles/为角色集合,该目录下有自定义的各个子目录:

mariadb:mysql角色。

Apache:httpd角色。

nginx:Nginx角色。

每个角色的定义,以特定的层级目录结构进行组织。以Mariadb为例:

files:存放由copy或script等模块调用的文件。

templates:存放template模块查找所需要的模板文件的目录,如mysql配置文件等模板。

tasks:任务存放的目录。

handlers:存放相关触发路径的目录。

vars:变量存放的目录。

meta:用于存放此角色元数据。

default:默认变量存放的目录,文件中定义了此角色使用的默认变量。

       下面通过一个实例配置数据库角色,要求被管理主机上自动安装Mariadb,安装完成后上传提前准备好的配置文件至远端主机,重启服务,然后新建testdb数据库,并允许test用户对其拥有所有权限。

  • 被管理端配置yum

之前已经配置过了网络源。

  • 配置数据库角色。
1. [root@ansible ~]# mkdir -pv /etc/ansible/roles/mariadb/{files,tasks,handlers}
2. mkdir: 已创建目录 "/etc/ansible/roles/mariadb"
3. mkdir: 已创建目录 "/etc/ansible/roles/mariadb/files"
4. mkdir: 已创建目录 "/etc/ansible/roles/mariadb/tasks"
5. mkdir: 已创建目录 "/etc/ansible/roles/mariadb/handlers"
6. [root@ansible ~]# cd /etc/ansible/roles/mariadb/tasks/
7. [root@ansible tasks]# vim main.yml
8. ---
9. - name: install mariadb
10.   yum: name=mariadb-server state=present
11. - name: move config file
12.   shell: "[ -e /etc/my.cnf ] && mv /etc/my.cnf /etc/my.cnf.bak"
13. - name: provide a new config file
14.   copy: src=my.cnf dest=/etc/my.cnf
15. - name: reload mariadb
16.   shell: systemctl restart mariadb
17. - name: create database testdb
18.   shell: mysql -u root -e "create database testdb;grant all on testdb.* to 'test'@''192.168.1.%' identified by 'test123';flush privileges;"
19.   notify:
20.   - restart mariadb
21. ...
22. [root@ansible tasks]# cd ../handlers/
23. [root@ansible handlers]# vim main.yml
24. ---
25. - name: restart mariadb
26.   service: name=mariadb state=restarted
27. ...
28. [root@ansible handlers]# cd ../files/
29. [root@ansible files]# cp /etc/my.cnf .
30. [root@ansible files]# cd /etc/ansible
31. [root@ansible ansible]# vim mariadb.yml
32. ---
33. - hosts: web1
34.   remote_user: root
35.   roles:
36.   - mariadb
37. ...
38. [root@ansible ansible]# ansible-playbook mariadb.yml
  • 查看1.20主机

       在1.20主机上查看是否已经创建了testdb数据库,并测试以test用户登录。

相关文章
|
19天前
|
运维 应用服务中间件 网络安全
自动化运维的新篇章:使用Ansible进行服务器配置管理
【10月更文挑战第34天】在现代IT基础设施的快速迭代中,自动化运维成为提升效率、确保一致性的关键手段。本文将通过介绍Ansible工具的使用,展示如何实现高效的服务器配置管理。从基础安装到高级应用,我们将一步步揭开自动化运维的神秘面纱,让你轻松掌握这一技术,为你的运维工作带来革命性的变化。
|
14天前
|
运维 应用服务中间件 Linux
自动化运维的利器:Ansible在配置管理中的应用
【10月更文挑战第39天】本文旨在通过深入浅出的方式,向读者展示如何利用Ansible这一强大的自动化工具来优化日常的运维工作。我们将从基础概念讲起,逐步深入到实战操作,不仅涵盖Ansible的核心功能,还会分享一些高级技巧和最佳实践。无论你是初学者还是有经验的运维人员,这篇文章都会为你提供有价值的信息,帮助你提升工作效率。
|
9天前
|
运维 监控 安全
自动化运维的利剑:Ansible在现代IT架构中的应用
在数字化浪潮中,企业对IT系统的敏捷性和可靠性要求日益提高。Ansible,一种简单但强大的自动化运维工具,正成为现代IT架构中不可或缺的一部分。它通过声明式编程语言YAM,简化了系统配置、应用部署和任务自动化的过程,显著提升了运维效率和准确性。本文将深入探讨Ansible的核心特性、应用场景以及如何有效整合进现有IT环境,为读者揭示其在自动化运维中的实用价值和未来发展潜力。
|
17天前
|
运维 Ubuntu 应用服务中间件
自动化运维工具Ansible的实战应用
【10月更文挑战第36天】在现代IT基础设施管理中,自动化运维已成为提升效率、减少人为错误的关键手段。本文通过介绍Ansible这一流行的自动化工具,旨在揭示其在简化日常运维任务中的实际应用价值。文章将围绕Ansible的核心概念、安装配置以及具体使用案例展开,帮助读者构建起自动化运维的初步认识,并激发对更深入内容的学习兴趣。
41 4
|
15天前
|
机器学习/深度学习 数据采集 人工智能
智能运维:从自动化到AIOps的演进与实践####
本文探讨了智能运维(AIOps)的兴起背景、核心组件及其在现代IT运维中的应用。通过对比传统运维模式,阐述了AIOps如何利用机器学习、大数据分析等技术,实现故障预测、根因分析、自动化修复等功能,从而提升系统稳定性和运维效率。文章还深入分析了实施AIOps面临的挑战与解决方案,并展望了其未来发展趋势。 ####
|
16天前
|
运维 安全 应用服务中间件
自动化运维的利剑:Ansible在配置管理中的应用
【10月更文挑战第37天】本文将深入探讨如何利用Ansible简化和自动化复杂的IT基础设施管理任务。我们将通过实际案例,展示如何用Ansible编写可重用的配置代码,以及这些代码如何帮助运维团队提高效率和减少人为错误。文章还将讨论如何构建Ansible playbook来自动部署应用、管理系统更新和执行常规维护任务。准备好深入了解这个强大的工具,让你的运维工作更加轻松吧!
31 2
|
17天前
|
运维 Devops 应用服务中间件
自动化运维的利器:Ansible实战指南
【10月更文挑战第36天】在快速迭代的数字时代,自动化运维成为提升效率、减少错误的关键。Ansible以其简洁性、易用性和强大的功能脱颖而出。本文将带你了解Ansible的核心组件,通过实际案例深入其应用,并探讨如何结合最佳实践优化你的自动化工作流程。无论你是新手还是有经验的运维人员,本指南都将为你提供宝贵的知识和技能。
|
17天前
|
运维 应用服务中间件 Linux
自动化运维:使用Ansible进行批量配置管理
【10月更文挑战第36天】在现代的IT基础设施中,高效和可靠的系统管理变得至关重要。本文将介绍如何使用Ansible这一强大的自动化工具来简化运维任务,包括安装、配置、部署应用程序以及管理系统更新。我们将探讨Ansible的核心概念,并通过实际代码示例展示其应用。通过阅读本文,读者将获得使用Ansible改善日常运维工作流程的实用知识。
|
24天前
|
机器学习/深度学习 数据采集 运维
智能化运维:机器学习在故障预测和自动化响应中的应用
智能化运维:机器学习在故障预测和自动化响应中的应用
49 4
|
22天前
|
运维 负载均衡 Ubuntu
自动化运维的利器:Ansible入门与实践
【10月更文挑战第31天】在当今快速发展的信息技术时代,高效的运维管理成为企业稳定运行的关键。本文将引导读者了解自动化运维工具Ansible的基础概念、安装步骤、基本使用,以及如何通过实际案例掌握其核心功能,从而提升工作效率和系统稳定性。