1、命令
1.1、ansible系列命令
Ansible系列命令 ansible ansible-doc ansible-playbook ansible-vault ansible-console ansible-galaxy ansible-pullansible-doc: 显示模块帮助 ansible-doc [options] [module...] -a 显示所有模块的文档 -l, --list 列出可用模块 -s, --snippet 显示指定模块的playbook片段(简化版,便于查找语法)示例: ansible-doc -l 列出所有模块 ansible-doc ping 查看指定模块帮助用法 ansible-doc -s ping 查看指定模块帮助用法可以通过网上写好的ansible-galaxy > 连接 https://galaxy.ansible.com 下载相应的roles(角色) > 列出所有已安装的galaxy ansible-galaxy list > 安装galaxy ansible-galaxy install geerlingguy.redis > 删除galaxy ansible-galaxy remove geerlingguy.redisansible-pull 推送命令至远程,效率无限提升,对运维要求较高ansible-playbook 可以引用按照标准的yml语言写的脚本 执行playbook 示例:ansible-playbook hello.yml cat hello.yml #hello world yml file - hosts: websrvs remote_user: root tasks: - name: hello world command: /usr/bin/wall hello worldansible-vault (了解)功能:管理加密解密yml文件 ansible-vault [create|decrypt|edit|encrypt|rekey|view] ansible-vault encrypt hello.yml 加密 ansible-vault decrypt hello.yml 解密 ansible-vault view hello.yml 查看 ansible-vault edit hello.yml 编辑加密文件 ansible-vault rekey hello.yml 修改口令 ansible-vault create new.yml 创建新文件Ansible-console:2.0+新增,可交互执行命令,支持tab (了解) root@test (2)[f:10] $ 执行用户@当前操作的主机组 (当前组的主机数量)[f:并发数]$ 设置并发数: forks n 例如: forks 10 切换组: cd 主机组 例如: cd web 列出当前组主机列表: list 列出所有的内置命令: ?或help 示例: root@all (2)[f:5]$ list root@all (2)[f:5]$ cd appsrvs root@appsrvs (2)[f:5]$ list root@appsrvs (2)[f:5]$ yum name=httpd state=present root@appsrvs (2)[f:5]$ service name=httpd state=started
1.2、ansible命令
ansible通过ssh实现配置管理、应用部署、任务执行等功能,建议配置ansible端能基于密钥认证的方式联系各被管理节点ansible <host-pattern> [-m module_name] [-a args]ansible +被管理的主机(ALL) +模块 +参数 --version 显示版本 -m module 指定模块,默认为command -v 详细过程 –vv -vvv更详细 --list-hosts 显示主机列表,可简写 --list -k, --ask-pass 提示输入ssh连接密码,默认Key验证 -C, --check 检查,并不执行 -T, --timeout=TIMEOUT 执行命令的超时时间,默认10s -u, --user=REMOTE_USER 执行远程执行的用户 -b, --become 代替旧版的sudo切换 --become-user=USERNAME 指定sudo的runas用户,默认为root -K, --ask-become-pass 提示输入sudo时的口令
ansible all --list 列出所有主机ping模块: 探测网络中被管理主机是否能够正常使用 走ssh协议 如果对方主机网络正常,返回pongansible-doc -s ping 查看ping模块的语法 检测所有主机的网络状态1> 默认情况下连接被管理的主机是ssh基于key验证,如果没有配置key,权限将会被拒绝 因此需要指定以谁的身份连接,输入用户密码,必须保证被管理主机用户密码一致 ansible all -m ping -k2> 或者实现基于key验证 将公钥ssh-copy-id到被管理的主机上 , 实现免密登录 ansible all -m ping
1.3、ansible的Host-pattern
ansible的Host-pattern匹配主机的列表 All :表示所有Inventory中的所有主机 ansible all –m ping * :通配符 ansible "*" -m ping (*表示所有主机) ansible 192.168.1.* -m ping ansible "*srvs" -m ping 或关系 ":" ansible "websrvs:appsrvs" -m ping ansible “192.168.1.10:192.168.1.20” -m ping 逻辑与 ":&" ansible "websrvs:&dbsrvs" –m ping 在websrvs组并且在dbsrvs组中的主机 逻辑非 ":!" ansible 'websrvs:!dbsrvs' –m ping 在websrvs组,但不在dbsrvs组中的主机 注意:此处为单引号 综合逻辑 ansible 'websrvs:dbsrvs:&appsrvs:!ftpsrvs' –m ping 正则表达式 ansible "websrvs:&dbsrvs" –m ping ansible "~(web|db).*\.magedu\.com" –m ping
1.4、ansible命令执行过程
ansible命令执行过程 1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg 2. 加载自己对应的模块文件,如command 3. 通过ansible将模块或命令生成对应的临时py文件, 并将该文件传输至远程服务器的对应执行用户$HOME/.ansible/tmp/ansible-tmp-数字/XXX.PY文件 4. 给文件+x执行 5. 执行并返回结果 6. 删除临时py文件,sleep 0退出执行状态: 绿色:执行成功并且不需要做改变的操作 黄色:执行成功并且对目标主机做变更 红色:执行失败
1.5、ansible使用示例
示例 以wang用户执行ping存活检测 ansible all -m ping -u wang -k 以wang sudo至root执行ping存活检测 ansible all -m ping -u wang -k -b 以wang sudo至mage用户执行ping存活检测 ansible all -m ping -u wang -k -b --become-user=mage 以wang sudo至root用户执行ls ansible all -m command -u wang -a 'ls /root' -b --become-user=root -k -Kansible ping模块测试连接 ansible 192.168.38.126,192.168.38.127 -m ping -k
2、when 实现条件判断
条件测试:如果需要根据变量、facts或此前任务的执行结果来做为某task执行与否的前提时要用到条件测试,通过when语句实现,在task中使用,jinja2的语法格式when语句 在task后添加when子句即可使用条件测试;when语句支持Jinja2表达式语法示例:tasks: - name: "shutdown RedHat flavored systems" command: /sbin/shutdown -h now when: ansible_os_family == "RedHat" 当系统属于红帽系列,执行command模块 when语句中还可以使用Jinja2的大多"filter",例如要忽略此前某语句的错误并基于其结果(failed或者success)运行后面指定的语句,可使用类似如下形式:tasks: - command: /bin/false register: result ignore_errors: True - command: /bin/something when: result|failed - command: /bin/something_else when: result|success - command: /bin/still/something_else when: result|skipped此外,when语句中还可以使用facts或playbook中定义的变量
2.1、示例
- hosts: websrvs remote_user: root tasks: - name: add group nginx tags: user user: name=nginx state=present - name: add user nginx user: name=nginx state=present group=nginx - name: Install Nginx yum: name=nginx state=present - name: restart Nginx service: name=nginx state=restarted when: ansible_distribution_major_version == "6"
示例:tasks: - name: install conf file to centos7 template: src=nginx.conf.c7.j2 dest=/etc/nginx/nginx.conf when: ansible_distribution_major_version == "7" - name: install conf file to centos6 template: src=nginx.conf.c6.j2 dest=/etc/nginx/nginx.conf when: ansible_distribution_major_version == "6"
---- hosts: srv120 remote_user: root tasks: - name: template: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf when: ansible_distribution_major_version == "7"
3、迭代:with_items
迭代:当有需要重复性执行的任务时,可以使用迭代机制 > 对迭代项的引用,固定变量名为"item" > 要在task中使用with_items给定要迭代的元素列表 > 列表格式: 字符串 字典
3.1、示例:基本使用
示例: 创建用户- name: add several users user: name={{ item }} state=present groups=wheel #{{ item }} 系统自定义变量 with_items: # 定义{{ item }} 的值和个数 - testuser1 - testuser2上面语句的功能等同于下面的语句:- name: add user testuser1 user: name=testuser1 state=present groups=wheel- name: add user testuser2 user: name=testuser2 state=present groups=wheelwith_items中可以使用元素还可为hashes示例:- name: add several users user: name={{ item.name }} state=present groups={{ item.groups }} with_items: - { name: 'testuser1', groups: 'wheel' } - { name: 'testuser2', groups: 'root' }ansible的循环机制还有更多的高级功能,具体请参见官方文档http://docs.ansible.com/playbooks_loops.html
示例:将多个文件进行copy到被控端---- hosts: testsrv remote_user: root tasks - name: Create rsyncd config copy: src={{ item }} dest=/etc/{{ item }} with_items: - rsyncd.secrets - rsyncd.conf
- hosts: websrvs remote_user: root tasks: - name: copy file copy: src={{ item }} dest=/tmp/{{ item }} with_items: - file1 - file2 - file3 - name: yum install httpd yum: name={{ item }} state=present with_items: - apr - apr-util - httpd
- hosts:websrvs remote_user: root tasks: - name: install some packages yum: name={{ item }} state=present with_items: - nginx - memcached - php-fpm
3.2、示例:迭代嵌套子变量
- hosts: websrvs remote_user: root tasks: - name: add some groups group: name={{ item }} state=present with_items: - group1 - group2 - group3 - name: add some users user: name={{ item.name }} group={{ item.group }} state=present with_items: - { name: 'user1', group: 'group1' } - { name: 'user2', group: 'group2' } - { name: 'user3', group: 'group3' }
with_itmes 嵌套子变量示例---- hosts: testweb remote_user: root tasks: - name: add several users user: name={{ item.name }} state=present groups={{ item.groups }} with_items: - { name: 'testuser1' , groups: 'wheel'} - { name: 'testuser2' , groups: 'root'}
3.3、Playbook字典 with_items
- name: 使用ufw模块来管理哪些端口需要开启 ufw: rule: “{{ item.rule }}” port: “{{ item.port }}” proto: “{{ item.proto }}” with_items: - { rule: 'allow', port: 22, proto: 'tcp' } - { rule: 'allow', port: 80, proto: 'tcp' } - { rule: 'allow', port: 123, proto: 'udp' }- name: 配置网络进出方向的默认规则 ufw: direction: "{{ item.direction }}" policy: "{{ item.policy }}" state: enabled with_items: - { direction: outgoing, policy: allow } - { direction: incoming, policy: deny }
4、实验: 实现二进制安装mysql的卸载
cat remove_mysql.yml ---# install mariadb server - hosts: appsrvs:!192.168.38.108 remote_user: root tasks: - name: stop service shell: /etc/init.d/mysqld stop - name: delete user user: name=mysql state=absent remove=yes - name: delete file: path={{item}} state=absent with_items: - /usr/local/mysql - /usr/local/mariadb-10.2.27-linux-x86_64 - /etc/init.d/mysqld - /etc/profile.d/mysql.sh - /etc/my.cnf - /data/mysqlansible-playbook remove_mysql.yml