- 本地部署,on-premises,在家自己做
- 基础设施即服务,iaas,infrestructure as a service,买成品回家做
- 平台即服务,paas,platform as a service,叫外面
- 软件即服务,saas,software as a service ,去店里吃
- 企业实际应用场景分析
- Dev开发环境
- 测试环境
- 发布环境:代码发布机,有些公司为堡垒机(安全屏障)
- 生产环境
- 灰度环境
- 程序发布:
- 预发布验证:
- 新版本的代码先发布到服务器(跟线上环境配置完全相同,只是未接入到调度器)
- 程序发布:
- 不能导致系统故障或造成系统完全不可用
- 不能影响用户体验
- 灰度发布
- 发布路径:
- /webapps/testapk-1.1
- /webapps/testapk
- /webapps/testapk-1.2
- 发布过程:在调度器上下线一批主机(标记为maintanance状态) —> 关闭服务 —> 部署新版本的应用程序 —> 启动服务 —> 在调度器上启用这一批服务器
- 自动化灰度发布:脚本、发布平台
- ansible、saltstack:python,方便进行二次开发,中小型应用环境
- saltstack,一般需部署agent,执行效率高
- 特性:
- Adsible命令执行来源:
- USER,普通用户,即SYSTEM ADMINSTRATOR
- CMDB(配置管理数据库) API调用
- PUBLIC/PRIVATE CLOUD API调用
- USER -> Ansible Playbook -> Ansible
- 利用ansible实现管理的方式:
- Ad-hoc 即ansible命令,主要用于临时命令使用场景
- Ansible-playbook 主要用于长期规划好的,大型项目的场景,需要有前提的规划
- Ansible-playbook(剧本)执行过程:
- 将已有编排好的任务集写入Ansible-playbook
- 通过将ansible-playbook命令分拆任务集至逐条ansible命令,按预定规则逐条执行
- ansible主要操作对象:
- HOSTS主机
- NETWORKING 网络设备
- 注意事项
- 执行ansible的主机一般称为主控端,中控,master或堡垒机
- 主控端python版本需要2.6或以上
- 被控端python版本小于2.4需要安装python-simplejson
- 被控端如开启SElinux需要安装libselinux-python
- windows不能作为主控端
安装
- RPM安装:EPEL源
yum -y install ansible
- 编译安装
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
- Git方式:下载的最新的
git clone git://github.com/ansible/ansible.git --recursive
cd ./ansible
source ./hacking/env-setup
- 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
- 确认安装:
ansible --version
- 配置文件
/etc/ansible/ansible.cfg
主配置文件,配置ansible工作特性/etc/ansible/hosts
主机清单/etc/ansible/roles
存放角色的目录
- 程序
/usr/bin/ansible
主程序,临时命令执行工具/usr/bin/ansible-doc
查看配置文档,模块功能查看工具ansible-galaxy
下载/上传优秀代码或roles模块的官网平台ansible-playbook
定制自动化任务,编排剧本工具,ansible-pull
远程执行命令的工具ansible-vault
文本加密工具ansible-console
基于console界面与用户交互的执行工具主机清单
- inventory主机清单
- ansible的主要公用在于批量主机操作,为了便捷地适用其中的部分主机,可以在inventory file 中将其分组命名
- 默认的inventory file 为 /etc/ansible/hosts
- inventory file 可以有多个,且也可以通过dynamic inventory 来动态生成
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的方式,实现多台主机的测试
- 可以基于分组
- 实例—增加用户名密码
- centos6_226 是没有ssh-copy-id过去的
- 注意修改ansible.cfg配置文件,
host_key_checking = False
- 因为centos6_06 ssh端口不是2222所以会报错
- 子分组,再附上变量
- 自定义一个另外主机清单文件,
使用和模块化
配置文件,/etc/ansible/ansible.cfg (一般保持默认)
[defaults]
inventory = /etc/ansible/hosts #主机列表配置文件
library = /usr/share/my_modules/ #库文件存放目录
remote_tmp = $HOME/.ansible/tmp #临时py命令文件存放在远程主机目录
local_tmp = $HOME/.ansible/tmp #本机的临时命令执行目录
forks = 5 #默认并发数
sudo_user = root #默认sudo用户
ask_sudo_pass = True #每次执行ansible命令是否询问ssh密码
ask_pass = True
remote_port = 22
host_key_checking - False #检查对应服务器的host_key,建议取消注释,否则就得先一个一个主机连一次
log_path = /var/log/ansible.log #日志文件,也是建议取消注释
ansible不是需要长期执行的操作,不以服务方式运行,所以修改配置文件后无需重启
- 系列命令
- 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
netstat -anpt | grep sshd
可以查看到ssh链接情况
- 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
效果同上条
- ansible命令执行过程
- 加载自己的配置文件,默认/etc/ansible/ansible.cfg
- 加载自己对应的模块文件,如command
- 通过ansible将模块或命令生成对应的临时py对剑,并将文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY 文件
- 给文件+x 执行
- 执行并返回结果
- 删除临时py文件,sleep 0 退出
- 执行状态:
- 绿色:执行成功并不需要做变更的操作
- 黄色:执行成功并且对目标主机做变更的操作
-
常用模块
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到远程,执行,再把需要的结果拉回执行命令的机器
- script:运行脚本。无需复制脚本到每一台被控机,在本地编写脚本就ok
ansible all -m script -a '/PATH/TO/SCRIPT_FILE'
ansible websrvs -m script -a f1.sh
- copy:
ansible-doc -s copy
不需要替换掉就用backupansible 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=yesansible 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'
启动并设为开机自启
- 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收集模块
系列命令
- 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安装不下来,可能是网络原因。
- 链接https://galaxy.ansible.com 下载相应的roles
- ansible-pull,将命令推送至远程,效率提升
- 对yml文件加解密,
ansible-vault encrypt hello.yml
ansible-vault decrypt hello.yml
运行时需要解密ansible-vault view hello.yml
查看加密后的yml,- rekey,重置密码
- edit,更改内容
-
playbook
下面这部分,相当于是分开讲的,要看层次性、结构性的文件说明,直接到最下的roles小节中。
另外,一般的都可以借鉴网站上的,所以copy一份再改内容就可。
- 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:
- name: create new file
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的剧本,
- 核心元素
- hosts:执行的远程主机列表,也就等同于ansible命令中写的
- tasks:任务集
- varniables:内置变量或自定义变量在playbook中调用
- templates:模板,可替换模板文件中的变量并实现一些简单逻辑的文件
- handles和notity结合使用,由特定条件触发的操作,满足条件执行,否则不执行
- handlers是task列表,这些task与前述的task并没有本质上的不同,用于当关注的资源发生变化时,才会采取一定的操作
- tags:标签,指定某条任务执行,用于选择运行playbook中的部分代码
ansible-playbook -t tagsname useradd.yml
- 测试命令
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 查看标签
- 高级应用
- handlers
```bash hosts: websrvs remote_user: root tasks:
- name: install httpd package
yum: name=httpd
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:
- name: restart service
service: name=httpd state=restarted
- name: check nginx process
shell: killall -o nginx > /tmp/nginx.log
hosts: appsrvs remote_user: root
tasks:
- name: install package
yum: name={{ pkname }}
- name: start service service: name={{ pkname }} state=started enabled=yes ```
ansible-playbook -t rshttpd httpd.yml
选择标签进行执行变量名:仅能由字母、数字和下划线组成,且只能以字母开头
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:
- pkname1: httpd
- pkname2: vsftpd
tasks:
- name: install package yum: name={{ pkname1 }}
- name: install package service: name={{ pkname2 }} ```
-
template管理nginx
模板templates
- 文本文件,嵌套有脚本(使用模板编程语言编写)
- jinja2语言,使用字面量,有下面形式
- 字符串:使用单引号或双引号
- 数字:整数,浮点数
- 列表:[item1,item2,…]
- 元组:(item1,item2,…)
- 字典:{key1:value1,key2:value2,…}
- 布尔型:true/false
- 需要根据cpu个数来生成配置文件,
cp /etc/nginx/nginx.conf ansible/templates/nginx.conf.j2
vim test.yml
```bash
hosts: websrvs remote_user: root vars:
- http_port: 88
tasks:
- name: install package
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*"'
,查看主机的版本号
- 当主机版本为7的时候,使用nginx.conf7.j2配置文件;版本号为6,使用nginx.conf6.j2
- 迭代:with_items,当有需要重复性执行的任务时,可以使用迭代机制
- 对迭代项的引用,固定变量名为”item”
- 要在task中使用with_items给定要迭代的元素列表
vim testitem.yml
```bash
hosts: websrvs remote_user: root
tasks:
- name: create some files
file: name=/data/{{ item }} state=touch
when: ansible_distribution_major_version == "7"
with_items:
- file1
- file2
- file3
name: install some packages yum: name={{ item }} with_items:
- htop
- sl
- hping3
name: create some users user: name={{ item.name }} group={{ item.group }} with_items:
- { name: 'user1',group: 'g1' }
- { name: ‘user2’,group: ‘g2’ }
- { name: ‘user3’,group: ‘g3’ } ```
还可以迭代嵌套自变量
ansible-playbook testitem.yml
- template for if
```bash
hosts: websrvs remote_user: root vars:
ports:
- 81
- 82
- 83
tasks:
- name: copy conf
template: src=for1.conf.j2 dest=/data/for1.conf //记得创建文件for1.conf.j2
或者 ports:
- listen_port: 81
- listen_port: 82
- listen_port: 83
或者 ports:
- web1:
port: 81
name: web1.test.com
rootdir: /data/website1
- web2:
port: 82
name: web2.test.com
rootdir: /data/website2
- `vim for1.conf.j2` <br />
```bash
{% for p in ports %}
server{
listen {{ p }}
或者 listen {{ p.listen_port }}
或者 listen {{ p.listen_port }}
servername {{ p.name }}
documentroot {{ p.rootdir }}
OR
{% if p.name is defined %}
servername {{ p.name }} //如果p.name有值就生成,反之就不生成
{% endif %}
}
{% endfor %}
-
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
```bashname: create user user: name=nginx uid=80 group=nginx system=yes shell=/sbin/nologin ```
vim yum.yml
```bashname: install packages yum: name=nginx ```
vim start.yml
```bashname: start service service: name=nginx state=started enabled=yes ```
vim restart.yml
```bashname: restart service service: name=nginx state=restarted ```
cp /etc/nginx/nginx.conf templates/nginx.conf.j2
更改相关内容worker_processes {{ ansible_processor_vcpus+2 }};
vim ../tasks/templ.yml
```bashname: 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:
- role: nginx
```
ansible-playbook -C nginx_role.yml
检查剧本文件使用role搭建httpd服务
cd roles/httpd
mkdir tasks
vim tasks/user.yml
```bashname: create user user: name=apache system=yes shell=/sbin/nologin ```
vim tasks/copyfile.yml
name: copy files
copy: src=httpd.conf dest=/data/ owner=apache //需要先把要复制的文件拷贝到这里来../httpd/files/httpd.conf
vim tasks/main.yml
```bash- include: user.yml
- include: copyfile.yml ```
cd /root/ansible
到ansible目录下,创建vim httpd_cole.yml
-hosts: websrvs
remote_user: root
roles:
- httpd
ansible-playbook -C httpd_role.yml
- 跨项目调用多个role
cd /root/ansible/
copy nginx_role.yml some_role.yml
```bash
hosts: websrvs remote_user: root roles:
- 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中的文件路径要改绝对路径,否则报错 ```
- 在剧本中写入标签,
vim some_role.yml
```bash
hosts: websrvs remote_user: root roles:
- { 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
```bashname: create group group: name=app system=yes gid=123 ```
vim user.yml
```bashname: create user group: name=app group=user system=yes shell=/sbin/nologin uid=123 ```
vim yum.yml
```bashname: install package yum: name=httpd ```
cp /etc/httpd/conf/httpd.conf ../templates/httpd.conf.j2
修改内容Listen {{ ansible_processor_vcpus*10 }}
User {{ username }}
Group {{ groupname}}
vim app/tasks/templ.yml
```bashname: copy conf template: src=httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf notify: restart service ```
vim app/handlers/main.yml
这个就是对应上面的notify的,相当于把restart service 解释出来- name: restart service
service: name=httpd state=restarted
vim app/tasks/start.yml
```bashname: start service service: name=httpd state=started enabled=yes ```
vim app/tasks/copyfile.yml
```bashname: 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
username: app
groupname: app
vim ansible/app_role.yml
```bashhosts: websrvs remote_user: root
roles:
- app
```
测试,
ansible-playbook -C app_role.yml
- 希望启动后,mamcache占用的内存空间是物理内存的1/4
rpm -qa memcached
cat /etc/sysconfig/memcached
mkdir -p memcached/{tasks templates}
cp /etc/sysconfig/memcached templates/memcached.j2
修改内容
CACHESIZE="{{ ansible_memtotal_mb//4 }}" //意思是除以4后的整数
vim memcached/tasks/yum.yml
```bashname: install packages yum: name=memcached ```
vim memcached/tasks/start.yml
```bashname: start service service: name=memcached state=started enabled=yes ```
vim memcached/tasks/templ.yml
```bashname: 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
```bashhosts: websrvs remote_user: root
roles:
- memcached
```
ansible-playbook -C memcached_role.yml
- 检查端口是否启动,11211
ansible all -m shell -a 'ss -ntlpe'
附注
- 目录概览