Ansible-B站.md
一、Ansible概述
1. IT自动化的好处
-
团队影响:
节省时间,提高效率
消除重复工作
更少错误风险
改善协作和工作满意度 -
企业影响:
客服复杂性
更多创新资源
加强问责制和合规性
2. Ansible是什么
-
简单-减少学习成本
易读的描述语言
无需特殊编码技能
任务按顺序执行 -
强大-协调应用程序声明周期
应用部署
配置管理
工作流程编排 -
无代理-可预测,可靠和安全
无代理架构
使用OpenSSH通信
没有代理维护成本 -
Ansible架构
二、Ansible 安装配置
- yum -y install ansible
- ansible --help
- vim /etc/ansible/hosts
- [webservers]#要操作的主机清单
- 192.168.0.12 ansible_host_user=root ansible_host_pass=123.com
- 192.168.0.13 ansible_host_user=root ansible_host_pass=123.com
- ansible webservers -a "df -h"
错误如下:没权限permission denied
- vim /etc/ansible/ansible.cfg
- :/check# 搜索取消以下注释
- host_key_checking=False
报错如下:
- 解决
- vim /etc/ansible/hosts
- [webservers]#要操作的主机清单:因为是ssh通信,所以修改如下
- 192.168.0.12 ansible_ssh_user=root ansible_ssh_pass=123.com
- 192.168.0.13 ansible_ssh_user=root ansible_ssh_pass=123.com
- # 分别执行ansible查看硬盘空间和内存
- ansible webservers -a "df -h"
- ansible webservers -a "free -m"
1. ansible 使用环境要求
2. 三种安装方式
3. 配置文件
4. 典型的网络架构
5. inventory 主机清单(主机]主机组和变量)
5-1. 主机和主机组
- #未分组的主机需要用 -all 参数
- ansible all -a "df -h"
5-2. 变量
- 主机变量
- 主机组变量写法
- [webservices:vars]
- #即把以下变量应用到webservices主机组优先级小于主机变量上着覆盖此处。
- http_port=8080
- server_name=www.ctnrs.com
- #主机组变量yml写法:需要删除上面文件的配置
- vim /etc/ansible/group_vars/webservers.yml
- http_port: 8080
- server_name: www.ctnrs.com
三、Ad-hoc命令模式
1. 命令行常用选项
- ansible webservers -m shell -vvv -a "echo 123 >> /tmp/123"
2. SSH 密码认证
即:
[webservers]#要操作的主机清单:因为是ssh通信,所以修改如下
192.168.0.12 ansible_ssh_user=root ansible_ssh_pass=123.com
3. SSH 秘钥对认证
- [webservers]#要操作的主机清单:因为是ssh通信,所以修改如下
- 192.168.0.12 ansible_ssh_user=root ansible_ssh_key=/root/.ssh/id_rsa
四、Ansible常用模块
1. 常用模块
- 执行shell命令(command和shell)
- 文件传输copy和file
- 管理软件包yum
- 用户和组user
- 从源代码管理系统部署git
- 管理服务service
- 收集目标主机信息(setup)
2. shell模块和sudo使用
- ansible webservers -a "pwd" -u user -k #没有配置面交互需要-k指定密码。
- #配置好sudo权限后
- ansible webservers -m shell -a "ls /root" -u user -k --become --become-user root --ask-become-pass # -k是user密码 --ask是root(提权用户密码)
3. copy|file|yum|user 模块
- #copy模块
- ansible webservers -m copy -a "src=nginx-1.15.3.tar.gz dest=/tmp" -u root
- #file模块是在目标主机创建文件:创建目录
- ansible webservers -m file -a "dest=/tmp/abc state=directory mode=600" -u root
- ##递归删除目录|文件
- ansible webservers -m file -a "dest=/tmp/abc state=absent mode=600" -u root
- #yum模块
- ansible webservers -m yum -a "name=memcached state=present" -u root
- ## 卸载
- ansible webservers -m yum -a "name=memcached state=absent" -u root
- #user模块:创建用户指定密码
- ansible all -m user -a "name=foo password=123.com" -u root
- ## 删除用户
- ansible all -m user -a "name=foo state=absent" -u root
4. git|service|setup 模块
- # 先所有节点安装git
- # 使用git命令源码安装
- ansible webservers -m git -a "repo=https://github.com/ansible/ansible.git dest=/tmp/ansible" -u root
- #service模块:启动服务
- ansible webservers -m service -a "name=memcached state=started" -u root
- #3 加入自启动
- ansible webservers -m service -a "name=memcached enable=true" -u root
- #setup
- ansible webservices -m setup -a "filter=ansible_nodename"
- ansible webservices -m setup -a "filter=ansible_*_mb"
五、Playbook:剧本基本使用
- playbook的好处
- 认识一下playbook(自动部署nginx)
- yaml语法
- playbook文件结构
- 在变更时执行操作(handlers)
- 任务控制(tags)
- playbook文件调试
- 案例:自动部署Tomcat
1. 好处
- 易读的编排语言
- 适合配置管理和应用部署
- 非常适合部署复杂的工作
2. nginx部署
步骤都是一个个task
- #检查yml文件语法是否正确
- ansible-playbook nginx.yml --syntax-check
- #安装nginx
- ansible-playbook nginx.yml
3. yaml语法和playbook结构
3-1. yaml语法
- 缩进标识层级关系
- 不支持tab键缩进,使用空格缩进
- 通常开头缩进2个空格
- 字符后做进一个空格,如冒号,逗号
- "---" 标识yaml个是,一个文件的开始
- "#" 注释
一个文件通常一个play如nginx的安装所有task就是一个play,只不过nginx.yml文件没写name: playname字段。
如下:一个文件可以两个play;task也可以定义name属性
4. handlers:处理器
5. 任务控制tags:可以控制哪个任务执行哪个不执行
6. playbook文件调试
- #语法检查
- ansible-playbook nginx.yml --syntax-check
- #debug调试:如下图
7. 自动部署tomcat案例
- #四个步骤1.下载jdk2.下载tocat3.解压tomcat4.启动
- - hosts: webservers
- gather_facts: no
- vars:
- tomcat_version: 8.5.34
- tomcat_install_dir: /usr/local
- tasks:
- - name: Install jdk1.8
- yum: name=java-1.8.0-openjdk state=present
- - name: Download tomcat
- get_url: url=http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v{{ tomcat_version }}/bin/apache-tomcat-{{ tomcat_version }}.tar.gz dest=/tmp
- - name: Unarchive tomcat-{{ tomcat_version }}.tar.gz
- unarchive:
- src: /tmp/tomcat-{{ tomcat_version }}.tar.gz
- dest: "{{ tomcat_install_dir }}"
- copy: no
- - name: Start tomcat
- shell: cd {{ tomcat_install_dir }} && mv apache-tomcat-{{ tomcat_version }} tomcat8 && cd tomcat8/bin && nohup ./startup.sh &
六、Playbooke定义变量与使用
- 命令行:
- 在Inventory中定义:/etc/ansible/hosts
- 在playbook中定义
- 在role中定义
- 注册变量(register)
- 系统信息变量(facts)
1. 命令行:
- - hosts: webservers
- gather_facts: no
- remote_users: root
-
- tasks:
- - name: test var
- debug: msg="{{work_dir}}"
- ansible-playbook var.yml -e work_dir=/usr/local
2. playbook:
- - hosts: webservers
- gather_facts: no
- remote_users: root
- vars:
- - work_dir: /usr/local
- - nginx_version: 1.16
- tasks:
- - name: install nginx
- debug: msg="{{work_dir}}/nginx{{nginx_version}}"
3. register:把某一个任务结果注册成一个变量
- - hosts: webservers
- gather_facts: no
- remote_users: root
- vars:
- - work_dir: /usr/local
- - nginx_version: 1.16
- tasks:
- - name: register var
- command: date +"%F_%T"
- register: datetime
- - name: touch file
- debug: {{datetime}}
- file: dest=/tmp/r_{{datetime.stdout}} state=touch #使用ansible的file模块
4. facts:
- - hosts: webservers
- gather_facts: yes
- remote_users: root
- vars:
- - work_dir: /usr/local
- - nginx_version: 1.16
- tasks:
- - name: touch file
- file: dest=/tmp/r_{{ansible_hostname}} state=touch #使用ansible的file模块
七、Playbook 文件复用
- include & import 区别
- import_playbook
- include_tasks
- import_tasks
1. include*(动态):运行时导入
- --list-tags 不会显示到输出
- 不能使用notify触发来自include*内处理程序名称(handlers)
2. import*(静态):在playbook解析时预先导入
- 不能与循环一起使用
- 将变量用于目标文件或角色名称时,不能使用inventory中的变量
3. import_playbook:
4. include_tasks|import_tasks:
八、Playbook 流程控制
1. 条件:不同操作系统安装不同软件包
2. 循环
demo2:批量创建用户并加入nginx组中
九、Playbook 魔板(jinja2:语法类似php)
1. 条件和循环
可以把yml的变量值传到jinja2的文件变量中。
2. 案例:管理nginx配置文件
十、角色
- roles目录结构
- roles基本使用
- 案例:部署LNMP网站平台
1. roles目录结构
参考案例:https://github.com/ansible/ansible-examples
2. roles基本使用
实操截图:
每个角色的tasks目录下必须有main.yml入口。
3. 案例:部署LNMP网站平台
网站架构:php-fpm相当于tomcat
amsible文件结构:nginx采用编译安装方式
- #vim group_vars/all
- # Nginx
- nginx_version: 1.15.3
- http_port: 80
- server_name: wp.ctnrs.com #虚拟主机
- # PHP
- php_version: 5.6.38
- # Wordpress
- wp_version: 4.9.4
- db_host: 192.168.0.12
- db_port: 3306
- wp_db_name: wp
- wp_db_user: wp
- wp_db_password: MyNewPass4!
- #vim hosts
- 192.168.0.14
- #vim site.yml
- - name: Install Nginx,PHP-FPM and Wordpress
- hosts: webservers
- remote_user: root
- roles:
- - role: common
- - role: nginx
- tags: ["nginx"]
- - role: php
- tags: ["php"]
- - role: wordpress
- tags: ["wp"]
4. common
- #vim roles/common/tasks/main.yml
- - name: Install deps
- yum: name={{ item }} state=present
- with_items:
- - gcc
- - make
- - zlib-devel
- - openssl-devel
- - pcre-devel
5. role- nginx
- ls roles/nginx/files/
- nginx-1.15.3.tar.gz nginx.conf nginx.service
- #vim roles/nginx/files/service
- [Unit]
- Description=The NGINX HTTP AND REVERSE PROXY SERVER
- After=syslog.target network.target remote-fs.target nss-lookup.target
- [Service]
- Type=forking
- PIDFile=/var/run/nginx.pid
- ExecStartPre=/usr/local/nginx/sbin/nginx -t
- ExecStart=/usr/local/nginx/sbin/nginx
- ExecReload=/urs/local/nginx/sbin/nginx -s reload
- ExecStop=/bin/kill -s QUIT $MAINPID
- [Install]
- WantedBy=multi-useer.target
- #vim roles/nginx/handlers/main.yml
- - name: reload nginx
- service: name=nginx state=reloaded
- #vim roles/nginx/tasks/main.yml
- - name: Copy nginx source pkg
- #get_url: url=http://nginx.org/download/nginx-{{ nginx_version }}.tar.gz dest=/tmp/nginx-{{ nginx_version }}.tar.gz
- copy: serc=nginx-{{ nginx_version }}.tar.gz dest=/tmp/
- - name: Install nginx
- sehll: cd /tmp && tar zxf nginx-{{ nginx_version }}.tar.gz && cd nginx-{{ nginx_version }} && ./configure --prefix=/usr/local/nginx --user=nobody --group=nobody --with-http_ssl_module --with-http_stub_status_module --with-stream=dynamic && make && make install
- - name: mkdir /usr/local/nginx/conf/vhost
- file: dest=/usr/local/nginx/conf/vhost state=directory
- - name: Copy nginx master configuration file
- copy: src=nginx.conf dest=/usr/local/nginx/conf/
- notify: reload nginx
- - name: Copy nginx configuration for wordpress
- template: src=wordpress.conf dest=/usr/local/nginx/conf/vhost/
- notify: reload nginx
- - name: Copy nginx systemctl service
- copy: src=nginx.service dest=/usr/lib/systemd/system/
- - name: systemctl start service
- service: name=nginx state=started enabled=yes
- #vim roles/nginx/templates/wordpress.conf 如下:
6. role- php
- ls roles/php/files/
- php-5.6.38.tar.gz php-fpm.conf php-fpm.service php.ini
- #vim roles/php/handlers/main.yml
- - name: restart php-fpm
- service: name=php-fpm state=restarted
- # vim roles/php/tasks/main.yml #编译安装php
- - name: Install php deps
- yum: name={{ item }} state=present
- with_item:
- - gd-deve
- - libxml2-devel
- - libcurl-devel
- - libjped-devel
- - libpng-devel
- - name: Copy php source pkg
- #get_url: url=http://docs.php.net/distributions/php-{{ php_version }}.tar.gz dest=/tmp/{{ php_version }}.tar.gz
- copy: src=php-{{ php_version }}.tar.gz dest=/tmp
- - name: Install php
- shell: cd /tmp && tar zxf php-{{ php_version }}.tar.gz && cd php-{{ php_version }} && ./configuration --prefix=/usrlocal/php --with-config-file-paht=/usr/local/php/etc --with-mysql --with-mysqli --with-openssl --with-zlib --with-curl --with-gd --with-jpeg-dir --with-png-dir --with-iconv --enable-fpm --enable-zip --enable0mbstring && make -j 4 && make install
- - name: Copy php configuration file
- copy: src=php.ini dest=/usr/local/php/etc/
- notify: restart php-fpm
- - name: Copy php service
- copy: src=php-fpm.service dest=/usr/lib/systemd/system/
- - name: start php-fpm
- service: name=php-fpm state=started enable=yes
7. role-wordpress
- ls roles/wordpress/
- tasks templates
- #vim roles/wordpress/tasks/main.yml
- - name: Download wordpress
- get_url: url=https://cn.wordpress.org/wordpress-{{ wp_version }}-zh_CN.tar.gz dest=/tmp/wordpress-{{ wp_version }}-zh_CN.tar.gz
- - name: Extract archive
- unarchive: src/wordpress-{{ wp_version }}-zh_CN.tar.gz dest=/usr/local/nginx/html copy=no
- - name: Copy wordpress config file
- template: src=wp-config.php dest=/usr/local/nginx/html/wordpress
- - name: Change ownership of Wordpress Installation
- file: path=/usr/local/nginx/html/wordpress owner=nobody group=nobody state=directory recurse=yes
- #vim roles/wordpress/templates/wp-config.php
8. 检查语法部署
- #检查
- ansible-playbook -i hosts site.yml --syntax-check
- #安装
- ansible-playbook -i hosts site.yml
nginx,php如果报下面错误说明启动报错
重新停掉服务systemctl daemon-reload即可;然后根据失败的task的tags重新执行安装即可
money怎么来?