Ansible-B站.md

一、Ansible概述

1. IT自动化的好处

  1. 团队影响:
    节省时间,提高效率
    消除重复工作
    更少错误风险
    改善协作和工作满意度

  2. 企业影响:
    客服复杂性
    更多创新资源
    加强问责制和合规性

2. Ansible是什么

  1. 简单-减少学习成本
    易读的描述语言
    无需特殊编码技能
    任务按顺序执行

  2. 强大-协调应用程序声明周期
    应用部署
    配置管理
    工作流程编排

  3. 无代理-可预测,可靠和安全
    无代理架构
    使用OpenSSH通信
    没有代理维护成本

  4. Ansible架构

chrome_1lZUqXoeZB.png
chrome_1lZUqXoeZB.png

二、Ansible 安装配置

  1. yum -y install ansible 
  2. ansible --help 
  3. vim /etc/ansible/hosts 
  4.  
  5. [webservers]#要操作的主机清单 
  6. 192.168.0.12 ansible_host_user=root ansible_host_pass=123.com 
  7. 192.168.0.13 ansible_host_user=root ansible_host_pass=123.com 
  1. ansible webservers -a "df -h" 

错误如下:没权限permission denied
chrome_9Zu8MnJxaU.png

  1. vim /etc/ansible/ansible.cfg 
  2. :/check# 搜索取消以下注释 
  3. host_key_checking=False 

报错如下:
chrome_PcAe8V8Cm7.png

  • 解决
  1.  
  2. vim /etc/ansible/hosts 
  3.  
  4. [webservers]#要操作的主机清单:因为是ssh通信,所以修改如下 
  5. 192.168.0.12 ansible_ssh_user=root ansible_ssh_pass=123.com 
  6. 192.168.0.13 ansible_ssh_user=root ansible_ssh_pass=123.com 
  7.  
  8. # 分别执行ansible查看硬盘空间和内存 
  9. ansible webservers -a "df -h" 
  10. ansible webservers -a "free -m" 

1. ansible 使用环境要求

chrome_wn9WeyuJ0k.png
chrome_wn9WeyuJ0k.png

2. 三种安装方式

chrome_fwb25rnafP.png
chrome_fwb25rnafP.png

3. 配置文件

chrome_wuUHTjUEwG.png
chrome_wuUHTjUEwG.png

4. 典型的网络架构

chrome_eVJPYKsMqB.png
chrome_eVJPYKsMqB.png

5. inventory 主机清单(主机]主机组和变量)

5-1. 主机和主机组

chrome_NodbPFrmYG.png
chrome_NodbPFrmYG.png

  1. #未分组的主机需要用 -all 参数 
  2. ansible all -a "df -h" 

5-2. 变量

  • 主机变量

chrome_NH2cwk8bM2.png
chrome_NH2cwk8bM2.png

  • 主机组变量写法
  1. [webservices:vars] 
  2. #即把以下变量应用到webservices主机组优先级小于主机变量上着覆盖此处。 
  3. http_port=8080 
  4. server_name=www.ctnrs.com 
  1. #主机组变量yml写法:需要删除上面文件的配置 
  2. vim /etc/ansible/group_vars/webservers.yml 
  3. http_port: 8080 
  4. server_name: www.ctnrs.com 

三、Ad-hoc命令模式

1. 命令行常用选项

chrome_0iMqlLEwwF.png
chrome_0iMqlLEwwF.png

  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 秘钥对认证

  1. [webservers]#要操作的主机清单:因为是ssh通信,所以修改如下 
  2. 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使用

  1. ansible webservers -a "pwd" -u user -k #没有配置面交互需要-k指定密码。 
  2. #配置好sudo权限后 
  3. 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 模块

  1. #copy模块 
  2. ansible webservers -m copy -a "src=nginx-1.15.3.tar.gz dest=/tmp" -u root 
  3. #file模块是在目标主机创建文件:创建目录 
  4. ansible webservers -m file -a "dest=/tmp/abc state=directory mode=600" -u root 
  5. ##递归删除目录|文件 
  6. ansible webservers -m file -a "dest=/tmp/abc state=absent mode=600" -u root 
  7. #yum模块 
  8. ansible webservers -m yum -a "name=memcached state=present" -u root 
  9. ## 卸载 
  10. ansible webservers -m yum -a "name=memcached state=absent" -u root 
  11. #user模块:创建用户指定密码 
  12. ansible all -m user -a "name=foo password=123.com" -u root 
  13. ## 删除用户  
  14. ansible all -m user -a "name=foo state=absent" -u root 

4. git|service|setup 模块

  1. # 先所有节点安装git 
  2. # 使用git命令源码安装 
  3. ansible webservers -m git -a "repo=https://github.com/ansible/ansible.git dest=/tmp/ansible" -u root 
  4. #service模块:启动服务 
  5. ansible webservers -m service -a "name=memcached state=started" -u root 
  6. #3 加入自启动 
  7. ansible webservers -m service -a "name=memcached enable=true" -u root 
  8. #setup 
  9. ansible webservices -m setup -a "filter=ansible_nodename" 
  10. ansible webservices -m setup -a "filter=ansible_*_mb" 

五、Playbook:剧本基本使用

  • playbook的好处
  • 认识一下playbook(自动部署nginx)
  • yaml语法
  • playbook文件结构
  • 在变更时执行操作(handlers)
  • 任务控制(tags)
  • playbook文件调试
  • 案例:自动部署Tomcat

1. 好处

  • 易读的编排语言
  • 适合配置管理和应用部署
  • 非常适合部署复杂的工作

2. nginx部署

步骤都是一个个task

chrome_j9kDen5UUB.png
chrome_j9kDen5UUB.png

  1. #检查yml文件语法是否正确 
  2. ansible-playbook nginx.yml --syntax-check 
  3. #安装nginx 
  4. ansible-playbook nginx.yml 

3. yaml语法和playbook结构

3-1. yaml语法

  • 缩进标识层级关系
  • 不支持tab键缩进,使用空格缩进
  • 通常开头缩进2个空格
  • 字符后做进一个空格,如冒号,逗号
  • "---" 标识yaml个是,一个文件的开始
  • "#" 注释

一个文件通常一个play如nginx的安装所有task就是一个play,只不过nginx.yml文件没写name: playname字段。
如下:一个文件可以两个play;task也可以定义name属性
chrome_VTcVVDV9hI.png

4. handlers:处理器

chrome_3HsLYhY9qn.png
chrome_3HsLYhY9qn.png

chrome_HiItdgRduX.png

5. 任务控制tags:可以控制哪个任务执行哪个不执行

chrome_y4gsLmcVXH.png
chrome_y4gsLmcVXH.png

6. playbook文件调试

  1. #语法检查 
  2. ansible-playbook nginx.yml --syntax-check 
  3. #debug调试:如下图 

chrome_xDDbeCR4j8.png
chrome_xDDbeCR4j8.png

7. 自动部署tomcat案例

  1. --- 
  2. #四个步骤1.下载jdk2.下载tocat3.解压tomcat4.启动 
  3. - hosts: webservers 
  4. gather_facts: no 
  5. vars: 
  6. tomcat_version: 8.5.34 
  7. tomcat_install_dir: /usr/local 
  8. tasks: 
  9. - name: Install jdk1.8 
  10. yum: name=java-1.8.0-openjdk state=present 
  11. - name: Download tomcat 
  12. get_url: url=http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v{{ tomcat_version }}/bin/apache-tomcat-{{ tomcat_version }}.tar.gz dest=/tmp 
  13. - name: Unarchive tomcat-{{ tomcat_version }}.tar.gz 
  14. unarchive: 
  15. src: /tmp/tomcat-{{ tomcat_version }}.tar.gz 
  16. dest: "{{ tomcat_install_dir }}" 
  17. copy: no 
  18. - name: Start tomcat 
  19. 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. 命令行:

  1. --- 
  2. - hosts: webservers 
  3. gather_facts: no 
  4. remote_users: root 
  5.  
  6. tasks: 
  7. - name: test var 
  8. debug: msg="{{work_dir}}" 
  1. ansible-playbook var.yml -e work_dir=/usr/local 

2. playbook:

  1. --- 
  2. - hosts: webservers 
  3. gather_facts: no 
  4. remote_users: root 
  5. vars: 
  6. - work_dir: /usr/local 
  7. - nginx_version: 1.16 
  8. tasks: 
  9. - name: install nginx 
  10. debug: msg="{{work_dir}}/nginx{{nginx_version}}" 

3. register:把某一个任务结果注册成一个变量

  1. --- 
  2. - hosts: webservers 
  3. gather_facts: no 
  4. remote_users: root 
  5. vars: 
  6. - work_dir: /usr/local 
  7. - nginx_version: 1.16 
  8. tasks: 
  9. - name: register var 
  10. command: date +"%F_%T" 
  11. register: datetime 
  12. - name: touch file 
  13. debug: {{datetime}} 
  14. file: dest=/tmp/r_{{datetime.stdout}} state=touch #使用ansible的file模块 

4. facts:

  1. --- 
  2. - hosts: webservers 
  3. gather_facts: yes 
  4. remote_users: root 
  5. vars: 
  6. - work_dir: /usr/local 
  7. - nginx_version: 1.16 
  8. tasks: 
  9. - name: touch file 
  10. 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:

chrome_KcOpixcD8N.png
chrome_KcOpixcD8N.png

4. include_tasks|import_tasks:

chrome_Z6dA5GnktP.png
chrome_Z6dA5GnktP.png

八、Playbook 流程控制

1. 条件:不同操作系统安装不同软件包

chrome_o8CF92ACcu.png
chrome_o8CF92ACcu.png

chrome_at4mjiy6u9.png

2. 循环

chrome_pjBRuEjXFr.png
chrome_pjBRuEjXFr.png

demo2:批量创建用户并加入nginx组中
chrome_fuA1Lx928C.png

九、Playbook 魔板(jinja2:语法类似php)

1. 条件和循环

可以把yml的变量值传到jinja2的文件变量中。
chrome_B9iLGPMalV.png

2. 案例:管理nginx配置文件

chrome_Bh2h5t0E1R.png
chrome_Bh2h5t0E1R.png

十、角色

  • roles目录结构
  • roles基本使用
  • 案例:部署LNMP网站平台

1. roles目录结构

chrome_Xjjofy5ts6.png
chrome_Xjjofy5ts6.png

参考案例:https://github.com/ansible/ansible-examples

2. roles基本使用

chrome_2l6HBOBYZa.png
chrome_2l6HBOBYZa.png

实操截图:
chrome_mstHpRJYSN.png
chrome_JsBoJf76eg.png

每个角色的tasks目录下必须有main.yml入口。

3. 案例:部署LNMP网站平台

网站架构:php-fpm相当于tomcat
chrome_YL2UrnLgPN.png

amsible文件结构:nginx采用编译安装方式
chrome_nrXr7yGedC.png

  1. #vim group_vars/all 
  2. --- 
  3. # Nginx 
  4. nginx_version: 1.15.3 
  5. http_port: 80 
  6. server_name: wp.ctnrs.com #虚拟主机 
  7.  
  8. # PHP 
  9. php_version: 5.6.38 
  10.  
  11. # Wordpress 
  12. wp_version: 4.9.4 
  13. db_host: 192.168.0.12 
  14. db_port: 3306 
  15. wp_db_name: wp 
  16. wp_db_user: wp 
  17. wp_db_password: MyNewPass4! 
  1. #vim hosts 
  2. 192.168.0.14 
  1. #vim site.yml 
  2. --- 
  3. - name: Install Nginx,PHP-FPM and Wordpress 
  4. hosts: webservers 
  5. remote_user: root 
  6. roles:  
  7. - role: common 
  8. - role: nginx 
  9. tags: ["nginx"] 
  10. - role: php 
  11. tags: ["php"] 
  12. - role: wordpress 
  13. tags: ["wp"] 

4. common

  1. #vim roles/common/tasks/main.yml 
  2. --- 
  3. - name: Install deps 
  4. yum: name={{ item }} state=present 
  5. with_items: 
  6. - gcc 
  7. - make 
  8. - zlib-devel 
  9. - openssl-devel 
  10. - pcre-devel 

5. role- nginx

  1. ls roles/nginx/files/ 
  2. nginx-1.15.3.tar.gz nginx.conf nginx.service 
  1. #vim roles/nginx/files/service 
  2. [Unit] 
  3. Description=The NGINX HTTP AND REVERSE PROXY SERVER 
  4. After=syslog.target network.target remote-fs.target nss-lookup.target 
  5.  
  6. [Service] 
  7. Type=forking 
  8. PIDFile=/var/run/nginx.pid 
  9. ExecStartPre=/usr/local/nginx/sbin/nginx -t 
  10. ExecStart=/usr/local/nginx/sbin/nginx 
  11. ExecReload=/urs/local/nginx/sbin/nginx -s reload 
  12. ExecStop=/bin/kill -s QUIT $MAINPID 
  13.  
  14. [Install] 
  15. WantedBy=multi-useer.target 
  1. #vim roles/nginx/handlers/main.yml 
  2. --- 
  3. - name: reload nginx 
  4. service: name=nginx state=reloaded 
  1. #vim roles/nginx/tasks/main.yml 
  2. - name: Copy nginx source pkg 
  3. #get_url: url=http://nginx.org/download/nginx-{{ nginx_version }}.tar.gz dest=/tmp/nginx-{{ nginx_version }}.tar.gz 
  4. copy: serc=nginx-{{ nginx_version }}.tar.gz dest=/tmp/ 
  5. - name: Install nginx  
  6. 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 
  7. - name: mkdir /usr/local/nginx/conf/vhost 
  8. file: dest=/usr/local/nginx/conf/vhost state=directory 
  9. - name: Copy nginx master configuration file 
  10. copy: src=nginx.conf dest=/usr/local/nginx/conf/ 
  11. notify: reload nginx 
  12. - name: Copy nginx configuration for wordpress 
  13. template: src=wordpress.conf dest=/usr/local/nginx/conf/vhost/ 
  14. notify: reload nginx 
  15. - name: Copy nginx systemctl service 
  16. copy: src=nginx.service dest=/usr/lib/systemd/system/ 
  17. - name: systemctl start service 
  18. service: name=nginx state=started enabled=yes 
  1. #vim roles/nginx/templates/wordpress.conf 如下: 

chrome_aqAnYYHf3p.png
chrome_aqAnYYHf3p.png

6. role- php

  1. ls roles/php/files/ 
  2. php-5.6.38.tar.gz php-fpm.conf php-fpm.service php.ini 
  1. #vim roles/php/handlers/main.yml 
  2. --- 
  3. - name: restart php-fpm 
  4. service: name=php-fpm state=restarted 
  1. # vim roles/php/tasks/main.yml #编译安装php 
  2. --- 
  3. - name: Install php deps 
  4. yum: name={{ item }} state=present 
  5. with_item: 
  6. - gd-deve 
  7. - libxml2-devel 
  8. - libcurl-devel 
  9. - libjped-devel 
  10. - libpng-devel 
  11. - name: Copy php source pkg 
  12. #get_url: url=http://docs.php.net/distributions/php-{{ php_version }}.tar.gz dest=/tmp/{{ php_version }}.tar.gz 
  13. copy: src=php-{{ php_version }}.tar.gz dest=/tmp 
  14. - name: Install php 
  15. 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 
  16. - name: Copy php configuration file 
  17. copy: src=php.ini dest=/usr/local/php/etc/ 
  18. notify: restart php-fpm 
  19. - name: Copy php service  
  20. copy: src=php-fpm.service dest=/usr/lib/systemd/system/ 
  21. - name: start php-fpm 
  22. service: name=php-fpm state=started enable=yes 

7. role-wordpress

  1. ls roles/wordpress/ 
  2. tasks templates 
  1. #vim roles/wordpress/tasks/main.yml 
  2. --- 
  3. - name: Download wordpress 
  4. get_url: url=https://cn.wordpress.org/wordpress-{{ wp_version }}-zh_CN.tar.gz dest=/tmp/wordpress-{{ wp_version }}-zh_CN.tar.gz 
  5. - name: Extract archive 
  6. unarchive: src/wordpress-{{ wp_version }}-zh_CN.tar.gz dest=/usr/local/nginx/html copy=no 
  7. - name: Copy wordpress config file 
  8. template: src=wp-config.php dest=/usr/local/nginx/html/wordpress 
  9. - name: Change ownership of Wordpress Installation 
  10. file: path=/usr/local/nginx/html/wordpress owner=nobody group=nobody state=directory recurse=yes 
  1. #vim roles/wordpress/templates/wp-config.php 

8. 检查语法部署

  1. #检查 
  2. ansible-playbook -i hosts site.yml --syntax-check 
  3. #安装 
  4. ansible-playbook -i hosts site.yml 

nginx,php如果报下面错误说明启动报错
chrome_WBQHCCc319.png
chrome_PAKunCEdwk.png

重新停掉服务systemctl daemon-reload即可;然后根据失败的task的tags重新执行安装即可

money怎么来?
原文地址:https://www.cnblogs.com/bchjazh/p/14518842.html