Ansible运行原理揭秘:怎样用YAML脚本掌控数服务器?

打印 上一主题 下一主题

主题 1511|帖子 1511|积分 4533

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1 Ansible根本架构

1.1 Ansible工作模式

      Ansible是基于模块工作的,自己没有批量摆设的能力,真正具有批量摆设能力的是Ansible所运行的模块,Ansible只是提供一种框架。      
  1.2 Ansible组件

      

  • Ansible:Ansible核心步伐
  • Play books:使命脚本(使命集),编排定义Ansible使命集的设置文件,由Ansible依次实行多个使命,通常是JSON格式的YML文件
  • Host inventory:Ansible管理主机的清单,记录由Ansible管理的主机信息,包括端口、暗码、IP等
  • Modules:核心模块,重要操纵是通过调用核心模块来完成管理使命
  • CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言
  • Connection plugins:基于毗连插件毗连到各个主机上,即Ansible和Host通信使用,默认是使用SSH
  • Plugins:模块功能的增补,如毗连范例插件、循环插件、变量插件等,可借助于插件完成更丰富的功能
  • Playbooks:批量的命令文件
                用户哀求发送给Ansible核心模块,Ansible核心模块通过Host inventory模块寻找需要运行的主机,然后通过Connection plugins毗连远程的主机,并发送命令。Ansible使用插件来毗连每一个被控制端Host,此外,也通过插件来记录日记等信息。    1.3 Ansible生成的重要文件

      /etc/ansible      

  • /etc/ansible/ansible.cfg :设置文件
  • /etc/ansible/hosts :主机库(host inventory),管理被监控的主机
  • /usr/bin/ansible:主步伐
  • /usr/bin/ansible-doc:文档
  • /usr/bin/ansible-playbook:脚本
    2 Ansible使命实行模式

2.1 Ansible使命实行模式

      Ansible使命实行模式分为2种:      

  • ad-hoc模式(点对点模块):使用单个模块,支持批量实行单条命令,相当与在bash中实行一句Shell命
  • playbook模式(脚本模式):Ansible重要的管理方式,通过多个task的集合完成一类功能,可以理解为多个ad-hoc的设置文件
    2.2 Ansible使命实行流程

   
  3 Ansible应用

3.1 定义主机列表(Inventory)

              Ansible重要功能在于批量主机操纵,为了便捷地使用此中的部分主机,可以在inventory中将主机举行分组命名。默认的inventory file为/etc/ansible/hosts。inventory文件可以有多个,也可以通过Dynamic Inventory来动态生成。         Inventory文件格式:      

  • Inventory文件遵循ini文件风格,中括号[]中的字符为组名
  • 可以将同一个主机同时放到不同的组当中
  • 假如主机接纳的是非ssh默认端口时,可以在主机名称之后接纳冒号加详细端标语来注明
  • 假如主机名遵循相似的命名模式,可以使用列表的形式来表现主机名
  • 主机变量可以在Inventory中定义主机时举行添加,便于在playbook中举使用用
   
  1. 示例:
  2. 1.Inventory文件遵循ini文件风格,中括号[]中的字符为组名可以将同一个主机同时放到不同的组当中
  3. [webservers]
  4. node1
  5. [dbservers]
  6. node1
  7. 2.如果主机采用的是非ssh默认端口时,可以在主机名称之后采用冒号加具体端口号来注明
  8. [webservers]
  9. node1:2022
  10. [dbservers]
  11. node1
  12. 2.如果主机名遵循相似的命名模式,可以使用列表的形式来表示主机名
  13. [webservers]
  14. node[1:3]
  15. [dbservers]
  16. node[1:2]
  17. 3.主机变量可以在Inventory中定义主机时进行添加,便于在playbook中进行使用
  18. [webservers]
  19. node1 http_port=80 maxRequestsPerChild=808
  20. node2 http_port=8080 maxRequestsPerChild=909
复制代码
   Inventory参数:Ansible在基于ssh毗连Inventory中指定的远程主机时,可以通过指定参数来指定其交互方式,常用参数如下:
     

  • ansible_ssh_host:远程主机
  • ansible_ssh_user:指定远程主机ssh端口
  • ansible_ssh_pass:毗连远程主机使用的暗码
  • ansible_sudo_pass:sudo暗码,发起使用--ask-sudo-pass命令
  • ansible_connection:指定毗连范例,范例包括:local、ssh、paramiko
  • ansible_shell_type:指定毗连对端的shell范例,默认支持sh
  • ansible_ssh_private_key_file:ssh毗连使用的私钥
  • ansible_python_interpreter:指定对端使用的python编译器路径
   
  1. 示例:
  2. 根据定义的Inventory调用ping检测网络是否可达:
  3. 检测Inventory中定义的所有主机:ansible all -m ping
  4. [root@node2 ~]# ansible all -m ping
  5. 192.168.10.32 | SUCCESS => {
  6.     "ansible_facts": {
  7.         "discovered_interpreter_python": "/usr/bin/python"
  8.     },
  9.     "changed": false,
  10.     "ping": "pong"
  11. }
  12. 192.168.10.30 | SUCCESS => {
  13.     "ansible_facts": {
  14.         "discovered_interpreter_python": "/usr/bin/python"
  15.     },
  16.     "changed": false,
  17.     "ping": "pong"
  18. }
  19. 192.168.10.31 | SUCCESS => {
  20.     "ansible_facts": {
  21.         "discovered_interpreter_python": "/usr/bin/python"
  22.     },
  23.     "changed": false,
  24.     "ping": "pong"
  25. }
  26. [root@node2 ~]#
  27. 检测Inventory中定义的dbservers组的主机:ansible dbservers -m ping
  28. [root@node2 ~]# ansible dbservers -m ping
  29. 192.168.10.30 | SUCCESS => {
  30.     "ansible_facts": {
  31.         "discovered_interpreter_python": "/usr/bin/python"
  32.     },
  33.     "changed": false,
  34.     "ping": "pong"
  35. }
  36. [root@node2 ~]#
  37. 检测指定单台主机:ansible 192.168.10.30 -m ping
  38. [root@node2 ~]# ansible 192.168.10.30 -m ping
  39. 192.168.10.30 | SUCCESS => {
  40.     "ansible_facts": {
  41.         "discovered_interpreter_python": "/usr/bin/python"
  42.     },
  43.     "changed": false,
  44.     "ping": "pong"
  45. }
  46. [root@node2 ~]#
复制代码
3.2 基于ad-hoc模式运行

   Ansible通过ssh实现目标主机的设置管理、应用摆设、使命实行等操纵,故而需要事先设置Ansible端能基于秘钥认证的方式毗连各被管理节点。
  1. 基本语法:
  2. ansible <pattern> -m <module_name> -a <module_arguments> [options]
  3. 解释:
  4. <pattern>:目标主机或主机组,可以是Inventory中的主机名、IP地址、主机组或关键字(如all)
  5. -m <module_name>:指定要使用的模块(如ping、shell、copy等)
  6. -a <module_arguments>:传递给模块的参数
  7. [options]:可选参数,用于控制Ansible行为
复制代码
3.2.1 常用选项

模块
形貌
-i
指定自定义的Inventory文件
--private-key
指定SSH私钥文件
-u
指定SSH用户
-k
提示输入SSH暗码
-K
提示输入become(提权)暗码(如sudo暗码)
-b
使用become(提权)实行使命(如sudo)
--become-user
指定提权后的用户(默认为root)
-v
输出详细信息(-vvv或-vvvv可增长调试信息)
--check
模仿运行(不实际实行任何更改)
--diff
显示文件的差异(适用于文件相干模块,如copy、template)
--ask-pass
提示输入SSH暗码
--limit
限制运行的主机范围(如limit webservers只对webservers组的主机生效)
  1. 示例:使用shell模块检查/etc/passwd文件中是否包含 root
  2. ansible all -m shell -a 'grep root /etc/passwd'
  3. [root@node2 ~]# ansible all -m shell -a 'grep root /etc/passwd'
  4. 192.168.10.30 | CHANGED | rc=0 >>
  5. root:x:0:0:root:/root:/bin/bash
  6. operator:x:11:0:operator:/root:/sbin/nologin
  7. 192.168.10.32 | CHANGED | rc=0 >>
  8. root:x:0:0:root:/root:/bin/bash
  9. operator:x:11:0:operator:/root:/sbin/nologin
  10. 192.168.10.31 | CHANGED | rc=0 >>
  11. root:x:0:0:root:/root:/bin/bash
  12. operator:x:11:0:operator:/root:/sbin/nologin
  13. [root@node2 ~]#
复制代码
3.2.2 常用模块

选项
解释
ping
目标主机连通性测试
command
在远程主机上实行命令,不支持管道
shell
在目标远程主机上调用shell解释器,支持管道命令
copy
复制文件到目标远程服务器主机上,支持设定内容和修改权限
file
创建文件、链接文件以及删除文件等操纵
yum
服务安装
fetch
从远程目标主机复制文件到当地
cron
crontab计划使命管理
service
服务管理
user
用户管理
group
用户组管理
setup
重要是网络信息
script
将当地脚本在目标远端服务器主机上运行
  1. 示例:使用file模块在目标远程主机上创建文件
  2. ansible all -m file -a "path=/tmp/tmp.txt state=touch"
  3. [root@node2 ~]# ansible all -m file -a "path=/tmp/tmp.txt state=touch"
  4. 192.168.10.31 | CHANGED => {
  5.     "ansible_facts": {
  6.         "discovered_interpreter_python": "/usr/bin/python"
  7.     },
  8.     "changed": true,
  9.     "dest": "/tmp/tmp.txt",
  10.     "gid": 0,
  11.     "group": "root",
  12.     "mode": "0644",
  13.     "owner": "root",
  14.     "secontext": "unconfined_u:object_r:user_tmp_t:s0",
  15.     "size": 0,
  16.     "state": "file",
  17.     "uid": 0
  18. }
  19. 192.168.10.32 | CHANGED => {
  20.     "ansible_facts": {
  21.         "discovered_interpreter_python": "/usr/bin/python"
  22.     },
  23.     "changed": true,
  24.     "dest": "/tmp/tmp.txt",
  25.     "gid": 0,
  26.     "group": "root",
  27.     "mode": "0644",
  28.     "owner": "root",
  29.     "size": 0,
  30.     "state": "file",
  31.     "uid": 0
  32. }
  33. 192.168.10.30 | CHANGED => {
  34.     "ansible_facts": {
  35.         "discovered_interpreter_python": "/usr/bin/python"
  36.     },
  37.     "changed": true,
  38.     "dest": "/tmp/tmp.txt",
  39.     "gid": 0,
  40.     "group": "root",
  41.     "mode": "0644",
  42.     "owner": "root",
  43.     "size": 0,
  44.     "state": "file",
  45.     "uid": 0
  46. }
复制代码
3.3 基于playbook模式实行

      Playbook模式是一种通过编写YAML格式的脚本文件(称为 playbook)来定义和实行自动化使命的方式,playbook是由一个或者多个play构成的列表,play重要功能是将事先归并为一组的主机装扮成事先通过task定义好角色,task就是调用的AnsiBle的一个模块(module)。         playbook的构成部分:      

  • hosts:用于指定要实行的指定使命的主机组,其可以是一个或者多个由冒号构成的主机组
  • user:指定远程主机上实行使命的用户,也可以自定sudo的用户
  • variable:用于定义playbook运行时使用的变量
  • tasks:用于定义在远程目标主机上实行的使命列表,包括
                           1)name:使命的名称,发起形貌使命实行步骤                           2)moduleptions:调用Ansible的模块module和传入的参数      

  • handler:用于定义task完成后需要调用的使命,包括
                           1)notify:在每个paly的最后触发,调用在handler中定义的操纵                           2)handler:task的列表   
  1. playbook示例:
  2. ---
  3. - hosts: web  # 目标主机组
  4.   become: yes  # 使用提权(如 sudo)
  5.   tasks:
  6.     - name: Ensure Apache is installed
  7.       yum:
  8.         name: httpd
  9.         state: present
  10.     - name: Ensure Apache is running
  11.       service:
  12.         name: httpd
  13.         state: started
复制代码
3.3.1 playbook核心组件

   1. hosts    
  1. 作用:指定目标主机或主机组(在Inventory)中定义
  2. 示例:
  3. hosts: webserver
复制代码
   2. tasks    
  1. 作用:定义要执行的任务列表
  2. 每个任务包含内容:
  3. name:任务描述(可选,推荐使用)
  4. 模块名称(如yum、copy、service等)
  5. 模块参数
  6. 示例:
  7. tasks:
  8.   - name: Ensure Apache is installed
  9.     yum:
  10.       name: httpd
  11.       state: present
复制代码
3. vars 
  
  1. 作用:定义变量
  2. 示例:
  3. vars:
  4.   http_port: 80
复制代码
4. handlers
  1. 作用:定义处理器,通常用于重启服务
  2. 示例:
  3. handlers:
  4.   - name: Restart Apache
  5.     service:
  6.       name: httpd
  7.       state: restarted
复制代码
   5.  become   
  1. 作用:是否使用提权(如sudo)
  2. 示例:
  3. become: yes
复制代码
3.3.2 playbook的实行

  1. ansible-playbook playbook.yml
复制代码
常用选项:
  
选项
形貌
-i
指定自定义的Inventory文件
--limit
限制运行的主机范围
--check
模仿运行(不实际实行任何更改)
--diff
显示文件的差异(适用于文件相干模块,如copy、template)
--tags
只运行指定标签的使命
--skip-tags
跳过指定标签的使命
-v
输出详细信息(-vvv或-vvvv可增长调试信息)
  3.3.3 playbook高级用法

  1.条件判定
  1. 使用when关键字根据条件执行任务
  2. 示例:
  3. tasks:
  4.   - name: Install Apache on CentOS
  5.     yum:
  6.       name: httpd
  7.       state: present
  8.     when: ansible_os_family == "RedHat"
复制代码
2. 循环
  1. 使用loop关键字实现循环
  2. 示例:
  3. tasks:
  4.   - name: Ensure users are present
  5.     user:
  6.       name: "{{ item }}"
  7.       state: present
  8.     loop:
  9.       - alice
复制代码
3. 模版
  1. 使用template模块生成动态配置文件
  2. 示例:
  3. tasks:
  4.   - name: Configure Apache
  5.     template:
  6.       src: templates/httpd.conf.j2
  7.       dest: /etc/httpd/httpd.conf
复制代码
4. 角色
  1. 将Playbook分解为可重用的角色
  2. 示例:
  3. roles:
  4.   - common
  5.   - webserver
复制代码
3.3.4 案例:安装httpd

  1.创建playbook相干目次
  1. [root@node2 ansible]# mkdir apache-playbook
  2. [root@node2 ansible]# cd apache-playbook
  3. [root@node2 ansible]# mkdir files
  4. [root@node2 ansible]# mkdir templates
复制代码
2.编辑Inventory文件,增长主机组web
  1. [root@node2 ansible]# echo "[web]" >>/etc/ansible/hosts
  2. [root@node2 ansible]# echo "192.168.10.32" >>/etc/ansible/hosts
  3. [root@node2 ansible]#
复制代码
3.创建plalybook.yml文件,增长如下内容
  1. ---
  2. - hosts: web  # 目标主机组
  3.   become: yes  # 使用提权(如 sudo)
  4.   vars:
  5.     http_port: 80  # 定义 HTTP 端口
  6.     html_content: "Hello, Ansible!"  # 定义 HTML 页面内容
  7.   tasks:
  8.     # 1. 安装 Apache
  9.     - name: Ensure Apache is installed
  10.       yum:
  11.         name: httpd
  12.         state: present
  13.     # 2. 配置 Apache
  14.     - name: Configure Apache
  15.       template:
  16.         src: templates/httpd.conf.j2  # 模板文件
  17.         dest: /etc/httpd/conf/httpd.conf  # 目标配置文件
  18.       notify: Restart Apache  # 触发处理器
  19.     # 3. 部署 HTML 页面
  20.     - name: Deploy HTML page
  21.       copy:
  22.         content: "{{ html_content }}"
  23.         dest: /var/www/html/index.html
  24.     # 4. 启动 Apache 并设置开机自启
  25.     - name: Ensure Apache is running and enabled
  26.       service:
  27.         name: httpd
  28.         state: started
  29.         enabled: yes
  30.   handlers:
  31.     # 定义处理器,用于重启 Apache
  32.     - name: Restart Apache
  33.       service:
  34.         name: httpd
  35.         state: restarted
复制代码
4.创建模版文件,在templates目次下创建httpd.conf.j2文件,并增长如下内容
  1. # {{ ansible_managed }} - DO NOT EDIT MANUALLY
  2. Listen {{ http_port }}
  3. <VirtualHost *:{{ http_port }}>
  4.     DocumentRoot "/var/www/html"
  5.     ServerAdmin webmaster@localhost
  6.     ErrorLog /var/log/httpd/error.log
  7.     CustomLog /var/log/httpd/access.log combined
  8. </VirtualHost>
复制代码
5.运行playbook
  1. ansible-playbook -i /etc/ansible/hosts playbook.yml
复制代码
  1. [root@node2 apache-playbook]# ansible-playbook -i /etc/ansible/hosts playbook.yml
  2. PLAY [web] **********************************************************************************************************************************************************************
  3. TASK [Gathering Facts] **********************************************************************************************************************************************************
  4. ok: [192.168.10.32]
  5. TASK [Ensure Apache is installed] ***********************************************************************************************************************************************
  6. ok: [192.168.10.32]
  7. TASK [Configure Apache] *********************************************************************************************************************************************************
  8. ok: [192.168.10.32]
  9. TASK [Deploy HTML page] *********************************************************************************************************************************************************
  10. ok: [192.168.10.32]
  11. TASK [Ensure Apache is running and enabled] *************************************************************************************************************************************
  12. ok: [192.168.10.32]
  13. PLAY RECAP **********************************************************************************************************************************************************************
  14. 192.168.10.32              : ok=5    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
  15. [root@node2 apache-playbook]#
复制代码
6.验证效果
  1. [root@node2 apache-playbook]# curl http://192.168.10.30
  2. Hello, Ansible!
  3. [root@node2 apache-playbook]#
复制代码
 


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

干翻全岛蛙蛙

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表