ansible自动化运维
特点不需要安装客服端通过sshd通信。基于模块化工作支持sudo。批量执行可以写成脚本用python编写维护更简单。
只需要在一台服务器上安装yum -y install ansible
Ansible 配置密钥
ssh-keygen -t rsa  直接回车即可不用设置密钥密码
把公钥(id_rsa.pub内容放到客服端的/root/.ssh/authorized_keys里面
scp .ssh/id_rsa.pub  客服端地址:/root/.ssh/authorized_keys


本机也要操作  cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys


chmod 600 /root/.ssh/authorized_keys
关闭selinux setenforce 0


错误 "msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"
解决 yum install -y libselinux-python


ansible的一些常用模块copy yum cron command shell service user group synchronize


ansible-doc -l 查看ansible的所有模块
ansible-doc -s +模块名 表示查看模块的用法


module_name='ping'      这里是模块的名字
module_args=''          # 附带的参数你懂的
pattern='lvs-bj-*'      #主机的匹配
forks=10                 fork 进程



Ansible更改配置文件
vi /etc/ansible/hosts 
//增加


[testhost]


需要自动配置的客服的ip


说明 testhost为主机组名字自定义的。 下面ip为组内的机器ip
如果是连续的几个ip 可以192.168.6.[2:100] 表示6.2到6.100的地址
也可以指定登陆用户
ip + ansible_ssh_user=root
ip + ansible_ssh_user=root ansible_ssh_port= port
ansible_ssh_(user管理远程主机账号,port,host被管理的主机)




Ansible 远程执行命令
ansible 组/ip/all -m commandraw -a 'w'  ansible 组/ip -m command/shell -a '命令‘


这样就可以批量执行命令了。这里的testhost 为主机组名-m后边是模块名字-a后面是命令。
我们也可以直接写一个ip针对某一台机器来执行命令。
ansible 127.0.0.1 -m  command -a 'hostname'
错误 "msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"
解决 
yum install -y libselinux-python
还有一个模块就是shell同样也可以实现 ansible testhost -m shell -a 'w'


command## 在远程主机上执行命令相关选项如下
creates一个文件名当该文件存在则该命令不执行free_form要执行的linux指令
chdir在执行指令之前先切换到该目录removes一个文件名当该文件不存在则该选项不执行
executable切换shell来执行指令该执行路径必须是一个绝对路径


Ansible 拷贝文件或目录
ansible 组/ip -m copy -a "src=源目录位置  dest=/目标目录位置 owner=root group=root mode=0755"
注意源目录会放到目标目录下面去如果目标指定的目录不存在它会自动创建。如果拷贝的是文件dest指定的名字和源如果不同并且它不是已经存在的目录相当于拷贝过去后又重命名。但相反如果desc是目标机器上已经存在的目录则会直接把文件拷贝到该目录下面。
ansible testhost -m copy -a "src=/etc/passwd dest=/tmp/1.txt"
这里的/tmp/123和源机器上的/etc/passwd是一致的但如果目标机器上已经有/tmp/123目录则会再/tmp/123目录下面建立passwd文件


copy## 复制文件到远程主机  相关选项如下
backup在覆盖之前将源文件备份备份文件包含时间信息。有两个选项yes|no
content用于替代“src”可以直接设定指定文件的值
dest必选项。要将源文件复制到的远程主机的绝对路径如果源文件是一个目录那么该路径也必须是个目录
directory_mode递归设定目录的权限默认为系统默认权限
force如果目标主机包含该文件但内容不同如果设置为yes则强制覆盖如果为no则只有当目标主机的目标位置不存在该文件时才复制。默认为yes
others所有的file模块里的选项都可以在这里使用
src被复制到远程主机的本地文件可以是绝对路径也可以是相对路径。如果路径是一个目录它将递归复制。在这种情况下如果路径使用“/”来结尾则只复制目录里的内容如果没有使用“/”来结尾则包含目录在内的整个内容全部复制类似于rsync。


ansible 主机池 -m setup 查看远程主机的一般信息。
ansible 主机池 -m ping  查看远程主机的运行状态。


file## 设置文件的属性
force需要在两种情况下强制创建软链接一种是源文件不存在但之后会建立的情况下另一种是目标软链接已存在需要先取消之前的软链然后创建新的软链有两个选项yes|no     group定义文件/目录的属组mode定义文件/目录的权限
owner定义文件/目录的属主path必选项定义文件/目录的路径
recurse递归设置文件的属性只对目录有效src被链接的源文件路径只应用于state=link的情况
dest被链接到的路径只应用于state=link的情况
state
       directory如果目录不存在就创建目录
       file即使文件不存在也不会被创建
       link创建软链接
       hard创建硬链接
       touch如果文件不存在则会创建一个新的文件如果文件或目录已存在则更新其最后修改时间
       absent删除目录、文件或者取消链接文件
Ansible远程执行脚本
先创建一个shell脚本
vim  /tmp/test.sh  //加入内容
#!/bin/bash
echo `date` > /tmp/ansible_test.txt
然后把该脚本分发到各个机器上ansible testhost -m copy -a "src=/tmp/test.sh dest=/tmp/test.sh mod=0755"
最后是批量执行该shell脚本ansible testhost -m shell -a "/tmp/test.sh"
shell模块还支持远程执行命令并且带管道ansible testhost -m shell -a "cat /etc/passwd|wc -l "


Ansible实现任务计划
ansible testhost -m cron -a "name='test cron' job表示执行一个命令='/bin/touch /tmp/1212.txt'  weekday=6“


若要删除该cron 只需要加一个字段 state=absent    ansible testhost -m cron -a "name='test cron' state=absent “


  其他的时间表示分钟 minute 小时 hour 日期 day 月份 month


Ansible安装rpm包/管理服务
ansible testhost -m yum -a "name=httpd " 在name后面还可以加上state=installed
     ansible testhost -m service -a "name=httpd state=startedstopped enabled=yes(no)" 这里的name是centos系统里的服务名可以通过chkconfig --list查到。


Ansible文档的使用
ansible-doc -l   列出所有的模块   ansible-doc cron  查看指定模块的文档





Ansible playbook的使用
相当于把模块写入到配置文件里面

cat  /etc/ansible/test.yml


---
 
- hosts: 主机/主
 
   remote_user: root
 
   tasks:
   
     - name: test_playbook
 
       shell: touch /tmp/lishiming.txt


说明hosts参数指定了对哪些主机进行参作
user参数指定了使用什么用户登录远程主机操作
tasks指定了一个任务其下面的name参数同样是对任务的描述在执行过程中会打印出来。
执行ansible-playbook test.yml


再来一个创建用户的例子cat /etc/ansible/create_user.yml


---
 -name: create_user
 
  hosts: 主机/组


  user: root


  gather_facts: false
 
  vars:
  
    - user: "test"
 
  tasks:
   
    - name: create user
  
      user: name="` user `"  home shell state remove uid 添加一些权限


说明name参数对该playbook实现的功能做一个概述后面执行过程中会打印 name变量的值 可以省略gather_facts参数指定了在以下任务部分执行前是否先执行setup模块获取主机相关信息这在后面的task会使用到setup获取的信息时用到vars参数指定了变量这里指字一个user变量其值为test 需要注意的是变量值一定要用引号引住user提定了调用user模块name是user模块里的一个参数而增加的用户名字调用了上面user变量的值。
ansible 主机名 -m setup 收集服务器的一些详细信息。。。。。。。。。。。。。。。。。。。。。。对于判断有用。
 


` item ` 设置一个变量
Ansible playbook中的循环
---


- hosts: 主机/组
  user: root


  tasks:
  
   - name: change mode for files
  
     file: path=/tmp/` item ` mode=600
 owner=root group=root   变量一定是item
     with_items:
  取变量参数值 
      - 1.txt
     
      - 2.txt
       
      - 3.txt


Ansible playbook条件判断
---


 - hosts: 主机/组
   user: root
 
   gather_facts: True
     是通过 ansible 主机 -m setup 来查看
   tasks:
   
    - name: use when
  
      shell: touch /tmp/when.txt
   
      when: facter_ip address == "172.7.15.106" 通过 ansible 客服端 -m setup



Ansible playbook中的handlers


执行task之后服务器发生变化之后要执行的一些操作比如我们修改了配置文件后需要重启一下服务


---


- name: handlers test
 
  hosts: web10.aming.com
 
  user: root
 
  tasks:


    - name: copy file


      copy: src=/etc/passwd dest=/tmp/aaa.txt


      notify: test handlers


  handlers:


    - name: test handlers


      shell: echo "111111" >> /tmp/aaa.txt


说明只有copy模块真正执行后才会去调用下面的handlers相关的操作。也就是说如果1.txt和2.txt内容是一样的并不会去执行handlers里面的shell相关命令。 这种比较适合配置文件发生更改后重启服务的操作。适合同步操作。




思路先在一台机器上编译安装好nginx、打包然后再用ansible去下发
cd /etc/ansible
  进入ansible配置文件目录
mkdir  nginx_install   创建一个nginx_install的目录
方便管理
cd nginx_install;
mkdir -p roles/{common,delete,install}/{handlers,files,meta,tasks,templates,vars}


说明roles目录下有两个角色common为一些准备操作tasksinstall为安装nginx的操作。delete为删除操作。
每个角色下面又有几个目录
handlers下面是当发生改变时要执行的操作通常用在配置文件发生改变重启服务。
files为安装时用到的一些文件
meta为说明信息说明角色依赖等信息
tasks里面是核心的配置文件
templates通常存一些配置文件启动脚本等模板文件
vars下为定义的变量
        需要事先准备好安装用到的文件具体如下


在一台机器上事先编译安装好nginx配置好启动脚本配置好配置文件
安装好后我们需要把nginx目录打包并放到/etc/ansible/nginx_install/roles/install/files/下面名字为nginx.tar.gz
启动脚本、
配置文件都要放到/etc/ansible/nginx_install/roles/install/templates下面
cd  /etc/ansible/nginx_install/roles
定义common的tasksnginx是需要一些依赖包的


vim  ./common/tasks/main.yml
//内容如下


- name: Install initializtion require software


  yum: name=` item ` state=installed


  with_items:


    - zlib-devel


    - pcre-devel



定义变量
vim   /etc/ansible/nginx_install/roles/install/vars/main.yml
 //内容如下


nginx_user: www


nginx_port: 80


nginx_basedir: /usr/local/nginx



首先要把所有用到的文档拷贝到目标机器


vim   /etc/ansible/nginx_install/roles /install/tasks/copy.yml
//内容如下


- name: Copy Nginx Software


  copy: src=nginx.tar.gz dest=/tmp/nginx.tar.gz owner=root group=root
-
  name: Uncompression Nginx Software


  shell: tar zxf /tmp/nginx.tar.gz -C /usr/local/


- name: Copy Nginx Start Script


  template: src=nginx dest=/etc/init.d/nginx owner=root group=root mode=0755


- name: Copy Nginx Config


  template: src=nginx.conf dest=` nginx_basedir `/conf/ owner=root group=root mode=0644



接下来会建立用户启动服务删除压缩包


vim  /etc/ansible/nginx_install/roles /install/tasks/install.yml
 //内容如下


- name: Create Nginx User


  user: name=` nginx_user ` state=present createhome=no
  shell=/sbin/nologin


- name: Start Nginx Service


  service: name=nginx state=restarted


- name: Add Boot Start Nginx Service


  shell: chkconfig --level 345 nginx on


- name: Delete Nginx compression files


  shell: rm -rf /tmp/nginx.tar.gz


再创建main.yml并且把copy和install调用
 
vim /etc/ansible/nginx_install/roles /install/tasks/main.yml
 //内容如下


- include: copy.yml


- include: install.yml


到此两个rolescommon和install就定义完成了接下来要定义一个入口配置文件
vim  /etc/ansible/nginx_install/install.yml
  //内容如下


---


- hosts: testhost


  remote_user: root


  gather_facts: True


  roles:


    - common


    - install
执行 ansible-playbook /etc/ansible/nginx_install/install.yml
下载整个样例库   
git clone git://github.com/dl528888/ansible-examples.git
git命令
需要yum先安装一下 yum install -y git


生产环境中大多时候是需要管理配置文件的安装软件包只是在初始化环境的时候用一下。
下面我们来写个管理nginx配置文件的playbook
mkdir  -p /etc/ansible/nginx_config/roles/{new,old}/{files,handlers,vars,tasks}
其中new为更新时用到的old为回滚时用到的files下面为nginx.conf和vhosts目录handlers为重启nginx服务的命令
关于回滚需要在执行playbook之前先备份一下旧的配置所以对于老配置文件的管理一定要严格千万不能随便去修改线上机器的配置并且要保证new/files下面的配置和线上的配置一致
先把nginx.conf和vhosts目录放到files目录下面
cd /usr/local/nginx/conf/
cp -r nginx.conf vhosts  /etc/ansible/nginx_conf/roles/new/files/



vim /etc/ansible/nginx_config/roles/new/vars/main.yml
 //定义变量


nginx_basedir: /usr/local/nginx


vim /etc/ansible/nginx_config/roles/new/handlers/main.yml
  //定义重新加载nginx服务
- name: restart nginx


  shell: /etc/init.d/nginx
  reload


  vim /etc/ansible/nginx_config/roles/new/tasks/main.yml //这是核心的任务


- name: copy conf file


  copy: src=` item`.`src ` dest=` nginx_basedir `/` item`.`dest ` backup=yes owner=root group=root mode=0644


  with_items:


    - { src: nginx.conf, dest: conf/nginx.conf }


    - { src: vhosts, dest: conf/ }
  notify: restart nginx



vim /etc/ansible/nginx_config/update.yml
// 最后是定义总入口配置
---


- hosts: testhost


  user: root


  roles:
  - new
执行 ansible-playbook /etc/ansible/nginx_config/update.yml
而回滚的backup.yml对应的roles为old
rsync -av  /etc/ansible/nginx_config/roles/new/
/etc/ansible/nginx_config/roles/old/
回滚操作就是把旧的配置覆盖然后重新加载nginx服务