ansible获取命令: ansible all -m setup

  1. ansible_all_ipv4_addresses: 仅显示ipv4的消息
  2. ansible_devices: 仅显示磁盘设备信息
  3. ansible_distribution: 显示是什么系统(centos、suse等)
  4. ansible_distribution_version: 显示系统的版本
  5. ansible_machine: 显示系统的类型(32位、64位)
  6. ansible_eth0: 仅显示eth0的信息
  7. ansible_hostname: 仅显示主机名称
  8. ansible_kernel:仅显示内核版本
  9. ansible_lvm: 显示lvm相关信息
  10. ansible_memtotal_mb: 显示系统总内存
  11. ansible_memfree_mb: 显示可用系统内存
  12. ansible_memory_mb: 显示内存情况
  13. ansible_swaptotal_mb: 显示总的交换内存
  14. ansible_swapfree_mb: 显示总的swap内存
  15. ansible_mounts:显示系统磁盘挂载
  16. ansible_processor:显示CPU个数(具体显示每个CPU的型号)
  17. ansible_processor_vcpus: 显示cpu的个数(只显示总的个数)
  18. ansible_python_version: 显示python的版本


ansible cache -m setup -a ‘filter=processor# 用来搜索 ansible -i host_init.ini all -m setup -a “filter=ansible_distribution”

1. playbook的语法格式

  1. #本playbook等同于在主机上以hello用户权限执行 sudo service nginx start
  2. ---
  3. - hosts: all
  4. remote_user: hello
  5. tasks:
  6. - service: name=nginx state=started
  7. become: yes
  8. become_method: sudo
  9. #本playcook等同于以root身份进行ssh登录,然后将用户换为hello。接下来的所有任务(tasks)都以hello用户身份执行。
  10. ---
  11. - hosts: webservers
  12. remote_user: root
  13. become: yes
  14. become_user: hello
  1. ---
  2. - hosts: webservers
  3. remote_user: root
  4. tasks:
  5. - name: ensure apache is at the latest version
  6. yum:
  7. name: httpd
  8. state: latest
  9. - name: write the apache config file
  10. template:
  11. src: /srv/httpd.j2
  12. dest: /etc/httpd.conf
  13. - hosts: databases
  14. remote_user: root
  15. tasks:
  16. - name: ensure postgresql is at the latest version
  17. yum:
  18. name: postgresql
  19. state: latest
  20. - name: ensure that postgresql is started
  21. service:
  22. name: postgresql
  23. state: started

2. 常用模块的介绍和使用

系统校验:

  1. # 测试系统的版本
  2. ## ansible_distribution=Ubuntu
  3. ## ansible_distribution_version=18.04
  4. ## ansible_distribution_major_version:系统的大版本号
  5. ## ansible_os_family: 系统的操作系统(‘RedHat’,’Debian’,’FreeBSD’)
  6. - name: debug test demo
  7. debug:
  8. msg: "test system version code "
  9. when: ansible_distribution_version=="18.04"

条件判断:

  1. # 条件判断 (register的参数,有stdout和rc)
  2. ## register变量的命名不能用 -中横线,比如dev-sda6_result,则会被解析成sda6_result,dev会被丢掉,所以不要用-
  3. - name: check mysqld process
  4. shell: "ps -ef | grep -i mysqld | grep -v grep |grep {{mysql_port}}| wc -l"
  5. register: result
  6. - name: if stdout != 0 ,Interrupt execution
  7. fail: msg="mysqld process is exist"
  8. when: result.stdout != "0"

切换用户:

  1. #本playcook等同于以root身份进行ssh登录,然后将用户换为hello。接下来的所有任务(tasks)都以hello用户身份执行。
  2. ## become: yes # 是否允许身份切换
  3. ## become_method: su # 切换用户身份的方式,有sudo su pbrun等,默认是sudo
  4. ## become_user: root # 切换指定用户
  5. ---
  6. - hosts: webservers
  7. hosts: demo-autodeploy
  8. remote_user: root
  9. become: yes
  10. become_method: su
  11. become_user: root

a. 命令模块:

  1. # command命令
  2. ## 无法支持"<",">","|",";","&"等符号
  3. ## creates : 判断指定文件是否存在,如果存在,不执行后面操作
  4. ## removes : 判断指定文件是否存在,如果存在,执行后面操作
  5. - name: test command
  6. command:
  7. chdir: /home/qif/Downloads
  8. cmd: "mkdir -p test/a"
  9. - name: test command
  10. command:
  11. chdir: /home/qif/Downloads
  12. creates: "get.txt"
  13. cmd: "touch get.txt"
  14. - name: test command
  15. command:
  16. chdir: /home/qif/Downloads
  17. removes: "get.txt"
  18. cmd: "rm -rf get.txt"
  1. # shell是command的升级版,功能类似
  2. - name: test shell
  3. shell:
  4. chdir: /home/qif/Downloads
  5. cmd: "mkdir -p test/a"

b. 文件模块:

  1. # copy的命令
  2. ## src: 指定本地管理主机的什么数据信息,进行远程复制
  3. ## dest(required): 将数据复制到远程节点的路径信息
  4. ## backup: 默认数据复制到远程主机,会覆盖原有文件(yes 将源文件进行备份)
  5. ## content: 文件中添加内容
  6. ## owner: 文件复制到远程主机,设置文件所属用户
  7. ## group: 文件复制到远程主机,设置文件属组
  8. ## mode: 文件赋值到远程主机,设置数据的权限(eg 0644 0755)
  9. - name: copy pom
  10. copy:
  11. src: vsftpd.pem
  12. dest: /etc/ssl/private/vsftpd.pem
  13. owner: root
  14. group: root
  15. mode: 0644
  16. - name: copy configuration
  17. copy:
  18. src: '{{item.src}}'
  19. dest: '{{item.dest}}'
  20. owner: root
  21. group: root
  22. mode: 0644
  23. with_items:
  24. - { src: 'vsftpd.conf', dest: '/etc'}
  25. - { src: 'vsftpd.chroot_list', dest: '/etc' }
  26. - { src: 'vsftpd.user_list', dest: '/etc' }
  1. # fetch 抓取文件到管理机上
  2. ## src(required): 获取的远程系统上的文件,必须是文件,而不是目录
  3. ## dest: 用于保存文件的目录
  4. - name: fetch file
  5. fetch:
  6. src: /home/qif/Downloads/test.txt
  7. dest: /usr/local/log
  1. # file
  2. ## dest/path/name (required): 将数据复制到远程节点的路径信息
  3. ## group: 文件复制到远程主机后,文件所属组
  4. ## owner: 文件复制到远程主机后,文件所属用户
  5. ## src: 指定本地管理主机的数据,进行复制
  6. ## state: absent / directory / file / touch / hard/link
  7. - name: create ftp root
  8. file:
  9. path: "/usr/local/ftp/root"
  10. state: directory
  11. owner: ftpuser
  12. group: ftpuser
  13. mode: 0644
  14. ignore_errors: True

c. 创建组和用户:

  1. # 创建用户分组
  2. - name: create ftp group
  3. group:
  4. name: "ftpuser"
  5. gid: "777"
  6. state: present
  7. # 创建用户
  8. - name: create ftp user
  9. user:
  10. name: "ftpuser"
  11. password: "$6$kKtGP1.01ZZ58/Ey$ta7Tk/uUYnZMl8JGIQj7ciUsdcnjmY5dhOanfV1v52MVJnD2eHzMRPS1Uu020XIKW8F0lSvO9WPyymTYDIpI50"
  12. group: "ftpuser"
  13. home: "/usr/local/ftp/root"
  14. state: present

d. 安装依赖包:

  1. # yum 或者 apt install 安装依赖
  2. ## name(required): 指定软件名称
  3. ## state: absent/removed present/installed (将软件进行卸载/安装)
  4. - name: install yum dependents
  5. become: yes
  6. become_method: su
  7. become_user: root
  8. apt:
  9. name: "{{ item }}"
  10. state: present
  11. with_items:
  12. - libaio1
  13. - libmecab2
  14. - expect
  15. - libmysqlclient-dev
  16. - libmysqlclient20
  17. - libmysqld-dev
  18. - libnet-telnet-perl
  19. - libtest-fixme-perl
  20. - libcpan-perl-releases-perl
  21. - libdbi-perl
  22. - libdbd-mysql-perl
  23. - libconfig-tiny-perl

e. 启动服务:

  1. # 启动服务
  2. ## enabled: no / yes 设置服务是否开机自启,如果参数不指定,原有状态保留
  3. ## name(required): 服务的名称
  4. ## state: reloaded(平滑重启)、restarted(重启)、started(启动)、stopped(停止)
  5. - name start service
  6. enabled: yes
  7. name: nginx
  8. state: started

f. 挂载模块:

  1. # 挂载
  2. ## fstype: 指定的挂在文件系统
  3. ## opts: 指定挂载参数
  4. ## path: 指定一个挂载点
  5. ## src: 设备文件信息
  6. ## state: absent(卸载并修改fstab文件)、unmounted(卸载不会修改fstab文件)、present(不会挂载,只会修改fstab文件)、mounted(会挂载,会修改fstab文件)
  7. - name mount load
  8. fstype: ext4
  9. path: /data
  10. src: /dev/sdb
  11. state: mounted

g. 定时任务:

  1. # cron定时任务
  2. ## minute/hour/day/month/weekday 设置时间信息
  3. ## job: 设置定时任务相关参数
  4. ## name(required): 设置定时任务注释信息
  5. ## state: absent / present 删除/ 添加
  6. ## disabled: yes /no 指定任务进行注释/取消注释
  7. - name: mysql backup config crontab
  8. when: backup == 1
  9. cron:
  10. name: "## mysql backup"
  11. minute: "0"
  12. hour: "*/1"
  13. job: "sh /opt/tools/bin/xtrmysqlbackup.sh {{mysql_port}} > /dev/null 2>&1"
  14. state: present

h. 解压缩文件:

  1. # unarchive模块
  2. ## src: 指定本地管理主机的什么数据信息,进行远程复制
  3. ## dest: 绝对路径
  4. ## owner: 文件复制到远程主机,设置文件所属用户
  5. ## group: 文件复制到远程主机,设置文件属组
  6. ## mode: 文件赋值到远程主机,设置数据的权限(eg 0644 0755)
  7. - name: transfer xtrabackup to remote host and unarchive to /opt/
  8. unarchive:
  9. src: xtrabackup.tar.gz
  10. dest: /usr/local/
  11. owner: root
  12. group: root

lineinfile操作:

在文件”dest”中,用正则表达式匹配“regexp”值: 若匹配到“regexp”值=1:替换“regexp”值所在行为 “line”; 若匹配到“regexp”值>1:只替换最后一个匹配的有效值; 若匹配到“regexp”值=0:检查是否存在“backrefs”,并且值等于yes,若是则不做任何操作;否则在文件末尾新增行“line”;

  1. - name: edit test.json
  2. lineinfile:
  3. dest: /home/fred/Documents/test.json
  4. regexp: "^host"
  5. line: "测试节点"
  6. insertafter: EOF
  7. backrefs: yes

git操作:

  1. # git拉去仓库内容
  2. ## repo: git仓库的地址
  3. ## dest: 仓库中的相对路径
  4. ## version: 指定版本
  5. ## accept_hostkey: 如果ssh_opts(包含"-o StrictHostKeytChecking=no" 参数可以省略,搜则需要天剑hostKey)
  6. ## update: 更新新版本
  7. ## force: 配置成yes,本地仓库将永远被仓库服务端覆盖
  8. - name: ANSISTRANO | GIT | Update remote repository
  9. git:
  10. repo: "{{ ansistrano_git_repo }}"
  11. dest: "{{ ansistrano_deploy_to }}/repo"
  12. version: "{{ ansistrano_git_branch }}"
  13. accept_hostkey: true
  14. update: yes
  15. force: yes
  16. register: ansistrano_git_result_update
  17. when: ansistrano_git_identity_key_path|trim == '' and ansistrano_git_identity_key_remote_path|trim == ''

authorized_key 模块:

  1. # 新增一处ssh公钥
  2. ## key: 公钥路径,可以是本地的也可以是远程的
  3. ## path: 公钥的存放路径
  4. ## state: present / absent, 是否存在
  5. ## user: 添加到远程那个用户下
  6. # $ cat authorized_key.yml
  7. ---
  8. - hosts: 192.168.240.33
  9. tasks:
  10. - name: authorized_key module
  11. authorized_key:
  12. key: "{{ lookup('file', '/home/ansible/.ssh/id_rsa.pub') }}"
  13. state: present
  14. user: t2

参考文档:

  1. https://blog.csdn.net/L835311324/article/details/103372270?spm=1001.2101.3001.6650.13&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-13.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-13.no_search_link
  2. https://www.cnblogs.com/0x1633/p/11911797.html
  3. https://www.cnblogs.com/kdzm/p/6835182.html