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用户登录。

相关文章
|
2月前
|
数据采集 运维 监控
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
本文系统解析爬虫与自动化核心技术,涵盖HTTP请求、数据解析、分布式架构及反爬策略,结合Scrapy、Selenium等框架实战,助力构建高效、稳定、合规的数据采集系统。
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
|
3月前
|
运维 Linux 网络安全
自动化真能省钱?聊聊运维自动化如何帮企业优化IT成本
自动化真能省钱?聊聊运维自动化如何帮企业优化IT成本
133 4
|
5月前
|
运维 监控 安全
从实践到自动化:现代运维管理的转型与挑战
本文探讨了现代运维管理从传统人工模式向自动化转型的必要性与路径,分析了传统运维的痛点,如效率低、响应慢、依赖经验等问题,并介绍了自动化运维在提升效率、降低成本、增强系统稳定性与安全性方面的优势。结合技术工具与实践案例,文章展示了企业如何通过自动化实现运维升级,推动数字化转型,提升业务竞争力。
|
9月前
|
机器学习/深度学习 人工智能 运维
机器学习+自动化运维:让服务器自己修Bug,运维变轻松!
机器学习+自动化运维:让服务器自己修Bug,运维变轻松!
402 14
|
10月前
|
监控 jenkins 测试技术
Ansible与Jenkins:自动化工具的对比
Ansible和Jenkins是自动化领域的两大巨头。Ansible专注于配置管理和任务自动化,采用无代理架构,使用YAML定义配置,具有幂等性和可扩展性。Jenkins则擅长持续集成和持续交付(CI/CD),支持丰富的插件生态系统,适用于自动化构建、测试和部署。两者各有优势,Ansible适合配置管理与大规模部署,Jenkins则在CI/CD方面表现出色。结合使用可创建更强大的自动化工作流,提升团队生产力和软件质量。选择工具时应根据具体需求决定。
|
11月前
|
机器学习/深度学习 人工智能 运维
基于AI的自动化事件响应:智慧运维新时代
基于AI的自动化事件响应:智慧运维新时代
509 11
|
9月前
|
机器学习/深度学习 人工智能 运维
基于AI的自动化服务器管理:解锁运维的未来
基于AI的自动化服务器管理:解锁运维的未来
863 0
|
运维 Ubuntu 应用服务中间件
自动化运维之路:使用Ansible进行服务器管理
在现代IT基础设施中,自动化运维已成为提高效率和可靠性的关键。本文将引导您通过使用Ansible这一强大的自动化工具来简化日常的服务器管理任务。我们将一起探索如何配置Ansible、编写Playbook以及执行自动化任务,旨在为读者提供一条清晰的路径,从而步入自动化运维的世界。
245 11
|
运维 网络安全 Python
自动化运维:使用Ansible实现批量服务器配置
在快速迭代的IT环境中,高效、可靠的服务器管理变得至关重要。本文将介绍如何使用Ansible这一强大的自动化工具,来简化和加速批量服务器配置过程。我们将从基础开始,逐步深入到更复杂的应用场景,确保即使是新手也能跟上节奏。文章将不包含代码示例,而是通过清晰的步骤和逻辑结构,引导读者理解自动化运维的核心概念及其在实际操作中的应用。

热门文章

最新文章