• 本地部署,on-premises,在家自己做
  • 基础设施即服务,iaas,infrestructure as a service,买成品回家做
  • 平台即服务,paas,platform as a service,叫外面
  • 软件即服务,saas,software as a service ,去店里吃
  1. 企业实际应用场景分析
  • Dev开发环境
  • 测试环境
  • 发布环境:代码发布机,有些公司为堡垒机(安全屏障)
  • 生产环境
  • 灰度环境
  1. 程序发布:
  • 预发布验证:
    • 新版本的代码先发布到服务器(跟线上环境配置完全相同,只是未接入到调度器)
  • 程序发布:
    • 不能导致系统故障或造成系统完全不可用
    • 不能影响用户体验
  • 灰度发布
  • 发布路径:
    • /webapps/testapk-1.1
    • /webapps/testapk
    • /webapps/testapk-1.2
  • 发布过程:在调度器上下线一批主机(标记为maintanance状态) —> 关闭服务 —> 部署新版本的应用程序 —> 启动服务 —> 在调度器上启用这一批服务器
  • 自动化灰度发布:脚本、发布平台
  1. ansible、saltstack:python,方便进行二次开发,中小型应用环境
    • saltstack,一般需部署agent,执行效率高
  • puppet:ruby,功能强大,配置复杂,重型,适合大型环境

    工作架构和原理

  • 主控端:

    • 被控端:代理,无代理(用ssh服务)
  1. 特性:
  • 有paramiko,PyYAML,jinja2(模块语言)三个关键模块
  • 支持playbook编排任务

    主要组成部分

  1. Adsible命令执行来源:
  • USER,普通用户,即SYSTEM ADMINSTRATOR
  • CMDB(配置管理数据库) API调用
  • PUBLIC/PRIVATE CLOUD API调用
  • USER -> Ansible Playbook -> Ansible
  1. 利用ansible实现管理的方式:
  • Ad-hoc 即ansible命令,主要用于临时命令使用场景
  • Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前提的规划
  1. Ansible-playbook(剧本)执行过程:
  • 将已有编排好的任务集写入Ansible-playbook
  • 通过将ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐条执行
  1. ansible主要操作对象:
  • HOSTS主机
  • NETWORKING 网络设备
  1. 注意事项
  • 执行ansible的主机一般称为主控端,中控,master或堡垒机
  • 主控端python版本需要2.6或以上
  • 被控端python版本小于2.4需要安装python-simplejson
  • 被控端如开启SElinux需要安装libselinux-python
  • windows不能作为主控端

    安装

  1. RPM安装:EPEL源
  • yum -y install ansible
  1. 编译安装
  • yum -y install python-jinja2 PyYAML python-paramiko python-babel python-crypto
  • tar -xf ansible-xxx.tar.gz
  • cd ansible-xxx
  • python setup.py build
  • python setup.py install
  • mkdir -p /etc/ansible
  • cp -r examples/* /etc/ansible
  1. Git方式:下载的最新的
  • git clone git://github.com/ansible/ansible.git --recursive
  • cd ./ansible
  • source ./hacking/env-setup
  1. pip安装,pip是安装python包的管理器,类似yum
  • yum -y install python-pip python-devel
  • yum -y install gcc glibc-devel zibl-devel rpm-build openssl-devel
  • pip install --upgrade pip
  • pip install ansible --upgrade
  1. 确认安装: ansible --version
  • rpm -qa ansible | less

    相关文件

  1. 配置文件
  • /etc/ansible/ansible.cfg 主配置文件,配置ansible工作特性
  • /etc/ansible/hosts 主机清单
  • /etc/ansible/roles 存放角色的目录
  1. 程序
  • /usr/bin/ansible 主程序,临时命令执行工具
  • /usr/bin/ansible-doc 查看配置文档,模块功能查看工具
  • ansible-galaxy 下载/上传优秀代码或roles模块的官网平台
  • ansible-playbook 定制自动化任务,编排剧本工具,
  • ansible-pull 远程执行命令的工具
  • ansible-vault 文本加密工具
  • ansible-console 基于console界面与用户交互的执行工具

    主机清单

  1. inventory主机清单
  • ansible的主要公用在于批量主机操作,为了便捷地适用其中的部分主机,可以在inventory file 中将其分组命名
  1. 默认的inventory file 为 /etc/ansible/hosts
  2. inventory file 可以有多个,且也可以通过dynamic inventory 来动态生成
  3. ansible 192.168.30.101 -m ping -k 测试主机是否存活
  • -m module,指定使用的模块;这个ping不是普通的那个,走的是ssh协议
  • -k,ask,输入对方主机的用户名密码
  • ansible centos6_222 -m ping -o -u root -k
  • 需要添加主机ip, echo "192.168.30.101\n192.168.30.102\n192.168.30.103" >> /etc/ansible/hosts
  • 可以使用基于key的方式,实现多台主机的测试
  1. 可以基于分组

  1. 实例—增加用户名密码
  • centos6_226 是没有ssh-copy-id过去的
  • 注意修改ansible.cfg配置文件, host_key_checking = False

image.png

  1. 因为centos6_06 ssh端口不是2222所以会报错

image.png

  1. 子分组,再附上变量

image.png

  1. 自定义一个另外主机清单文件,

image.png

使用和模块化

  • 配置文件,/etc/ansible/ansible.cfg (一般保持默认)

    1. [defaults]
    2. inventory = /etc/ansible/hosts #主机列表配置文件
    3. library = /usr/share/my_modules/ #库文件存放目录
    4. remote_tmp = $HOME/.ansible/tmp #临时py命令文件存放在远程主机目录
    5. local_tmp = $HOME/.ansible/tmp #本机的临时命令执行目录
    6. forks = 5 #默认并发数
    7. sudo_user = root #默认sudo用户
    8. ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码
    9. ask_pass = True
    10. remote_port = 22
    11. host_key_checking - False #检查对应服务器的host_key,建议取消注释,否则就得先一个一个主机连一次
    12. log_path = /var/log/ansible.log #日志文件,也是建议取消注释
  • ansible不是需要长期执行的操作,不以服务方式运行,所以修改配置文件后无需重启

  1. 系列命令
  • ansible, ansible-doc, ansible-playbook, ansible-vault, ansible-console, ansible-galaxy, ansible-pull
  • ansible-doc ping 显示ping模块的帮助,主要是看EXAMPLE部分
    • andible-doc -l 列出所有模块
    • ansible-doc ping 查看指定模块帮助用法
    • ansible-doc -s ping 查看指定模块帮助用法
  • ansible [-m module_name] [-a args]
    • —version 显示版本
    • -m module 指定模块,默认为command
    • -v 详细过程,-vv -vvv更详细
    • —list-hosts 显示主机列表,可简写—list
    • -k —ask-pass 提示输入ssh连接密码,默认key验证
    • -K —ask-become-pass 提示输入sudo时的口令
    • -C —check 检查,并不执行
    • -T —timeout-TIMEOUT 执行命令的超时时间,默认10s
    • -u —user=REMOTE_USER 执行远程执行的用户
    • -b —become 代替旧版的sudo切换
  • ansible 192.168.30.101 -m command -a 'ls /root' -u wang -k -b -K wang用户以sudo身份查看101主机的/root 目录下内容
    • 注意,wang用户需要在101主机上sudo授权
    • 可以在visudo 配置文件中,取消 xxxx NOPASSWD: ALL 的注释,就不需要输入sudo的口令了
    • 还是用root好使
  • ssh-keygen ssh-copy-id 192.168.30.101 ssh-copy-id 192.168.30.102 ssh-copy-id 192.168.30.103
    • 意思是,Server复制秘钥到远程主机,即可在连接的时候不输入密码
    • ansible all -m ping

ansible.png

  • netstat -anpt | grep sshd 可以查看到ssh链接情况
  1. ansible的host-pattern,匹配主机的列表
  • All:表示所有inventory中的所有主机
    • ansible all -m ping
  • *:通配符
    • ansible "*" -m ping
    • ansible 192.168.1.* -m ping 一定是主机清单里面有的
    • ansible “*srvs” -m ping `
  • 或的关系
    • ansible "websrvs:appsrvs" -m ping 两个分组都执行
    • ansible "192.168.1.10:192.168.1.20" -m ping
  • 逻辑与
    • ansible "websrvs:&dbsrvs" -m ping 单引号也可, 在websrvs组并且在dbsrvs组中的主机
  • 逻辑非
    • ansible 'websrvs:!dbsrvs' -m ping 在websrvs组,但不在dbsrvs组中的主机
    • 注意为单引号
  • 综合逻辑
    • ansible 'websrvs:dbsrvs:&appsrvs:!ftpsrvs' -m ping
  • 正则表达式
    • ansible "websrvs:&dbsrvs" -m ping
    • ansible "~(web|db).*\.test\.com" -m ping 效果同上条
  1. ansible命令执行过程
  • 加载自己的配置文件,默认/etc/ansible/ansible.cfg
  • 加载自己对应的模块文件,如command
  • 通过ansible将模块或命令生成对应的临时py对剑,并将文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY 文件
  • 给文件+x 执行
  • 执行并返回结果
  • 删除临时py文件,sleep 0 退出
  1. 执行状态:
  • 绿色:执行成功并不需要做变更的操作
  • 黄色:执行成功并且对目标主机做变更的操作
  • 红色:执行失败

    常用模块

  • command:在远程主机执行命令,默认模块,可忽略-m 选项

    • ansible all -a 'chdir=/boot ls '
    • ansible 192.168.30.101 -a 'chdir=/data ./f1.sh' 远程执行脚本命令
    • command 不支持 $HOSTNAME < > | ; & 等,用shell模块实现
  • shell模块:和command相似,用shell执行命令。意思可以用这个替代上面的command
    • ansible srv -m shell -a 'echo xiaobai| passwd --stdin wang'
    • 调用bash执行命令,即使使用shell也可能会失败,
    • 解决办法:写到脚本上,copy到远程,执行,再把需要的结果拉回执行命令的机器

image.png

  • script:运行脚本。无需复制脚本到每一台被控机,在本地编写脚本就ok
    • ansible all -m script -a '/PATH/TO/SCRIPT_FILE'
    • ansible websrvs -m script -a f1.sh
  • copy: ansible-doc -s copy 不需要替换掉就用backup
    • ansible all -m copy -a 'src=/root/ansible/selinux dest=/etc/selinux/config backup=yes'
    • -a 'src=/etc/shadow dest=/data/ mode=755 owner=wang' ,修改权限
    • -a ‘src= dest= owner= group= mode= ‘
    • ansible all -m copy -a 'content="hello\nthanks\n" dest=/data/f2'
  • fetch:从客户端取文件至服务器端,copy相反,目录可先tar
    • ansible srv -m fetch -a 'src=/root/a.sh dest=/data/scripts' flat=yes
    • ansible all -m fetch -a 'src=/var/log/messages dest=/data' ,将日志文件抓取,先打个包
      • ansible all -m shell -a 'tar jcf log.tar.xz /var/log/*.log'
      • ansible all -m fetch -a 'src=/root/log.tar.xz dest=/data/' 然后,传输到本机来
  • file:设置文件属性
    • ansible srv -m file -a 'path=/root/a.sh owner=wang mode=755'
    • ansible web -m file -a 'src=/app/testfile dest=/app/testfile-link state=link' 软链接
      • ansible all -m file -a 'dest=/data/f3 state=touch touch创建一个空文件,absent删除
  • hostname:管理主机名
    • ansible 192.168.30.101 -m hostname -a 'name=node1' 还可以根据变量来自动生成被控机的主机名
  • cron:计划任务
    • ansible srv -m cron -a 'minute=*/5 job='/usr/sbin/ntpdate 172.16.0.1 &>/dev/null' name=Synctime' 创建任务
    • ansible srv -m cron -a 'state=absent name=Synctime' 删除任务
    • ansible all -m cron -a 'minute=* weekday=1,3,5 job='/usr/bin/wall FBI warning' name=warningcron'
      • crontab -e 可以查看到
      • ansible all -m cron -a 'disabled=true job='/usr/bin/wall FBI warning' name=warningcron' 禁用这个任务
  • yum:管理包
    • ansible all -m yum -a 'name=httpd state=latest' 安装
    • ansible all -m yum -a 'name=httpd state=absent' 删除
    • ansible all -m yum -a 'name=vsftpd,memcaches,httpd state=absent' ,卸载多个软件包
    • ansible 192.168.30.101 192.168.30.102 -m copy -a 'src=/data/vsftpd-xxxx.rpm dest=/root'
      • ansible 192.168.30.101 192.168.30.102 -m copy -a 'name=/root/vsftpd-xxxx.rpm
      • 可以加上 disable_gpg_check=yes
      • 更新缓存 update_cache=yes
  • service模块:管理服务
    • ansible websrvs -m service -a 'name=vsftpd state=started enable=yes' 启动并设为开机自启

image.png

  • user用户模块:管理用户
    • ansible websrvs -m user -a 'name=nginx shell=/sbin/nologin system=yes home=/var/nginx groups=root,bin uid=80 comment="nginx service"'
      • system表示是系统账号,nginx系统账号并且不能登录
      • ansible wensrvs -a 'getent passwd nginx'
      • -a 'name=nginx state=absent remove=yes' 删除账号,并移除家目录
  • group:管理组
    • absible websrvs -m group -a 'name=nginx system=yes gid=80'
    • ansible websrvs -a 'getent group nginx'
  • setup收集模块

image.png

系列命令

  • ansible-galaxy
    • 链接https://galaxy.ansible.com 下载相应的roles
      • ansible-galaxy install username.rolename
    • 列出所有已安装的galaxy, ansible-galaxy list
    • 安装galaxy, ansible-galaxy install geerlingguy.redis
    • 删除galaxy, ansible-galaxy remove geerlingguy.redis
    • cp -rp geerlingguy.nginx/ wang.nginx 复制出另一个role
      • 有的role安装不下来,可能是网络原因。

image.png

  • ansible-pull,将命令推送至远程,效率提升
  • 对yml文件加解密, ansible-vault encrypt hello.yml
    • ansible-vault decrypt hello.yml 运行时需要解密
    • ansible-vault view hello.yml 查看加密后的yml,
    • rekey,重置密码
    • edit,更改内容
  • ansible-console:可交互执行命令,支持tab

    playbook

    下面这部分,相当于是分开讲的,要看层次性、结构性的文件说明,直接到最下的roles小节中。

  • 另外,一般的都可以借鉴网站上的,所以copy一份再改内容就可。


  1. ansible-playbook —help,playbook使用YAML语言编写,参考
  • vim ansible/hello.yml,对格式要求很高,(类似python)
    ```bash

  • hosts: websrvs remote_user: root 其实也就是键值对,可以写成{key:value,key2:value2} tasks:
    • name: hello command: -a hostname

  • hosts: websrvs remote_user: root

    tasks:

    1. - name: create new file
    2. file: name=/data/newfile state=touch
    • name: create new user user: name=test11 system=yes shell=/sbin/nologin
    • name: install package yum: name=httpd
    • name: copy html copy: src=/var/www/html/index.html dest=/var/www/html
    • name: start service service: name=httpd state=started enable=yes ignore_errors: True #不管上面的语句成功失败都会执行下去,不影响下面语句的执行,或是|| /bin/true
    • name: copy configure file copy: src=files/httpd.conf dest=/etc/httpd/conf/ files相对路径,指当前用户的家目录下的/ansible/files文件夹 ```

      • ansible-playbook hello.yml 执行剧本
  • 简单安装apache的剧本,

image.png


  1. 核心元素
  • hosts:执行的远程主机列表,也就等同于ansible命令中写的
  • tasks:任务集
  • varniables:内置变量或自定义变量在playbook中调用
  • templates:模板,可替换模板文件中的变量并实现一些简单逻辑的文件
  • handles和notity结合使用,由特定条件触发的操作,满足条件执行,否则不执行
    • handlers是task列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作
  • tags:标签,指定某条任务执行,用于选择运行playbook中的部分代码
    • ansible-playbook -t tagsname useradd.yml
  1. 测试命令
  • ansible-playbook -C file.yml check,检查yml文件(上面的配置)
    • ansible websrvs -a 'ls /data -l'
    • ansible websrvs -a 'getent passwd test2'
    • ansible websrvs -m shell -a 'ss -tln|grep :80'
  • ansible-playbook file.yml --list-hosts 查看主机
    • —list-tasks 查看任务列表
    • —list-tags 查看标签

image.png

  1. 高级应用
  • handlers
    ```bash
  • hosts: websrvs remote_user: root tasks:

    1. - name: install httpd package
    2. yum: name=httpd
    3. tags: inshttpd
    • name: copy conf file copy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes notify:
      • restart service //配置文件改变后,会触发下面的handlers
      • check nginx process //对应多个action
    • name: start service service: name=httpd state=started enabled=yes tags: rshttpd

    handlers:

    1. - name: restart service
    2. service: name=httpd state=restarted
    3. - name: check nginx process
    4. shell: killall -o nginx > /tmp/nginx.log

  • hosts: appsrvs remote_user: root

    tasks:

    1. - name: install package
    2. yum: name={{ pkname }}
    • name: start service service: name={{ pkname }} state=started enabled=yes ```
  • ansible-playbook -t rshttpd httpd.yml 选择标签进行执行

    • ansible-playbook -t inshttpd,rshttpd httpd.yml
    • 多个action可以用一个相同的标签,执行的时候多个action都会执行

      变量的使用

  • 变量名:仅能由字母、数字和下划线组成,且只能以字母开头

  • ansible setup facts 远程主机的所有变量都可直接调用

    • ansible websrvs -m setup -a 'filter=ansible_hostname' 过滤出主机名信息
  • 在 /etc/ansible/hosts 中定义

    • 普通变量:主机组中主机单独定义,优先级高于公共变量
    • 公共(组)变量:针对所有主机组中所有主机定义统一变量
    • 在文件中,配置如下

[websrvs]
192.168.30.101 http_port=81
192.168.30.102 http_port=82
[websrvs:vars]
nodename=www
domainname=test.com

  • playbook文件中,配置如下,测试

    tasks:
    - name: set hostname
    yum: name={{nodename}}{{http_port}}.{{domainname}}

  • 通过命令行指定变量,优先级最高
    • ansible-playbook -e 'pkname=vsftpd' app.yml ,也可以定义多个变量
  • 在platbook中定义
    ```bash
  • hosts: appsrvs remote_user: root vars:

    1. - pkname1: httpd
    • pkname2: vsftpd tasks:
      • name: install package yum: name={{ pkname1 }}
    • name: install package service: name={{ pkname2 }} ```
  • 在role中定义

    template管理nginx

  • 模板templates

  • 文本文件,嵌套有脚本(使用模板编程语言编写)
  • jinja2语言,使用字面量,有下面形式
    • 字符串:使用单引号或双引号
    • 数字:整数,浮点数
    • 列表:[item1,item2,…]
    • 元组:(item1,item2,…)
    • 字典:{key1:value1,key2:value2,…}
    • 布尔型:true/false
  1. 需要根据cpu个数来生成配置文件,
  • cp /etc/nginx/nginx.conf ansible/templates/nginx.conf.j2
  • vim test.yml
    ```bash

  • hosts: websrvs remote_user: root vars:

    1. - http_port: 88

    tasks:

    1. - name: install package
    2. yum: name=nginx
    • name: copy template for centos7 template: src=nginx.conf7.j2 dest=/etc/nginx/nginx.conf when: ansible_distribution_major_version == “7” notify: restart service
    • name: copy template for centos6 template: src=nginx.conf6.j2 dest=/etc/nginx/nginx.conf when: ansible_distribution_major_version == “6” notify: restart service
    • name: start service service: name=nginx state=started enabled=yes handlers:
      • name: restart service service: name=nginx state=restarted ```
  • ansible websrvs -m setup | grep "cpu" 找出和cpu相关的变量名

  • 修改nginx配置文件,

worker_processes {{ ansible_processor_vcpus*2 }};

  • 然后运行上面修改后的yml
  • 修改nginx.conf.j2 模板文件的监听端口,改成 http_port, 因为在/etc/ansible/hosts 中已经定义了,所以重新运行一次上面的yml,那不同主机的nginx配置文件的监听端口也就是指定的了
  • 还可以通过在yml中定义变量,那么就会以yml文件中的为准
  • 同样在命令行, ansible-playbook -e "http_port=99" testtempl.yml
    • ansible all -m setup -a 'filter="*distribution*"' ,查看主机的版本号
    1. 当主机版本为7的时候,使用nginx.conf7.j2配置文件;版本号为6,使用nginx.conf6.j2
    2. 迭代:with_items,当有需要重复性执行的任务时,可以使用迭代机制
    • 对迭代项的引用,固定变量名为”item”
    • 要在task中使用with_items给定要迭代的元素列表
    • vim testitem.yml
      ```bash

  • hosts: websrvs remote_user: root

    tasks:

    1. - name: create some files
    2. file: name=/data/{{ item }} state=touch
    3. when: ansible_distribution_major_version == "7"
    4. with_items:
    5. - file1
    6. - file2
    7. - file3
    • name: install some packages yum: name={{ item }} with_items:

      1. - htop
      • sl
      • hping3
    • name: create some users user: name={{ item.name }} group={{ item.group }} with_items:

      1. - { name: 'user1',group: 'g1' }
      • { name: ‘user2’,group: ‘g2’ }
      • { name: ‘user3’,group: ‘g3’ } ```
  • 还可以迭代嵌套自变量

  • ansible-playbook testitem.yml
  1. template for if
    ```bash

  • hosts: websrvs remote_user: root vars:

    1. ports:
    2. - 81
    3. - 82
    4. - 83

    tasks:

    1. - name: copy conf
    2. template: src=for1.conf.j2 dest=/data/for1.conf //记得创建文件for1.conf.j2

或者 ports:

  1. - listen_port: 81
  2. - listen_port: 82
  3. - listen_port: 83

或者 ports:

  1. - web1:
  2. port: 81
  3. name: web1.test.com
  4. rootdir: /data/website1
  5. - web2:
  6. port: 82
  7. name: web2.test.com
  8. rootdir: /data/website2
  1. - `vim for1.conf.j2` <br />
  2. ```bash
  3. {% for p in ports %}
  4. server{
  5. listen {{ p }}
  6. 或者 listen {{ p.listen_port }}
  7. 或者 listen {{ p.listen_port }}
  8. servername {{ p.name }}
  9. documentroot {{ p.rootdir }}
  10. OR
  11. {% if p.name is defined %}
  12. servername {{ p.name }} //如果p.name有值就生成,反之就不生成
  13. {% endif %}
  14. }
  15. {% endfor %}
  • 当然,可以在vars/main.yml 存放自变量

    roles

  • 用于层次性、结构性地组织playbook。能够根据层次型结构自动装载变量文件、tasks以及handlers等。

  • 只需要在playbook中使用include指令
  • mkdir -p /root/ansible/roles mkdir roles/{httpd,mysql,memcache,nginx} -pv 创建文件目录
  • cd roles/nginx mkdir tasks templates
  • cd tasks vim group.yml 一个任务放在一个yml文件中,方便之后的模块化管理 ```bash //因为是单个任务,所以直接写就可
  • name: create group group: name=nginx gid=80 ```

  • vim user.yml
    ```bash

  • name: create user user: name=nginx uid=80 group=nginx system=yes shell=/sbin/nologin ```

  • vim yum.yml
    ```bash

  • name: install packages yum: name=nginx ```

  • vim start.yml
    ```bash

  • name: start service service: name=nginx state=started enabled=yes ```

  • vim restart.yml
    ```bash

  • name: restart service service: name=nginx state=restarted ```

  • cp /etc/nginx/nginx.conf templates/nginx.conf.j2 更改相关内容

    1. worker_processes {{ ansible_processor_vcpus+2 }};
  • vim ../tasks/templ.yml
    ```bash

  • name: copy conf template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf ```

  • vim ../tasks/main.yml
    ```bash

  • include: group.yml
  • include: user.yml
  • include: yum.yml
  • include: templ.yml
  • include: start.yml //注意按照调用顺序来编辑 ```

  • cd /root/ansible/ vim nginx_role.yml
    ```bash


  • hosts: websrvs remote_user: root roles:

    1. - role: nginx

    ```

  • ansible-playbook -C nginx_role.yml 检查剧本文件

    使用role搭建httpd服务

  • cd roles/httpd mkdir tasks vim tasks/user.yml
    ```bash

  • name: create user user: name=apache system=yes shell=/sbin/nologin ```

  • vim tasks/copyfile.yml

    1. name: copy files
    2. copy: src=httpd.conf dest=/data/ owner=apache //需要先把要复制的文件拷贝到这里来../httpd/files/httpd.conf
  • vim tasks/main.yml
    ```bash

  • include: user.yml
  • include: copyfile.yml ```

image.png

  • cd /root/ansible 到ansible目录下,创建 vim httpd_cole.yml

    1. -hosts: websrvs
    2. remote_user: root
    3. roles:
    4. - httpd
  • ansible-playbook -C httpd_role.yml

image.png

  1. 跨项目调用多个role
  • cd /root/ansible/ copy nginx_role.yml some_role.yml
    ```bash

  • hosts: websrvs remote_user: root roles:

    1. - role: httpd
    • role: nginx ```
  • vim roles/nginx/tasks/main.yml
    ```bash

  • include: group.yml
  • include: user.yml
  • include: yum.yml
  • include: templ.yml
  • include: start.yml
  • include: roles/httpd/tasks/copyfile.yml //跨项目调用别的任务,需要注意,copyfile.yml中的文件路径要改绝对路径,否则报错 ```
  1. 在剧本中写入标签, vim some_role.yml
    ```bash
  • hosts: websrvs remote_user: root roles:

    1. - { role: httpd, tags: ['web','httpd'] }
    • { role: nginx, tags: [‘web’,’nginx’],when ansible_distribution_major_version == “7” }
    • { role: app, tags: “app” } ```
  • 可以选择哪个标签进行执行,web的话就是执行前两个, ansible-playbook -t web some_role.yml

    高级用法

  • mkdir roles/app/{tasks templates vars handlers files} cd tasks vim group.yml
    ```bash

  • name: create group group: name=app system=yes gid=123 ```

  • vim user.yml
    ```bash

  • name: create user group: name=app group=user system=yes shell=/sbin/nologin uid=123 ```

  • vim yum.yml
    ```bash

  • name: install package yum: name=httpd ```

  • cp /etc/httpd/conf/httpd.conf ../templates/httpd.conf.j2 修改内容

    1. Listen {{ ansible_processor_vcpus*10 }}
    2. User {{ username }}
    3. Group {{ groupname}}
  • vim app/tasks/templ.yml
    ```bash

  • name: copy conf template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf notify: restart service ```

  • vim app/handlers/main.yml 这个就是对应上面的notify的,相当于把restart service 解释出来

    1. - name: restart service
    2. service: name=httpd state=restarted
  • vim app/tasks/start.yml
    ```bash

  • name: start service service: name=httpd state=started enabled=yes ```

  • vim app/tasks/copyfile.yml
    ```bash

  • name: copy config copy: src=vhosts.conf dest=/etc/httpd/conf.d/ owner=app ```

  • vim app/tasks/main.yml
    ```bash

  • include: group.yml
  • include: user.yml
  • include: yum.yml
  • include: templ.yml
  • include: copyfile.yml
  • include: start.yml ```

  • vim app/vars/main.yml

    1. username: app
    2. groupname: app
  • vim ansible/app_role.yml
    ```bash

  • hosts: websrvs remote_user: root

    roles:

    1. - app

    ```

  • 测试, ansible-playbook -C app_role.yml

  1. 希望启动后,mamcache占用的内存空间是物理内存的1/4
  • rpm -qa memcached cat /etc/sysconfig/memcached
  • mkdir -p memcached/{tasks templates} cp /etc/sysconfig/memcached templates/memcached.j2

修改内容

  1. CACHESIZE="{{ ansible_memtotal_mb//4 }}" //意思是除以4后的整数
  • vim memcached/tasks/yum.yml
    ```bash
  • name: install packages yum: name=memcached ```

  • vim memcached/tasks/start.yml
    ```bash

  • name: start service service: name=memcached state=started enabled=yes ```

  • vim memcached/tasks/templ.yml
    ```bash

  • name: copy conf template: src=memcached.j2 dest=/etc/sysconfig/memcached ```

  • vim memcached/tasks/main.yml
    ```bash

  • clude: yum.yml
  • clude: templ.yml
  • clude: start.yml ```

  • vim ansible/memcached_role.yml
    ```bash

  • hosts: websrvs remote_user: root

    roles:

    1. - memcached

    ```

  • ansible-playbook -C memcached_role.yml

  • 检查端口是否启动,11211 ansible all -m shell -a 'ss -ntlpe'

    附注

  1. 目录概览

image.png