网站首页 > 技术文章 正文
什么是Ansible?
Ansible是一个开源软件工具,可实现自动执行软件安装及配置,配置管理和应用程序部署。
Ansible的优点
- 无代理
客户端上没有要与服务器通信的软件或代理。直接通过SSH机制连接服务器
- 重复部署
无论你调用该操作多少次,结果都是一样的。
- 简单且可扩展
Ansible是用Python编写的,并将YAML用于编写playbook,这两门语言都被认为是相对其他开发语言最容易学习和入门的。
Ansible安装配置
#Ubuntu/Debian sudo apt-get install ansible # CentOS sudo yum install ansible #Mac-OS brew install ansible
Ansible架构和组件
- 模块(Modules)
在服务器上执行程序安装,例如,
一般是运行此命令,手动安装:
sudo apt-get install htop
而我们可以通过使用apt模块来安装htop
- name:Install htop apt:name = htop
使用模块可以让你知道是否已安装。
- 插件(Plugins)
插件是增强Ansible的核心功能。Ansible自带了很多非常方便的插件,你可以很轻松的编写自己的插件。
- 主机列表(Host Inventories)
要提供主机列表,我们需要提供 inventory 。这是配置主机文件的方式。
以最简单的方式,我们的主机文件可以包含以下这一行:
35.178.45.231 ansible_ssh_user = ubuntu
- 剧本(Playbook)
Ansible playbook是一种以脚本方式将命令发送到远程服务器的方法。你可以通过将脚本传递到一个或多个服务器来配置整个复杂的环境,而不必单独使用Ansible命令经过命令行远程配置服务器。
- 组变量(group_vars)
该文件包含一组或多组变量,例如db用户名和密码。
db_user: ubuntu db_password: 123456
- 角色(roles)
roles是将多个tasks合并一起执行的方式,可以通过干净清晰的目录结构以非常有效的方式进行自动化,也有利于配置管理
- 处理者(handlers)
handlers是tasks的列表,与常规tasks没有什么实质的不同,它们由全局唯一名称引用,并由通知程序通知。如果没有任何通知处理程序,它将不会运行。无论有多少个tasks通知handlers,在特定playbook中完成所有tasks后,它将仅运行一次。
- Tags
如果有大型playbook,则可以在不运行整个playbook的情况下运行特定部分的配置可能会很有用。增加了很大的灵活性。
实例:安装程序,运行的步骤
- 构建主机和ansible.cfg
- 在Ansible中定义Roles
- 在Ansible中定义Handlers
- 安装PHP模块
- 安装Nginx
- 添加Nginx默认配置文件
- 添加vars以管理变量
- 创建MySql数据库,用户名和密码
- 创建playbook
- 执行playbook安装部署
- 构建主机和ansible.cfg
hosts.ini
[test] #your instance IP 127.0.0.39
ansible.cfg
[defaults] hostfile = hosts.ini # configure log dir log_path= logs/ansible-log.log
- 在Ansible中定义Roles
使用Ping模块来验证主机是否正常工作,然后我将更新所有软件包并安装两个模块git和htop
--- - ping: ~ ### - name: Update apt packages apt: update_cache: yes ## - name: Install GIT VCS apt: name: git state: latest ## - name: Install htop apt: name=htop
- 在Ansible中定义Handlers
--- - name: Restart PHP-FPM service: name: php{{php_version}}-fpm state: restarted #### - name: Restart Nginx service: name: nginx state: restarted
- 安装Php模块
- 要在ansible中触发handlers,我们必须使用notify:重新启动PHP-FPM,handlers名称应该是唯一的,例如,如果您想仅从playbook中运行此任务,则只能通过使用 --tags =“ php”运行命令,它将仅执行此任务
--- - name: Install PHP {{php_version}} PPA Repo apt_repository: repo: 'ppa:ondrej/php' tags: - php ## - name: Install PHP {{php_version}} apt: name=php{{php_version}} state=latest ## - name: Install PHP packages become: true apt: name: "{{ item }}" state: latest with_items: - php{{php_version}}-curl - php{{php_version}}-fpm - php{{php_version}}-intl - php{{php_version}}-mysql - php{{php_version}}-xml - php{{php_version}}-mbstring notify: Restart PHP-FPM tags: - php
- 安装Nginx模块
- name: Install Nginx web server apt: name: nginx state: latest notify: Restart Nginx tags: - nginx ### - name: Update nginx config files become: true template: src: templates/nginx.conf dest: "/etc/nginx/sites-available/default" tags: - nginx notify: Restart Nginx ### - name: link nginx config become: true file: src: "/etc/nginx/sites-available/default" dest: "/etc/nginx/sites-enabled/default" state: link tags: - nginx notify: Restart Nginx
- 添加nginx默认配置文件
server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; server_name {{ server_name }}; root {{ app_work_dir }}public; location / { try_files $uri $uri/ /index.php?$args; index index.php index.html index.htm; } if (!-d $request_filename) { rewrite ^/(.*)/$ /$1 permanent; } location = /favicon.ico { access_log off; log_not_found off; } location ~ \.php$ { try_files $uri $uri/ /index.php?$args; index index.php index.html index.htm; fastcgi_pass unix:/var/run/php/php{{php_version}}-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME {{app_work_dir}}public$fastcgi_script_name; fastcgi_param APPLICATION_ENV testing; fastcgi_param PATH /usr/bin:/bin:/usr/sbin:/sbin; fastcgi_intercept_errors on; include fastcgi_params; } }
- 添加vars以管理变量
vars.yml
注:可以使用ansible-vault加密和解密vars
--- ##@ref https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html#variables-and-vaults ansible_ssh_user: "ubuntu" current_user: "ubuntu" server_name: "app_name" repo_git_url: "app_github_url" ansible_ssh_private_key_file: "ssh_dir" php_version: 7.2 app_work_dir: /var/www/app_name/ #mysql config mysql_host: "mysql_host" mysql_db: app_name mysql_user: sql_user mysql_pass: sql_pass #other config cache_driver: file session_driver: file app_env: production app_debug: false app_key: "your_app_key" app_name: "app_name" app_url: "your_app_url"
- 创建MySql数据库,用户名和密码
- mysql_user: name: "{{mysql_user}}" password: "{{mysql_pass}}" priv: '*.*:ALL' state: present tags: - mysql-db ## - name: Create APP DB database mysql_db: name="{{mysql_db}}" state=present login_user="{{mysql_user}}" login_password="{{mysql_pass}}"
- 创建playbook
将test定义为该playbook的主机,而sudo yes则使您能够以sudo用户身份执行命令,我们有vars_files存储我们的vars,我们有一组roles,每个role执行特定task,最后有handlers引入所有项目的handler
--- - hosts: test #common options between modules sudo: yes gather_facts: no vars_files: - ./group_vars/vars.yml roles: - misc - php - mysql - redis - nginx - bootstrap-app - code-deploy ### handlers: - include: handlers/main.yml
- 执行playbook安装部署
#ansible-playbook playbookName ansible-playbook code-deploy.yml# run with specific tags ansible-playbook playbook.yml --tags="env-files,php"
- 完整的目录结构
├── ansible.cfg ├── code-deploy.yml ├── files │ └── dump.sql ├── group_vars │ └── vars.yml ├── handlers │ └── main.yml ├── hosts.ini ├── logs │ └── ansible-log.log ├── roles │ ├── bootstrap-app │ │ └── tasks │ │ └── main.yml │ ├── code-deploy │ │ ├── tasks │ │ │ ├── config-files.yml │ │ │ └── main.yml │ │ └── templates │ │ └── env.conf │ ├── misc │ │ └── tasks │ │ └── main.yml │ ├── mysql │ │ └── tasks │ │ ├── config.yml │ │ └── main.yml │ ├── nginx │ │ ├── tasks │ │ │ └── main.yml │ │ └── templates │ │ └── nginx.conf │ ├── php │ │ └── tasks │ │ └── main.yml │ └── redis │ └── tasks │ └── main.yml ├── scripts │ ├── install_composer.sh │ └── startup.sh └── site.yml
参考文献
https://ansible-tran.readthedocs.io/en/latest/
【特别声明】转载或以其他方式使用本网站内容,请注明出处。
- 上一篇: 一文带你了解Ansible
- 下一篇: 「Ansible」3个让Ansible性能飞起的简单优化方案
猜你喜欢
- 2024-12-01 Ansible的原理与配置
- 2024-12-01 Ansible系列教程-playbook详解(三)
- 2024-12-01 prometheus实战之一:用ansible部署
- 2024-12-01 ansible快速入门手册
- 2024-12-01 学习下运维自动化工具ansible
- 2024-12-01 Ansible 批量100台服务器添加 Crontab
- 2024-12-01 利用Ansible自动化工具对多台linuxz主机配置网卡文件
- 2024-12-01 如何在 Rocky Linux 8 上安装 Ansible 自动化工具?
- 2024-12-01 Ansible自动化部署利器的实战运用
- 2024-12-01 Ansible自动化运维
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)