cmkzjw 发表于 2018-7-30 08:36:14

ansible-10846468

  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
  //增加
  
  需要自动配置的客服的ip
  说明 testhost为主机组名字自定义的。 下面ip为组内的机器ip
  如果是连续的几个ip 可以192.168.6. 表示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 -mcommand -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配置文件目录
  mkdirnginx_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

  >  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服务
页: [1]
查看完整版本: ansible-10846468