ansible初识三
一、setup模块
ansible的 setup模块主要用来收集信息, 查看参数:
[root@localhost ~]# ansible-doc -s setup # 查看参数,部分参数如下: filter # 过滤,筛选
示例一:查看所有信息
ansible cache -m setup # 查看cache组的被管控机的信息, 可查到部分信息如下
ansible_all_ipv4_addresses # ipv4的所有地址 ansible_all_ipv6_addresses # ipv6的所有地址 ansible_date_time # 获取到控制节点时间 ansible_default_ipv4 # 默认的ipv4地址 ansible_distribution # 系统 ansible_distribution_major_version # 系统的大版本 ansible_distribution_version # 系统的版本号 ansible_domain # 系统所在的域 ansible_env # 系统的环境变量 ansible_hostname # 系统的主机名 ansible_fqdn # 系统的全名(主机名+域名) ansible_machine # 系统的架构 ansible_memory_mb # 系统的内存信息 ansible_os_family # 系统的家族 ansible_pkg_mgr # 系统的包管理工具 ansible_processor_cores # 系统的cpu的核数(每颗) ansible_processor_count # 系统cpu的颗数 ansible_processor_vcpus # 系统cpu的总个数=cpu的颗数*CPU的核数 ansible_python # 系统上的python
示例二:搜索某个信息
ansible cache -m setup -a 'filter=*processor*' #用来搜索, *代表匹配任意个任意字符,可自行回顾正则表达式相关知识,可得如下信息
192.168.133.132 | SUCCESS => { "ansible_facts": { "ansible_processor": [ "0", "GenuineIntel", "Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz" ], "ansible_processor_cores": 1, "ansible_processor_count": 1, "ansible_processor_threads_per_core": 1, "ansible_processor_vcpus": 1 }, "changed": false }
二、ansible剧本
1、条件判断
ansible的playbook 支持条件判断, 当针对不同系统, 不同版本, 不同环境, 不同用户有不同操作时,可以使用 when 做条件判断, 示例如下:
[root@localhost yaml]# vi p5.yml # 写一个yml文件,内容如下: - hosts: db remote_user: root tasks: - name: createfile3 copy: content="大弦嘈嘈如急雨" dest=/tmp/a.txt when: a=="3" - name: createfile4 copy: content="小弦切切如私语" dest=/tmp/a.txt when: a=="4" [root@localhost yaml]# ansible-playbook --syntax-check p5.yml # 验证语法合法性 playbook: p5.yml [root@localhost yaml]# ansible-playbook -e 'a="3"' p5.yml # 只执行name为 createfile3 的任务,结果自行验证
3、循环with_items
通常你想在一个任务中干很多事,比如创建一群用户、安装很多包、或者重复一个轮询步骤直到收到某个特定结果,这时就可以使用循环。
循环里面只能是 item
示例一:单个循环
[root@localhost yaml]# vi p7.yml - hosts: web tasks: - name: createuser user: name={{ item }} with_items: - zhangsan - lisi - wangwu [root@localhost yaml]# ansible-playbook --syntax-check p7.yml playbook: p7.yml [root@localhost yaml]# ansible-playbook p7.yml
示例二:多个循环
[root@localhost yaml]# vi p8.yml # 写入如下内容 - hosts: web tasks: - name: createuser user: name={{ item }} with_items: - zs - lss - ww - name: creategroup group: name={{ item }} with_items: - yunwei - kaifa - ceshi [root@localhost yaml]# vi p8.yml [root@localhost yaml]# ansible-playbook --syntax-check p8.yml playbook: p8.yml [root@localhost yaml]# ansible-playbook p8.yml # 执行命令,结果自行验证
示例三:循环嵌套
[root@localhost yaml]# vi p9.yml # 写入如下内容 - hosts: web tasks: - name: creategroup group: name={{ item }} with_items: - yunwei - kaifa - ceshi - name: createuser user: name={{ item.name }} group={{ item.group }} with_items: - {'name':zs,'group':yunwei} - {'name':lss,'group':kaifa} - {'name':ww,'group':ceshi} [root@localhost yaml]# ansible-playbook p9.yml # 结果自行验证 playbook: p9.yml [root@localhost yaml]# ansible-playbook p9.yml
4、template模块
先来回忆一下redis的安装,为了安全起见,我们通常在redis安装完成后要更改redis的配置文件redis.conf,其中有一项是更改bind参数,让redis可以远程访问,实际开发中bind 参数为本机对外ip地址,而不能使用0.0.0.0开启,这时,问题来了,使用ansible批量传输配置文件时,如何将bind参数设置为被管控机的ip地址?
首先,我们使用setup模块查询一下被管控机的ip地址,如下:
在管控机上安装redis后,编辑配置文件redis.conf,更改bind参数如下:
vi /etc/redis.conf # 编辑redis配置文件,更改bind参数为如下内容
示例:
[root@localhost yaml]# vi p10.yml - hosts: web tasks: - name: install yum: name=redis - name: copyfile template: src=/etc/redis.conf dest=/etc/redis.conf - name: start service: name=redis state=started [root@localhost yaml]# ansible-playbook --syntax-check p10.yml playbook: p10.yml [root@localhost yaml]# ansible-playbook p10.yml
验证:查看web组的被管控机的redis配置文件中bind参数
copy 模块与template 模块的区别: copy 模块不替换参数, 而template模块替换参数.使用相对路径: 在上面p10.yml 中, template模块的src参数使用的是绝对路径, 除此之外,我们还可以使用相对路径,如下 :
[root@localhost yaml]# vi p10.yml - hosts: web tasks: - name: install yum: name=redis - name: copyfile template: src=redis.conf dest=/etc/redis.conf - name: start service: name=redis state=started [root@localhost yaml]# ansible-playbook --syntax-check p10.yml playbook: p10.yml [root@localhost yaml]# ansible-playbook p10.yml
注意: 使用相对路径的前提是在当前目录 (p10.yml 文件所在目录) 下 新建一个templates (必须叫这个) 目录, 然后把文件redis.conf放在templates目录里面
5、handlers
上面我们曾提到过, modul 具有 "幂等" 性, 所以当远端系统被人修改时, 可以重放 playbooks 达到恢复的目的, playbooks 本身可以识别这种改动, 并且有一个基本的event sysem(事件系统), 可以响应这种改动, (当发生改动时) 'notify' actions 会在playbook的每一个task结束时触发, 而且即使有多个不同的task 通知改动的发生 , notify actions 只会被触发一次.
举例来说,比如多个 resources 指出因为一个配置文件被改动,所以 apache 需要重新启动,但是重新启动的操作只会被执行一次。
'notify' 下列出的即是 handlers。Handlers 也是一些 task 的列表,通过名字来引用,它们和一般的 task 并没有什么区别。Handlers 是由通知者进行 notify,如果没有被 notify,handlers 不会执行,不管有多少个通知者进行了 notify,等到 play 中的所有 task 执行完成之后,handlers 也只会被执行一次。
示例:
[root@localhost yaml]# vi p11.yml - hosts: web tasks: - name: install yum: name=redis - name: copyfile template: src=redis.conf dest=/etc/redis.conf tags: copyfile notify: restart - name: start service: name=redis state=started handlers: - name: restart service: name=redis state=restarted [root@localhost yaml]# [root@localhost yaml]# ansible-playbook --syntax-check p11.yml playbook: p11.yml [root@localhost yaml]# [root@localhost yaml]# ansible-playbook p11.yml [root@localhost yaml]# ansible-playbook -t copyfile p11.yml # 执行copyfile任务 和 restart任务,即修改完配置文件后重启redis服务
三、roles
现在我们已经学过 tasks 和 handlers,那怎样组织 playbook 才是最好的方式呢?简单的回答就是:使用 roles ! roles 基于一个已知的文件结构,去自动的加载某些 vars_files,tasks 以及 handlers。基于 roles 对内容进行分组,使得我们可以容易地与其他用户分享 roles 。
roles的优点:
-
roles目录结构:
- 文件夹里面是要创建的每一个角色,每一个角色一个文件夹;
- 每一个角色里面都有tasks(必须的),templates,files,handlers,vars目录;
- 每个目录都要有main.yml文件,通过import_tasks来调用;
- 其中templates文件夹中的文件可以通过相对路径来调用;
root
├── roles
│ ├── cache
│ ├── db
│ └── web
│ ├── files
│ ├── handlers
│ │ └── main.yml
│ ├── tasks
│ │ ├── copy_redis_conf.yml
│ │ ├── install_redis.yml
│ │ ├── main.yml
│ │ └── start_redis.yml
│ ├── templates
│ │ └── redis.conf.j2
│ └── vars
└── web.yml
- name: install_redis
yum: name=redis
- name: copy_redis_conf template: src=redis.conf.j2 dest=/etc/redis.conf tags: copy_redis_conf notify: restart_redis
- name: start_redis
service: name=redis state=started
- import_tasks: install_redis.yml - import_tasks: copy_redis_conf.yml - import_tasks: start_redis.yml
- name: restate_redis
service: name=redis state=restarted
- hosts: web
remote_user: root
roles:
- web
ansible-playbook web.yml ansible-playbook -t copy_redis_conf web.yml # 修改配置文件后加参数-t,触发handler中任务
四、nginx基于uwsgi部署django
参考博客:https://blog.51cto.com/wangfeng7399/2341281
思考:如何用roles 来安装nginx+uwsgi+mariadb + redis?