ansible入门02

1.常用模块

1.1 group模块

添加或删除组
            name=
            state=:present(添加),absent(删除)
            system=:1或true为添加系统组
            gid=
ansible all -m group -a "name=test state=present system=1 gid=600"
ansible all -m group -a "name=test2 state=present gid=1010"

1.2 script模块:

运行本地的脚本在远程主机上。依赖于某个文件才能运行,需要指定某个脚本文件的路径(本地的脚本文件),它会自动复制到远程主机上运行
            -a "/PATH/TO/SCRIPT_FILE"
类似于command或shell。这个路径是本机文件路径。

1.3 template模块:

基于模板方式生成一个文件复制到远程主机
            src=:源地址
            dest=:目标地址
            owner=:属主
            group=:属组
            mode=:权限0644

2. playbook的其它组件

2.1 变量:

变量的定义:
ansible facts:系统变量可以直接调用
ansible-playbook  -e "var=value":自己定义变量,传递变量
host variable: host iventory:定义主机变量,在hosts文件中添加
group variable:组变量定义方式。定义的变量对于组内所有主机生效
[groupname:vars]
var=value
roles

变量调用:{{ variable }}
 
在playbook中定义变量的方法:
            vars:
            - var1: value1
            - var2: value2

2.2 模板:templates

模板文件是一种文本文件,嵌套有脚本(使用模板编程语言编写)
python中的嵌入式编程语言是Jinja2

jinjia2的语法:
字面量:
字符串:使用单引号或双引号;
数字:整数,浮点数;
列表:[item1, item2, ...],值可变数据类型
元组:(item1, item2, ...),值不可变
字典:{key1:value1, key2:value2, ...}
布尔型:true/false

算术运算:
+, -, *(乘), /(除), //(整除), %(取余), **(次方)

比较操作:
==(等值比较), !=(不等值比较), >, >=, <, <=

逻辑运算:
and, or, not
示例:   
在nginx配置文件中修改配置文件nginx.conf.j2:
worker_processes {{ ansible_processor_vcpus }};
#或者worker_processes {{ ansible_processor_vcpus-1 }}; #使用减法运算
listen {{ http_port }};       #设置监听端口,也可以使用我们自定义的变量(在hosts文件中对每一个分别设置)
在/etc/ansible下添加playbook文件如下:
- hosts: websrvs
  remote_user: root
  tasks:
  - name: install nginx
    yum: name=nginx state=present
  - name: install conf file
    template: src=files/nginx.conf.j2 dest=/etc/nginx/nginx.conf
    notify: restart nginx
    tags: instconf
  - name: start nginx service
    service: name=nginx state=started
  handlers:
  - name: restart nginx
    service: name=nginx state=restarted  
ansible-playbook nginx.conf.yaml
 
模板配置文件 :nginx.conf.j2
worker_processes {{ ansible_processor_vcpus }};
listen {{ http_port }};

2.3 条件判断

判断系统版本,系统类型,根据这些不同做出不同的应对
ansible all -m setup | grep ansible_os_family #查看系统家族,CentOS显示RedHat
条件测试:
when语句,在task列表中使用,jinja2的语法格式
tasks:
- name: install conf file to centos7
  template: src=files/nginx.conf.c7.j2
  when: ansible_distribution_major_version == "7"   #如果是CentOS7的时候
- name: install conf file to centos6
  template: src=files/nginx.conf.c6.j2
  when: ansible_distribution_major_version == "6"   #如果是CentOS6时
scp root@172.18.100.69:/etc/nginx/nginx.conf files/nginx.conf.c6.j2 
#把远程主机(CentOS6)上的文件拉取到本地

2.4 循环

循环:迭代,需要重复执行的任务;
对迭代项的引用,固定变量名为”item“
而后,要在task中使用with_items定义给定要迭代的元素列表;

列表方法:
1.字符串
2.字典:每一个元素是一个字典

列表方法1:字符串方式
            - name: install some packages
              yum: name={{ item }} state=present
              with_items:
              - nginx
              - memcached
              - php-fpm
- hosts: all
  remote_user: root
  tasks:
  - name: install some packages
    yum: name={{ item }} state=present
    with_items:
    - nginx
    - memcached
    - php-fpm
ansible-playbook item.yaml  #如果没有定义好yum源,出现问题就会终止

列表方法2:字典方式
- hosts: all
  remote_user: root
  tasks:
  - name: add some groups
    group: name={{ item }} state=present
    with_items:
    - group11
    - group12
    - group13
  - name: add some users
    user: name={{ item.name }} group={{ item.group }} state=present
    with_items:
    - { name: 'user11', group: 'group11' }  #键值与键值之间用“:”隔开
    - { name: 'user12', group: 'group12' }
    - { name: 'user13', group: 'group13' }
ansible-playbook useradd.yaml

2.5 角色(roles):

如何实现yaml定义的模块重用?
服务器角色并不单一
如果能够把配置的每个配置段独立化,模块化
角色调用,直接调用服务器主机的公共模块,谁用谁调,直接方便
好处:跟远程主机分离,调用方便

角色集合:其实就是一个目录,角色名就是目录名
roles/
    mysql/
    httpd/
    nginx/
    memcached/

角色的格式:
        每个角色,以特定的层级目录结构进行组织:
            mysql/
                files/ :存放由copy(复制的文件)或script(脚本文件)模块等调用的文件;
                templates/:template模块查找所需要模板文件的目录;
                tasks/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;(基本组件,必须有)
                handlers/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
                vars/:至少应该包含一个名为main.yml的文件;其它的文件需要在此文件中通过include进行包含;
                meta/:至少应该包含一个名为main.yml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要在此文件中通过include进行包含;
                default/:设定默认变量时使用此目录中的main.yml文件;
mkdir -pv roles/{httpd,nginx,mysql}/{files,templates,tasks,handlers,vars,meta,default}
在playbook调用角色方法1:
一个主机上可以调用多个角色
- hosts: websrvs
  remote_user: root
  roles:
  - mysql
  - memcached
  - nginx
在playbook调用角色方法2:传递变量给角色
- hosts:
  remote_user:
  roles:
  - { role: nginx, username: nginx }
 键role用于指定角色名称;后续的k/v用于传递变量给角色;

 例:
mkdir /etc/ansible/roles/nginx
cp /root/working/files/nginx.conf.j2 templates/ #复制准备好的配置文件/templates文件夹中
#在roles/nginx/tasks/main.yaml中配置
- name: install nginx packages
  yum: name=nginx state=present
- name: install conf file
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
- name: start nginx
  service: name=nginx state=started enabled=true
#创建执行文件nginx.yaml
- hosts: all
  remote_user: root
  roles:
  - nginx
ansible-playbook --check nginx.yaml
ansible-playbook nginx.yaml


定义一个触发器:
#创建roles/nginx/handlers/main.yaml
- name: restart nginx
  service: name=nginx state=restarted
#在tasks/main.yaml中重新定义
- name: install nginx packages
  yum: name=nginx state=present
  tags:install
- name: install conf file
  template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
  notify: restart nginx   #定义通知机制,当模版发生改变时就通知handlers模块,重启服务
  tags:conf
- name: start nginx
  service: name=nginx state=started enabled=true
  tags:nginxst
ansible-playbook -t install,conf nginx.yaml

使用变量:
1.直接定义
#编辑user.yaml
- hosts: all
  romote_user: root
  vars:
  - username: testuser1
  - groupname: testgroup1
  tasks:
  - name: creat group
    group: name={{ groupname }} state=present
  - name: creat user
    user: name={{ username }} state=present
从命令行传递参数,直接把下面定义的变量覆盖掉,例:
ansible-playbook -e "groupname=mygrp1" -e "username=myuser1" myuser.yaml
2.在角色中定义变量
#在要传给远程主机的nginx配置文件中修改
user {{ username }};
#在roles/nginx/vars/main.yaml
ansible-playbook --check nginx.yaml
ansible-playbook nginx.yaml

ansibel-playbook -e "username=adm" --check nginx.yaml
ansibel-playbook -t conf -e "username=adm" nginx.yaml #直接修改
3.在playbook调用角色方法:传递变量给角色
- hosts: all
  remote_user: root
  roles:
  - { role: nginx, username: nginx }
ansible-playbook运行过后可以看到,运行nginx的用户为nginx

注意:1.键role用于指定角色名称;后续的k/v用于传递变量给角色;
           2.还可以基于条件测试实现角色调用;
            roles:
            - { role: nginx, when: "ansible_distribution_major_version == '7' " }
               只有当系统主版本号为“7”的时候,才会运行nginx角色
            这里可以定义n个角色
- hosts: all
  remote_user: root
  roles:
  - { role: nginx, username: nginx, when: "ansible_distribution_major_version == '7' " }
例:
mkdir -pv /etc/ansible/roles/memcached/tasks
vim tasks/main.yaml
#下面是main.yaml的内容
- name: install package
  yum: name=memcached state=present
- name: start memcached
  service: name=memcached state=started enabled=true
vim mem.yaml
#下面是mem.yaml的内容
- hosts: all
  remote_user: root
  roles:
  - { role: nginx, when: ansible_distribution_major_version == '7' }
  - { role: memcached, when: ansible_hostname == 'memcached' }

例:如何设置memcached所使用的空间是系统闲置空间的1/4?
把/etc/sysconfig/memcached中的“CACHESIZE="64" ”改为1/4
mkdir roles/memcached/templates
scp root@172.18.100.69:/etcsysconfig/memcached ./roles/memcached/templates #从远程主机上下载配置文件
ansible all -m setup


vim ./roles/memcached/templates/memcached
#将CACHESIZE="64"改为
CACHESIZE="{{ ansible_memtotal_mb //4 }}"
mv ./roles/memcached/templates/memcached{,.j2}  #改后缀名j2
vim ./roles/memcached/tasks/main.yaml


#以下是main.yaml中的内容
- name: install package
  yum: name=memcached state=present
- name: install conf file
  templates: src=/etc/ansible/roles/templates/memcached.j2 dest=/etc/sysconfig/memcached
  notify: restart memcached
  tags: memconf
- name: start memcached
  service: name=memcached state=started enabled=true

mkdir memcached/handlers
vim ./handlers/main.yaml


#main.yaml
- name: restart memcached
  service: name=memcached state=restarted


ansible-playbook /etc/ansible/roles/mem.yaml
测试使用
使用ansible一键搞定:
1.3台主机配置主/备模式高可用keepalived+nginx(proxy)
   两台主机:httpd+php
   一台主机:mysql-server或mariadb-server;
建议sudo的时候把sudo用户加到管理员组里面,给与与root用户相同的权限
http://www.ansible.com.cn

















原文地址:https://www.cnblogs.com/zhangpf/p/7410327.html