[关闭]
@mrz1 2018-01-20T14:05:25.000000Z 字数 14152 阅读 1289

2017-1-15(Playbook中变量 模板)

笔记


Playbook中变量使用

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

  1. 1 ansible setup facts 远程主机的所有变量都可直接调用
  2. ansible web -m setup -a 'filter=ansible_hostname' 显示主机名不全
  3. ansible web -m setup -a 'filter=ansible_nodename' 显示主机名全
  4. ansible web -m setup -a 'filter=*all_ipv6*' 显示ipv6地址 支持过滤
  5. 2 在/etc/ansible/hosts中定义普通变量:主机组中主机单独定义,优先级高于公共变量公共(组)变量:针对主机组中所有主机定义统一变量
  6. 3 通过命令行指定变量,优先级最高
  7. ansible-playbook e varname=value
  8. 4 playbook中定义变量
  9. vars:
  10. - var1: value1
  11. - var2: value2
  12. 5 role中定义
  13. 变量命名
  14. 变量名仅能由字母、数字和下划线组成,且只能以字母开头
  15. 变量定义:key=value
  16. 示例:http_port=80
  17. 变量调用方式:
  18. 通过{{ variable_name}} 调用变量,且变量名前后必须有空格,有时用"{{ variable_name}}"才生效
  19. ansible-playbook e 选项指定
  20. ansible-playbook test.yml -e "hosts=www user=mageedu"

示例:变量

  1. 示例1var.yml
  2. - hosts: websrvs
  3. remote_user: root
  4. tasks:
  5. - name: install package
  6. yum: name={{ pkname }} state=presentan
  7. sible-playbook e pkname=httpdvar.yml
  8. 示例2var2.yml
  9. - hosts: websrvs
  10. remote_user: root
  11. vars:
  12. - username: user1
  13. - groupname: group1
  14. tasks:
  15. - name: create group
  16. group: name={{ groupname }} state=present
  17. - name: create user
  18. user: name={{ username }} state=presentan
  19. sible-playbook var2.yml
  20. ansible-playbook -e "username=user2 groupname=group2" var2.yml
  21. 如果剧本有了定义,外面-e在写的话优先级比较高 会执行-e

主机变量

主机变量可以在inventory中定义主机时为其添加主机变量以便于在playbook中使用
示例:

  1. [websrvs]
  2. www1.magedu.com http_port=80 maxRequestsPerChild=808
  3. www2.magedu.com http_port=8080 maxRequestsPerChild=909

组变量

组变量是指赋予给指定组内所有主机上的在playbook中可用的变量
示例:

  1. [websrvs]
  2. www1.magedu.com
  3. www2.magedu.com
  4. [websrvs:vars]
  5. ntp_server=ntp.magedu.com
  6. nfs_server=nfs.magedu.com

示例:变量

  1. 普通变量
  2. [websrvs]
  3. 192.168.99.101 http_port=8080 hname=www1
  4. 192.168.99.102 http_port=80 hname=www2
  5. 公共(组)变量
  6. [websvrs:vars]
  7. http_port=808
  8. mark="_"
  9. [websrvs]
  10. 192.168.99.101 http_port=8080 hname=www1
  11. 192.168.99.102 http_port=80 hname=www2
  12. ansible websvrs m hostname a 'name={{ hname }}{{ mark }}{{ http_port }}'
  13. 命令行指定变量:
  14. ansible websvrs e http_port=8000 m hostname a 'name={{ hname}}{{ mark }}{{ http_port}}'
  15. vars.yml (文件名定义变量
  16. var1 httpd
  17. var2 nginx
  18. - hosts: websrvs
  19. remote_user: root
  20. vars_files:
  21. - vars.yml (文件名)
  22. tasks:
  23. - name: create file
  24. file: name=/app/{{var1}}-{{var2}}.log state=touch

模板templates

templates

  1. templates功能:根据模块文件动态生成对应的配置文件
  2. templates文件必须存放于templates目录下,且命名为.j2 结尾
  3. yaml/yml文件需和templates目录平级,目录结构如下:
  4. ./
  5. ├── temnginx.yml
  6. └── templates
  7. └── nginx.conf.j2
  8. 示例:利用templates 同步nginx配置文件
  9. 准备templates/nginx.conf.j2文件
  10. vim temnginx.yml
  11. ---
  12. - hosts: web
  13. remote_user: root
  14. tasks:
  15. - name: install nginx
  16. yum: name=nginx
  17. - name: template configto remote hosts
  18. template: src=/root/ansible/templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf
  19. notify: restart_nginx
  20. tags: instconf
  21. - name: start service
  22. service: name=nginx state=started
  23. handlers:
  24. - name: restart_nginx
  25. service: name=nginx state=restarted
  26. 执行:ansible-playbook temnginx.yml
  27. laybooktemplate变更替换
  28. 修改文件nginx.conf.j2 下面行为
  29. worker_processes{{ ansible_processor_vcpus }};
  30. cat temnginx2.yml
  31. ---
  32. - hosts: websrvs
  33. remote_user: root
  34. tasks:
  35. - name:template configto remote hosts
  36. template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
  37. ansible-playbook temnginx2.yml

Playbook中template算术运算

  1. 算法运算:
  2. 示例:
  3. vim nginx.conf.j2
  4. worker_processes{{ ansible_processor_vcpus*2 }}; worker_processes{{ ansible_processor_vcpus+2 }};

when

  1. 条件测试:如果需要根据变量、facts或此前任务的执行结果来做为某task执行与否的前提时要用到条件测试,通过when语句实现,在task中使用,jinja2的语法格式
  2. when语句
  3. task后添加when子句即可使用条件测试;when语句支持Jinja2表达式语法
  4. 示例:
  5. tasks:
  6. - name: "shutdown RedHatflavored systems"
  7. command: /sbin/shutdown -h now
  8. when: ansible_os_family== "RedHat"

示例:when条件判断

  1. ---
  2. - hosts: websrvs
  3. remote_user: root
  4. tasks:
  5. - name: add group nginx
  6. tags: user
  7. user: name=nginx state=present
  8. - name: add user nginx
  9. user: name=nginx state=present group=nginx
  10. - name: Install Nginx
  11. yum: name=nginx state=present
  12. - name: restart Nginx
  13. service: name=nginx state=restarted
  14. when: ansible_distribution_major_version == "6"
  15. 示例:
  16. tasks:
  17. - name: install conffile to centos7
  18. template: src=nginx.conf.c7.j2
  19. when: ansible_distribution_major_version== "7"
  20. - name: install conffile to centos6
  21. template: src=nginx.conf.c6.j2
  22. when: ansible_distribution_major_version== "6"

迭代:with_items

  1. 示例:
  2. - name: add several users
  3. user: name={{ item }} state=present groups=wheel
  4. with_items:
  5. - testuser1
  6. - testuser2
  7. 上面语句的功能等同于下面的语句:
  8. - name: add user testuser1
  9. user: name=testuser1 state=present groups=wheel
  10. - name: add user testuser2
  11. user: name=testuser2 state=present groups=wheel

迭代示例:

  1. 示例1
  2. 将多个文件进行copy到被控端
  3. ---
  4. - hosts: testsrv
  5. remote_user: root
  6. tasks
  7. - name: Create rsyncd config
  8. copy: src={{ item }} dest=/etc/{{ item }}
  9. with_items:
  10. - rsyncd.secrets
  11. - rsyncd.conf
  12. 示例2
  13. [root@ansible ansible]#cat item1.yml
  14. - hosts: websrvs
  15. remote_user: root
  16. tasks:
  17. - name: create servel users
  18. user: name={{item}} group=root groups=wang,bin
  19. with_items:
  20. - itemuser1
  21. - itemuser2
  22. 示例3
  23. - hosts: websrvs
  24. remote_user: root
  25. tasks:
  26. - name: copy file
  27. copy: src={{ item }} dest=/tmp/{{ item }}
  28. with_items:
  29. - file1
  30. - file2
  31. - file3
  32. - name: yum install httpd
  33. yum: name={{ item }} state=present
  34. with_items:
  35. - apr
  36. - apr-util
  37. - httpd
  38. 示例4
  39. - hostswebsrvs
  40. remote_user: root
  41. tasks:
  42. - name: install some packages
  43. yum: name={{ item }} state=present
  44. with_items:
  45. - nginx
  46. - memcached
  47. - php
  48. - fpm
  49. 示例5:迭代嵌套子变量
  50. - hostswebsrvs
  51. remote_user: root
  52. tasks:
  53. - name: add some groups
  54. group: name={{ item }} state=present
  55. with_items:
  56. - group1
  57. - group2
  58. - group3
  59. - name: add some users
  60. user: name={{ item.name }} group={{ item.group}} state=present
  61. with_items:
  62. - { name: 'user1', group: 'group1' }
  63. - { name: 'user2', group: 'group2' }
  64. - { name: 'user3', group: 'group3' }

Playbook中template for if

  1. {% for vhost in nginx_vhosts %}
  2. server {
  3. listen {{ vhost.listen | default('80 default_server') }};
  4. {% if vhost.server_name is defined %}
  5. server_name {{ vhost.server_name }};
  6. {% endif %}
  7. {% if vhost.root is defined %}
  8. root {{ vhost.root }};
  9. {% endif %}

示例0

  1. [root@ansible ansible]#cat templates/for4.conf.j2
  2. {%for vhost in vhosts %}
  3. server {
  4. listen {{vhost.port}};
  5. {%if vhost.name is defined %}
  6. servername {{vhost.name}};
  7. {%endif%}
  8. rootdir {{vhost.root}};
  9. }

示例1

  1. // for1.yml
  2. ---
  3. - hosts: web
  4. remote_user: root
  5. vars:
  6. ports:
  7. - 80
  8. - 81
  9. - 82
  10. tasks:
  11. - name: tast for1
  12. template: src=for1.conf.j2 dest=/app/for1.conf
  13. // vim templates/for1.conf.j2
  14. {% for port in ports %}
  15. server {
  16. listen {{ port }}
  17. }
  18. {% endfor %}
  19. 生成的结果:
  20. server {
  21. listen 80
  22. }
  23. server {
  24. listen 81
  25. }
  26. server {
  27. listen 82
  28. }

示例2

  1. // temnginx.yml
  2. ---
  3. - hosts: testweb
  4. remote_user: root
  5. vars:
  6. nginx_vhosts:
  7. - listen: 8080
  8. -----------------------------------------------------
  9. //templates/nginx.conf.j2
  10. {% for vhost in nginx_vhosts %}
  11. server {listen {{ vhost.listen }}}
  12. {% endfor %}
  13. 生成的结果server {listen 8080}

示例3

  1. // temnginx.yml
  2. ---
  3. - hosts: mageduweb
  4. remote_user: root
  5. vars:
  6. nginx_vhosts:
  7. - web1
  8. - web2
  9. - web3
  10. tasks:
  11. - name: template config
  12. template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
  13. -----------------------------------------------------
  14. // templates/nginx.conf.j2
  15. {% for vhost in nginx_vhosts %}
  16. server {
  17. listen {{ vhost }}
  18. }
  19. {% endfor %}
  20. 生成的结果:
  21. server {
  22. listen web1
  23. }
  24. server {
  25. listen web2
  26. }
  27. server {
  28. listen web3
  29. }

示例4

  1. // temnginx.yml
  2. - hosts: mageduweb
  3. remote_user: root
  4. vars:
  5. nginx_vhosts:
  6. - web1:
  7. listen: 8080
  8. server_name: "web1.magedu.com"
  9. root: "/var/www/nginx/web1/"
  10. - web2:
  11. listen: 8080
  12. server_name: "web2.magedu.com"
  13. root: "/var/www/nginx/web2/"
  14. - web3:
  15. listen: 8080
  16. server_name: "web3.magedu.com"
  17. root: "/var/www/nginx/web3/"
  18. tasks:
  19. - name: template config
  20. template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
  21. -----------------------------------------------------
  22. // templates/nginx.conf.j2
  23. {% for vhost in nginx_vhosts %}
  24. server {
  25. listen {{ vhost.listen }}
  26. server_name {{ vhost.server_name }}
  27. root {{ vhost.root }}
  28. }
  29. {% endfor %}
  30. 生成结果:
  31. server {
  32. listen 8080
  33. server_name web1.magedu.com
  34. root /var/www/nginx/web1/
  35. }
  36. server {
  37. listen 8080
  38. server_name web2.magedu.com
  39. root /var/www/nginx/web2/
  40. }
  41. server {
  42. listen 8080
  43. server_name web3.magedu.com
  44. root /var/www/nginx/web3/
  45. }

示例5

  1. // temnginx.yml
  2. - hosts: mageduweb
  3. remote_user: root
  4. vars:
  5. nginx_vhosts:
  6. - web1:
  7. listen: 8080
  8. root: "/var/www/nginx/web1/"
  9. - web2:
  10. listen: 8080
  11. server_name: "web2.magedu.com"
  12. root: "/var/www/nginx/web2/"
  13. - web3:
  14. listen: 8080
  15. server_name: "web3.magedu.com"
  16. root: "/var/www/nginx/web3/"
  17. tasks:
  18. - name: template config to
  19. template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
  20. // templates/nginx.conf.j2
  21. {% for vhost in nginx_vhosts %}
  22. server {
  23. listen {{ vhost.listen }}
  24. {% if vhost.server_name is defined %}
  25. server_name {{ vhost.server_name }}
  26. {% endif %}
  27. root {{ vhost.root }}}
  28. {% endfor %}
  29. 生成的结果
  30. server {
  31. listen 8080
  32. root /var/www/nginx/web1/
  33. }
  34. server {
  35. listen 8080
  36. server_name web2.magedu.com
  37. root /var/www/nginx/web2/
  38. }
  39. server {
  40. listen 8080
  41. server_name web3.magedu.com
  42. root /var/www/nginx/web3/
  43. }

roles

ansilbe自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中

复杂场景:

  1. 角色(roles):角色集合
  2. roles/
  3. mysql/
  4. httpd/
  5. nginx/
  6. memcached/

Ansible Roles目录编排

Roles目录编排

  1. 每个角色,以特定的层级目录结构进行组织
  2. roles目录结构及各目录作用
  3. /roles/project/ :项目名称,有以下子目录
  4. files/ :存放由copyscript模块等调用的文件
  5. templates/:template模块查找所需要模板文件的目录
  6. tasks/:定义task,role的基本元素,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
  7. handlers/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
  8. vars/:定义变量,至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含
  9. meta/:定义当前角色的特殊设定及其依赖关系,至少应该包含一个名为main.yml的文件,其它文件需在此文件中通过include进行包含
  10. default/:设定默认变量时使用此目录中的main.yml文件

创建role

创建role的步骤
1. 创建以roles命名的目录
2. 在roles目录中分别创建以各角色名称命名的目录,如webservers等
3. 在每个角色命名的目录中分别创建files、handlers、meta、tasks、templates和vars目录;用不到的目录可以创建为空目录,也可以不创建
4. 在playbook文件中,调用各角色

针对大型项目使用Roles进行编排

roles目录结构:
playbook.yml
roles/
project/
tasks/
files/
vars/ # 不经常用
default/ # 不经常用
templates/
handlers/
meta/ # 不经常用

示例:

  1. roles/
  2.    └── nginx/
  3.       ├── files
  4.    ├── main.yml
  5. ├── tasks
  6.    ├── groupadd.yml
  7.    ├── install.yml
  8.    ├── main.yml
  9.    └── restart.yml
  10.    └── useradd.yml
  11. ├── vars
  12.    └── main.yml

roles的示例如下所示:

  1. site.yml
  2. webservers.yml
  3. dbservers.yml
  4. roles/
  5. common/
  6. files/
  7. templates/
  8. tasks/
  9. handlers/
  10. vars/
  11. meta/
  12. webservers/
  13. files/
  14. templates/
  15. tasks/
  16. handlers/
  17. vars/
  18. meta/

playbook调用角色

  1. 调用角色方法1
  2. - hosts: websrvs
  3. remote_user: root
  4. roles:
  5. - mysql
  6. - memcached
  7. - nginx
  8. 调用角色方法2
  9. 传递变量给角色
  10. - hosts:
  11. remote_user:
  12. roles:
  13. - mysql
  14. - { role: nginx, username: nginx}
  15. role用于指定角色名称 后续的k/v用于传递变量给角色
  16. 调用角色方法3:还可基于条件测试实现角色调用
  17. roles:
  18. - { role: nginx, username: nginx, when: ansible_distribution_major_version== '7' }

完整的roles架构

  1. // nginx-role.yml 顶层任务调用yml文件
  2. ---
  3. - hosts: testweb
  4. remote_user: root
  5. roles:
  6. - role: nginx
  7. - role: httpd 可执行多个role
  8. cat roles/nginx/tasks/main.yml
  9. ---
  10. - include: groupadd.yml
  11. - include: useradd.yml
  12. - include: install.yml
  13. - include: restart.yml
  14. - include: filecp.yml
  15. 这里把include改为import_tasksinclude目前已经弃用)
  16. ---------------------------------------------
  17. Cat roles/nginx/tasks/groupadd.yml
  18. ---
  19. - name: add group nginx
  20. user: name=nginx state=present
  21. cat roles/nginx/tasks/filecp.yml
  22. ---
  23. - name: file copy
  24. copy: src=tom.conf dest=/tmp/tom.conf
  25. 以下文件格式类似:
  26. useradd.yml,install.yml,restart.yml
  27. ls roles/nginx/files/tom.conf

roles playbook tags使用

  1. roles playbook tags使用
  2. ansible-playbook --tags="nginx,httpd,mysql" nginx-role.yml
  3. // nginx-role.yml
  4. ---
  5. - hosts: testweb
  6. remote_user: root
  7. roles:
  8. - { role: nginx,tags: [ 'nginx', 'web' ] ,when: ansible_distribution_major_version== "6" }
  9. - { role: httpd,tags: [ 'httpd', 'web' ] }
  10. - { role: mysql,tags: [ 'mysql', 'db' ] }
  11. - { role: marridb,tags: [ 'mysql', 'db' ] }
  12. - { role: php}

roles示例 安装nginx

  1. [root@centos7 ansible]#tree
  2. .
  3. ├── nginx.yml
  4. ├── roles
  5.    ├── memcached
  6.    └── nginx
  7.    ├── tasks
  8.       ├── install.yml
  9.       ├── main.yml
  10.       ├── start.yml
  11.    └── templates
  12. [root@centos7 tasks]#cat main.yml (入口文件 也可全部都写在这里)
  13. - import_tasks: install.yml(也可以调用别的角色的*.yml路径)
  14. - import_tasks: start.yml
  15. [root@centos7 tasks]#cat install.yml (安装nginx
  16. - name: install package
  17. yum: name=nginx
  18. [root@centos7 tasks]#cat start.yml (启动nginx)
  19. - name: start service
  20. service: name=nginx state=started enabled=yes
  21. [root@centos7 ansible]#cat nginx.yml (执行这个文件)
  22. - hosts: web
  23. remote_user: root
  24. roles:
  25. - role: nginx
  26. [root@centos7 ansible]#ansible-playbook nginx.yml

安装nginx

  1. [root@centos7 ansible]#tree roles/nginx/
  2. roles/nginx/
  3. ├── handlers
  4.    └── main.yml
  5. ├── tasks
  6.    └── main.yml
  7. ├── templates
  8.    └── nginx.conf.j2
  9. └── vars
  10. └── main.yml
  11. [root@centos7 ansible]#cat roles/nginx/handlers/main.yml
  12. - name: restart service
  13. service: name=nginx state=restarted
  14. [root@centos7 ansible]#cat roles/nginx/tasks/main.yml
  15. - name: install package
  16. yum: name=nginx
  17. - name: template
  18. template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
  19. notify: restart service
  20. tags: tmplfile
  21. - name: start service
  22. service: name=nginx state=started
  23. [root@centos7 ansible]#cat roles/nginx/templates/nginx.conf.j2
  24. # For more information on configuration, see:
  25. # * Official English Documentation: http://nginx.org/en/docs/
  26. # * Official Russian Documentation: http://nginx.org/ru/docs/
  27. # test nginx
  28. user nginx;
  29. worker_processes {{ ansible_processor_vcpus }};
  30. error_log /var/log/nginx/error.log;
  31. pid /run/nginx.pid;
  32. # Load dynamic modules. See /usr/share/nginx/README.dynamic.
  33. include /usr/share/nginx/modules/*.conf;
  34. events {
  35. worker_connections 1024;
  36. }
  37. http {
  38. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  39. '$status $body_bytes_sent "$http_referer" '
  40. '"$http_user_agent" "$http_x_forwarded_for"';
  41. access_log /var/log/nginx/access.log main;
  42. sendfile on;
  43. tcp_nopush on;
  44. tcp_nodelay on;
  45. keepalive_timeout 65;
  46. types_hash_max_size 2048;
  47. include /etc/nginx/mime.types;
  48. default_type application/octet-stream;
  49. # Load modular configuration files from the /etc/nginx/conf.d directory.
  50. # See http://nginx.org/en/docs/ngx_core_module.html#include
  51. # for more information.
  52. include /etc/nginx/conf.d/*.conf;
  53. server {
  54. listen {{nginx_port}} default_server;
  55. listen [::]:{{nginx_port}} default_server;
  56. server_name _;
  57. root /usr/share/nginx/html;
  58. # Load configuration files for the default server block.
  59. include /etc/nginx/default.d/*.conf;
  60. location / {
  61. }
  62. error_page 404 /404.html;
  63. location = /40x.html {
  64. }
  65. error_page 500 502 503 504 /50x.html;
  66. location = /50x.html {
  67. }
  68. }
  69. # Settings for a TLS enabled server.
  70. #
  71. # server {
  72. # listen 443 ssl http2 default_server;
  73. # listen [::]:443 ssl http2 default_server;
  74. # server_name _;
  75. # root /usr/share/nginx/html;
  76. #
  77. # ssl_certificate "/etc/pki/nginx/server.crt";
  78. # ssl_certificate_key "/etc/pki/nginx/private/server.key";
  79. # ssl_session_cache shared:SSL:1m;
  80. # ssl_session_timeout 10m;
  81. # ssl_ciphers HIGH:!aNULL:!MD5;
  82. # ssl_prefer_server_ciphers on;
  83. #
  84. # # Load configuration files for the default server block.
  85. # include /etc/nginx/default.d/*.conf;
  86. #
  87. # location / {
  88. # }
  89. #
  90. # error_page 404 /404.html;
  91. # location = /40x.html {
  92. # }
  93. #
  94. # error_page 500 502 503 504 /50x.html;
  95. # location = /50x.html {
  96. # }
  97. # }
  98. }
  99. [root@centos7 ansible]#cat roles/nginx/vars/main.yml
  100. nginx_port: 8080
  101. [root@centos7 ansible]#cat nginx.yml
  102. - hosts: web
  103. remote_user: root
  104. roles:
  105. - role: nginx
  106. when: ansible_distribution_major_version== "7"
  107. [root@centos7 ansible]#ansible-playbook nginx.yml

安装memcached

  1. [root@centos7 memcached]#tree
  2. .
  3. ├── tasks
  4.    └── main.yml
  5. └── templates
  6. └── memcached.j2
  7. [root@centos7 memcached]#cat tasks/main.yml
  8. - name: install package
  9. yum: name=memcached
  10. - name: template
  11. template: src=memcached.j2 dest=/etc/sysconfig/memcached
  12. - name: start service
  13. service: name=memcached state=started enabled=yes
  14. [root@centos7 memcached]#cat templates/memcached.j2
  15. PORT="11211"
  16. USER="memcached"
  17. MAXCONN="1024"
  18. CACHESIZE="{{ansible_memtotal_mb//4}}" //这里的意思占用总内存的四分之一
  19. OPTIONS=""
  20. [root@centos7 ansible]#cat memcached.yml
  21. - hosts: web
  22. remote_user: root
  23. roles:
  24. - role: memcached
  25. when: ansible_distribution_major_version== "7"
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注