1、命令

1.1、ansible系列命令

  1. Ansible系列命令
  2. ansible ansible-doc ansible-playbook ansible-vault ansible-console
  3. ansible-galaxy ansible-pull
  4. ansible-doc: 显示模块帮助
  5. ansible-doc [options] [module...]
  6. -a 显示所有模块的文档
  7. -l, --list 列出可用模块
  8. -s, --snippet 显示指定模块的playbook片段(简化版,便于查找语法)
  9. 示例:
  10. ansible-doc -l 列出所有模块
  11. ansible-doc ping 查看指定模块帮助用法
  12. ansible-doc -s ping 查看指定模块帮助用法
  13. 可以通过网上写好的
  14. ansible-galaxy
  15. > 连接 https://galaxy.ansible.com
  16. 下载相应的roles(角色)
  17. > 列出所有已安装的galaxy
  18. ansible-galaxy list
  19. > 安装galaxy
  20. ansible-galaxy install geerlingguy.redis
  21. > 删除galaxy
  22. ansible-galaxy remove geerlingguy.redis
  23. ansible-pull
  24. 推送命令至远程,效率无限提升,对运维要求较高
  25. ansible-playbook 可以引用按照标准的yml语言写的脚本
  26. 执行playbook
  27. 示例:ansible-playbook hello.yml
  28. cat hello.yml
  29. #hello world yml file
  30. - hosts: websrvs
  31. remote_user: root
  32. tasks:
  33. - name: hello world
  34. command: /usr/bin/wall hello world
  35. ansible-vault (了解)
  36. 功能:管理加密解密yml文件
  37. ansible-vault [create|decrypt|edit|encrypt|rekey|view]
  38. ansible-vault encrypt hello.yml 加密
  39. ansible-vault decrypt hello.yml 解密
  40. ansible-vault view hello.yml 查看
  41. ansible-vault edit hello.yml 编辑加密文件
  42. ansible-vault rekey hello.yml 修改口令
  43. ansible-vault create new.yml 创建新文件
  44. Ansible-console2.0+新增,可交互执行命令,支持tab (了解)
  45. root@test (2)[f:10] $
  46. 执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$
  47. 设置并发数: forks n 例如: forks 10
  48. 切换组: cd 主机组 例如: cd web
  49. 列出当前组主机列表: list
  50. 列出所有的内置命令: ?或help
  51. 示例:
  52. root@all (2)[f:5]$ list
  53. root@all (2)[f:5]$ cd appsrvs
  54. root@appsrvs (2)[f:5]$ list
  55. root@appsrvs (2)[f:5]$ yum name=httpd state=present
  56. root@appsrvs (2)[f:5]$ service name=httpd state=started

1.2、ansible命令

  1. ansible通过ssh实现配置管理、应用部署、任务执行等功能,
  2. 建议配置ansible端能基于密钥认证的方式联系各被管理节点
  3. ansible <host-pattern> [-m module_name] [-a args]
  4. ansible +被管理的主机(ALL) +模块 +参数
  5. --version 显示版本
  6. -m module 指定模块,默认为command
  7. -v 详细过程 vv -vvv更详细
  8. --list-hosts 显示主机列表,可简写 --list
  9. -k, --ask-pass 提示输入ssh连接密码,默认Key验证
  10. -C, --check 检查,并不执行
  11. -T, --timeout=TIMEOUT 执行命令的超时时间,默认10s
  12. -u, --user=REMOTE_USER 执行远程执行的用户
  13. -b, --become 代替旧版的sudo切换
  14. --become-user=USERNAME 指定sudorunas用户,默认为root
  15. -K, --ask-become-pass 提示输入sudo时的口令
  1. ansible all --list 列出所有主机
  2. ping模块: 探测网络中被管理主机是否能够正常使用 ssh协议
  3. 如果对方主机网络正常,返回pong
  4. ansible-doc -s ping 查看ping模块的语法
  5. 检测所有主机的网络状态
  6. 1> 默认情况下连接被管理的主机是ssh基于key验证,如果没有配置key,权限将会被拒绝
  7. 因此需要指定以谁的身份连接,输入用户密码,必须保证被管理主机用户密码一致
  8. ansible all -m ping -k
  9. 2> 或者实现基于key验证 将公钥ssh-copy-id到被管理的主机上 , 实现免密登录
  10. ansible all -m ping

1.3、ansible的Host-pattern

  1. ansibleHost-pattern
  2. 匹配主机的列表
  3. All :表示所有Inventory中的所有主机
  4. ansible all m ping
  5. * :通配符
  6. ansible "*" -m ping (*表示所有主机)
  7. ansible 192.168.1.* -m ping
  8. ansible "*srvs" -m ping
  9. 或关系 ":"
  10. ansible "websrvs:appsrvs" -m ping
  11. ansible 192.168.1.10:192.168.1.20 -m ping
  12. 逻辑与 ":&"
  13. ansible "websrvs:&dbsrvs" m ping
  14. websrvs组并且在dbsrvs组中的主机
  15. 逻辑非 ":!"
  16. ansible 'websrvs:!dbsrvs' m ping
  17. websrvs组,但不在dbsrvs组中的主机
  18. 注意:此处为单引号
  19. 综合逻辑
  20. ansible 'websrvs:dbsrvs:&appsrvs:!ftpsrvs' m ping
  21. 正则表达式
  22. ansible "websrvs:&dbsrvs" m ping
  23. ansible "~(web|db).*\.magedu\.com" m ping

1.4、ansible命令执行过程

  1. ansible命令执行过程
  2. 1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg
  3. 2. 加载自己对应的模块文件,如command
  4. 3. 通过ansible将模块或命令生成对应的临时py文件,
  5. 并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件
  6. 4. 给文件+x执行
  7. 5. 执行并返回结果
  8. 6. 删除临时py文件,sleep 0退出
  9. 执行状态:
  10. 绿色:执行成功并且不需要做改变的操作
  11. 黄色:执行成功并且对目标主机做变更
  12. 红色:执行失败

1.5、ansible使用示例

  1. 示例
  2. wang用户执行ping存活检测
  3. ansible all -m ping -u wang -k
  4. wang sudoroot执行ping存活检测
  5. ansible all -m ping -u wang -k -b
  6. wang sudomage用户执行ping存活检测
  7. ansible all -m ping -u wang -k -b --become-user=mage
  8. wang sudoroot用户执行ls
  9. ansible all -m command -u wang -a 'ls /root' -b --become-user=root -k -K
  10. ansible ping模块测试连接
  11. ansible 192.168.38.126,192.168.38.127 -m ping -k

2、when 实现条件判断

  1. 条件测试:如果需要根据变量、facts或此前任务的执行结果来做为某task执行与否的前提时要用到条件测试,
  2. 通过when语句实现,在task中使用,jinja2的语法格式
  3. when语句
  4. task后添加when子句即可使用条件测试;when语句支持Jinja2表达式语法
  5. 示例:
  6. tasks:
  7. - name: "shutdown RedHat flavored systems"
  8. command: /sbin/shutdown -h now
  9. when: ansible_os_family == "RedHat" 当系统属于红帽系列,执行command模块
  10. when语句中还可以使用Jinja2的大多"filter"
  11. 例如要忽略此前某语句的错误并基于其结果(failed或者success)运行后面指定的语句,
  12. 可使用类似如下形式:
  13. tasks:
  14. - command: /bin/false
  15. register: result
  16. ignore_errors: True
  17. - command: /bin/something
  18. when: result|failed
  19. - command: /bin/something_else
  20. when: result|success
  21. - command: /bin/still/something_else
  22. when: result|skipped
  23. 此外,when语句中还可以使用factsplaybook中定义的变量

2.1、示例

  1. - hosts: websrvs
  2. remote_user: root
  3. tasks:
  4. - name: add group nginx
  5. tags: user
  6. user: name=nginx state=present
  7. - name: add user nginx
  8. user: name=nginx state=present group=nginx
  9. - name: Install Nginx
  10. yum: name=nginx state=present
  11. - name: restart Nginx
  12. service: name=nginx state=restarted
  13. when: ansible_distribution_major_version == "6"
  1. 示例:
  2. tasks:
  3. - name: install conf file to centos7
  4. template: src=nginx.conf.c7.j2 dest=/etc/nginx/nginx.conf
  5. when: ansible_distribution_major_version == "7"
  6. - name: install conf file to centos6
  7. template: src=nginx.conf.c6.j2 dest=/etc/nginx/nginx.conf
  8. when: ansible_distribution_major_version == "6"
  1. ---
  2. - hosts: srv120
  3. remote_user: root
  4. tasks:
  5. - name:
  6. template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
  7. when: ansible_distribution_major_version == "7"

image.png

3、迭代:with_items

  1. 迭代:当有需要重复性执行的任务时,可以使用迭代机制
  2. > 对迭代项的引用,固定变量名为"item"
  3. > 要在task中使用with_items给定要迭代的元素列表
  4. > 列表格式:
  5. 字符串
  6. 字典

3.1、示例:基本使用

  1. 示例: 创建用户
  2. - name: add several users
  3. user: name={{ item }} state=present groups=wheel #{{ item }} 系统自定义变量
  4. with_items: # 定义{{ item }} 的值和个数
  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
  12. with_items中可以使用元素还可为hashes
  13. 示例:
  14. - name: add several users
  15. user: name={{ item.name }} state=present groups={{ item.groups }}
  16. with_items:
  17. - { name: 'testuser1', groups: 'wheel' }
  18. - { name: 'testuser2', groups: 'root' }
  19. ansible的循环机制还有更多的高级功能,具体请参见官方文档
  20. http://docs.ansible.com/playbooks_loops.html
  1. 示例:将多个文件进行copy到被控端
  2. ---
  3. - hosts: testsrv
  4. remote_user: root
  5. tasks
  6. - name: Create rsyncd config
  7. copy: src={{ item }} dest=/etc/{{ item }}
  8. with_items:
  9. - rsyncd.secrets
  10. - rsyncd.conf
  1. - hosts: websrvs
  2. remote_user: root
  3. tasks:
  4. - name: copy file
  5. copy: src={{ item }} dest=/tmp/{{ item }}
  6. with_items:
  7. - file1
  8. - file2
  9. - file3
  10. - name: yum install httpd
  11. yum: name={{ item }} state=present
  12. with_items:
  13. - apr
  14. - apr-util
  15. - httpd
  1. - hostswebsrvs
  2. remote_user: root
  3. tasks:
  4. - name: install some packages
  5. yum: name={{ item }} state=present
  6. with_items:
  7. - nginx
  8. - memcached
  9. - php-fpm

3.2、示例:迭代嵌套子变量

  1. - hosts: websrvs
  2. remote_user: root
  3. tasks:
  4. - name: add some groups
  5. group: name={{ item }} state=present
  6. with_items:
  7. - group1
  8. - group2
  9. - group3
  10. - name: add some users
  11. user: name={{ item.name }} group={{ item.group }} state=present
  12. with_items:
  13. - { name: 'user1', group: 'group1' }
  14. - { name: 'user2', group: 'group2' }
  15. - { name: 'user3', group: 'group3' }
  1. with_itmes 嵌套子变量
  2. 示例
  3. ---
  4. - hosts: testweb
  5. remote_user: root
  6. tasks:
  7. - name: add several users
  8. user: name={{ item.name }} state=present groups={{ item.groups }}
  9. with_items:
  10. - { name: 'testuser1' , groups: 'wheel'}
  11. - { name: 'testuser2' , groups: 'root'}

3.3、Playbook字典 with_items

  1. - name: 使用ufw模块来管理哪些端口需要开启
  2. ufw:
  3. rule: “{{ item.rule }}”
  4. port: “{{ item.port }}”
  5. proto: “{{ item.proto }}”
  6. with_items:
  7. - { rule: 'allow', port: 22, proto: 'tcp' }
  8. - { rule: 'allow', port: 80, proto: 'tcp' }
  9. - { rule: 'allow', port: 123, proto: 'udp' }
  10. - name: 配置网络进出方向的默认规则
  11. ufw:
  12. direction: "{{ item.direction }}"
  13. policy: "{{ item.policy }}"
  14. state: enabled
  15. with_items:
  16. - { direction: outgoing, policy: allow }
  17. - { direction: incoming, policy: deny }

4、实验: 实现二进制安装mysql的卸载

  1. cat remove_mysql.yml
  2. ---
  3. # install mariadb server
  4. - hosts: appsrvs:!192.168.38.108
  5. remote_user: root
  6. tasks:
  7. - name: stop service
  8. shell: /etc/init.d/mysqld stop
  9. - name: delete user
  10. user: name=mysql state=absent remove=yes
  11. - name: delete
  12. file: path={{item}} state=absent
  13. with_items:
  14. - /usr/local/mysql
  15. - /usr/local/mariadb-10.2.27-linux-x86_64
  16. - /etc/init.d/mysqld
  17. - /etc/profile.d/mysql.sh
  18. - /etc/my.cnf
  19. - /data/mysql
  20. ansible-playbook remove_mysql.yml