{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2020-06-10 11:33:28","updateBy":"admin","updateTime":"2020-06-10 11:33:28","remark":null,"id":29,"articleTitle":"Ansible（二）常用选项及模块1","articleUrl":"ansible_modules_1","articleThumbnail":"https://www.asumimoe.com/imgfiles/20220908/5969ef61cf754d1aa6e0f5c28219aefa.jpg","articleFlag":"1","draftStatus":"1","reprintStatement":"0","articleSummary":"ansible是基于模块工作的，本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块，ansible只是提供一种框架。","articleContent":"## Ansible常用选项\n\n### 基础选项\n\n```bash\n-a MODULE_ARGS\n--args=MODULE_ARGS\n```\n\n传递参数给模块\n\n```bash\n--ask-vault-pass\n```\n\n询问vault的密码\n    -B SECONDS\n    --background=SECONDS\n\n异步后台⽅式执⾏任务，并在指定的秒数后超时，超时会杀掉任务的进程。默认是同步，即保持长连接，它会等待\n所有执⾏完毕（即阻塞模式）。但有时候是没必要这样的，⽐如某些命令的执⾏时间⽐ssh的超时时间还长。如果\n不指定超时秒数，将以同步⽅式运⾏任务\n    \n\n```bash\n-P POLL_INTERVAL\n--poll=POLL_INTERVAL\n```\n\n异步模式下轮训任务的时间间隔，默认10秒\n    \n\n```bash\n-C\n--check\n```\n\n不对远程主机做出⼀些改变，⽽是预测某些可能发⽣的改变\n    \n\n```bash\n-D\n--diff\n```\n\n当⽂件或模板发⽣了改变，显⽰出不同之处，和-C选项配合使⽤更佳\n    \n\n```bash\n-e EXTRA_VARS\n--extra-vars=EXTRA_VARS\n```\n\n配置额外的配置变量(key=value或者YAML/JSON格式)\n    \n\n```bash\n-f FORKS\n--forks=FORKS\n```\n\n指定并⾏处理的进程数量，默认为5个\n\n```bash\n-h\n--help\n```\n\n显⽰帮助信息\n    \n\n```bash\n-i INVENTORY\n--inventory-file=INVENTORY\n```\n\n指定inventory⽂件，多个⽂件使⽤逗号分隔。默认为/etc/ansible/hosts\n    \n\n```bash\n-l SUBSET\n--limit=SUBSET\n```\n\n使⽤额外的匹配模式来筛选⽬标主机列表。此处的匹配模式是在已有匹配模式下进⾏的，所以是更严格的筛选。例\n如指定了主机组的情况下，使⽤-l选项从中只选⼀台主机进⾏控制\n    \n\n```bash\n--list-hosts\n```\n\n不会执⾏任何操作，⽽是列出匹配到的主机列表\n\n```bash\n-m MODULE_NAME\n--module-name=MODULE_NAME\n```\n\n指定要执⾏的模块名，默认的模块为\"command\"\n\n```bash\n-M MODULE_PATH\n--module-path=MODULE_PATH\n```\n\n指定模块⽬录，默认未设置\n\n```bash\n--new-vault-password-file=NEW_VAULT_PASSWORD_FILE\n```\n\nnew vault password file for rekey\n    \n\n```bash\n-o\n--one-line\n```\n\n简化输出(⼀⾏输出模式)\n    \n\n```bash\n--output=OUTPUT_FILE\n```\n\noutput f ile name f or encrypt or decrypt; use - f or stdout\n\n```bash\n--syntax-check\n```\n\n检查playbook的语法，不会执⾏\n    \n\n```bash\n-t TREE\n--tree=TREE\n```\n\n记录输出到此⽬录中（测试时以每个host名如IP地址为⽂件名记录，结果记录到对应的⽂件中）。\\\n此选项在ansible巨慢的时候(如瞬间应该返回的命令还需要10多秒才完成)有奇⽤，或者将ansible的结果重\n定向到某个⽂件中也能解决，为什么如此，我也不明⽩(表⾯看来和输出⽅式有关系)，多次亲测有效。\n    \n\n```bash\n--vault-password-file=VAULT_PASSWORD_FILE\n```\n\n指定vault密码⽂件\n    \n\n```bash\n-v\n--verbose\n```\n\n输出详细信息，-vvv和-vvvv会输出更多新\n\n```bash\n--version\n```\n\n显⽰ansible的版本\n\n### 连接选项：用于控制谁以及如何连接主机\n\n```bash\n-k\n--ask-pass\n```\n\n询问连接时的密码\n\n```bash\n--private-key=KEY_FILE\n--key-file=KEY_FILE\n```\n\n使⽤⽂件来认证SSH连接过程。\n\n```bash\n-u REMOTE_USER\n--user=REMOTE_USER\n```\n\n使⽤指定的⽤户名进⾏连接\n\n```bash\n-c CONNECTION\n--connection=CONNECTION\n```\n\n连接类型，默认为ssh。paramiko (SSH), ssh, winrm and local. local is mostly usef ul f or crontab or kickstarts.\n\n```bash\n-T TIMEOUT, --timeout=TIMEOUT\n```\n\n连接的超时时间，单位为秒，默认为10\n\n```bash\n--ssh-common-args=SSH_COMMON_ARGS\n```\n\n指定传递给sf tp/scp/ssh等⼯具的通⽤额外参数\n\n```bash\n--sftp-extra-args=SFTP_EXTRA_ARGS\n```\n\n指定只传递给sf tp的额外参数，如-f\n\n```bash\n--scp-extra-args=SCP_EXTRA_ARGS\n```\n\n指定只传递给scp的额外参数，如-l\n\n```bash\n--ssh-extra-args=SSH_EXTRA_ARGS\n```\n\n指定只传递给ssh的额外参数，如-R\n\n### 权限控制选项：控制在⽬标主机上以什么⾝份和权限运⾏任务\n\n```bash\n-s\n--sudo\n```\n\n为运⾏ansible命令的⽤户提升权限为sudo_user的权限，此命令已废弃，使⽤become代替\n\n```bash\n-U SUDO_USER\n--sudo-user=SUDO_USER\n```\n\n期望的sudo_user，默认为root，已废弃，使⽤become替代\n\n```bash\n-S\n--su\n```\n\n使⽤su的⽅式执⾏操作，已废弃，使⽤become替代\n\n```bash\n-R SU_USER\n--su-user=SU_USER\n```\n\n使⽤此user的su执⾏操作，默认为root，已废弃，使⽤become替代\n\n```bash\n-b\n--become\n```\n\n使⽤become的⽅式升级权限\n\n```bash\n--become-method=BECOME_METHOD\n```\n\n指定提升权限的⽅式，可选以下⼏种：sudo/su/pbrun/pf exec/doas/dzdo/ksu/runas值\n\n```bash\n--become-user=BECOME_USER\n```\n\n要提升为哪个user的权限，默认为root\n\n```bash\n--ask-sudo-pass\n```\n\n询问sudo密码，已废弃，使⽤become替代\n\n```bash\n--ask-su-pass\n```\n\n询问su的密码，已废弃，使⽤become替代\n\n```bash\n-K\n--ask-become-pass\n```\n\n询问become提升权限时的密码\n\n\n## 常用模块\n\n可以利用ansible-doc -l | grep 找到支持的模块，再利用ansible-doc -s查看模块的用法。\n官方模块列表和说明：<https://docs.ansible.com/ansible/latest/modules_by_category.html>\n\nansible绝⼤多数模块都天然具有幂等特性，只有极少数模块如shell和command模块不具备幂等性。所谓的幂等性\n是指多次执⾏同⼀个操作不会影响最终结果。例如，ansible的yum模块安装rpm包时，如果待安装的包已经安装过\n了，则再次或多次执⾏安装操作都不会真正的执⾏下去。再例如，copy模块拷贝⽂件时，如果⽬标主机上已经有了\n完全相同的⽂件，则多次执⾏copy模块不会真正的拷贝。ansible具有幂等性的模块在执⾏时，都会⾃动判断是否\n要执⾏。\n\n### shell与command\n\n默认ansible使⽤的模块是command，即可以执⾏⼀些shell命令。shell和command的⽤法基本⼀样，实际上shell\n模块执⾏命令的⽅式是在远程使⽤/bin/sh来执⾏的，如/bin/sh ping。\\\ncommand不能解析变量(如$HOME)和某些操作符(\"<\", \">\", \"|\", \";\"以及\"&\")，所以明确要使⽤这些不可解析的操作符\n时，使⽤shell模块来代替command。\n\n```bash\nansible-doc -s shell\n- name: Execute commands in nodes.\n  action: shell\n    chdir       # 在执⾏命令前，先cd到指定的⽬录下\n    creates     # ⽤于判断命令是否要执⾏。如果指定的⽂件(可以使⽤通配符)存在，则不执⾏。\n    removes     # ⽤于判断命令是否要执⾏。如果指定的⽂件(可以使⽤通配符)不存在，则不执⾏。\n    executable  # 不再使⽤默认的/bin/sh解析并执⾏命令，⽽是使⽤此处指定的命令解析。例如使⽤expect解析expect脚本。必须为绝对路径。\n```\n\n在ansible中使⽤shell或command模块⼀定要注意，它们默认不满⾜幂等性，很多操作会重复执⾏，但有些操作是\n不允许重复执⾏的。例如mysql的初始化命令mysql_install_db，它只能在第⼀次配置的过程中初始化⼀次，其他任\n何时候如⾮需要则不允许执⾏。这时候要实现幂等性，可以通过模块的creates和removes选项进⾏判断，但⽆论\n如何，在执⾏这两个模块的时候都需要考虑要执⾏的命令是否应该实现幂等性。\n\n```bash\ntasks:\n- shell: touch helloworld.txt creates=/tmp/hello.txt\n```\n\n### copy模块\n\n```bash\nansible-doc -s copy\n- name: Copies files to remote locations.\n  action: copy\n    backup=[yes|no]  # 拷贝的同时也创建⼀个包含时间戳信息的备份⽂件，默认为no\n    dest=            # ⽬标路径，只能是绝对路径，如果拷贝的⽂件是⽬录，则⽬标路径必须也是⽬录\n    content          # 直接以content给定的字符串或变量值作为⽂件内容保存到远程主机上，它会替代src选项\n    directory_mode   # 当对⽬录做递归拷贝时，设置了directory_mode将会使得只拷贝新建⽂件，旧⽂件不会被拷贝。默认未设置\n    follow=[yes|no]  # 是否追踪到链接的源⽂件。\n    force=[yes|no]   # 设置为yes(默认)时，将覆盖远程同名⽂件。设置为no时，忽略同名⽂件的拷贝。\n    group            # 设置远程⽂件的所属组\n    owner            # 设置远程⽂件的所有者\n    mode=            # 设置远程⽂件的权限。使⽤数值表⽰时不能省略第⼀位，如0644。也可以使⽤'u+rwx'或'u=rw,g=r,o=r'等⽅式设置。\n    src=             # 拷贝本地源⽂件到远程，可使⽤绝对路径或相对路径。如果路径是⽬录，且⽬录后加了斜杠\"/\"，则只会拷贝⽬录\n```\n\n如果拷贝的是⽬录，则⽬标路径必须是⽬录路径。如果使⽤\"/\"结尾，则拷贝的是⽬录中的⽂件，如果不以斜杠结\n尾，则拷贝的是⽬录加⽬录中的⽂件。\n\n```bash\nmkdir /tmp/a\ntouch /tmp/a/{1..10}.txt\nansible centos -m copy -a \"src=/tmp/a dest=/tmp\" -o -f 6\n```\n\n### template模块\n\ntemplate模块⽤法和copy模块⽤法基本⼀致，它主要⽤于复制配置⽂件。\n\n```bash\nansible-doc -s template\n- name: Templates a file out to a remote server.\n  action: template\n    backup      # 拷贝的同时也创建⼀个包含时间戳信息的备份⽂件，默认为no\n    dest=       # ⽬标路径\n    force       # 设置为yes (默认)时，将覆盖远程同名⽂件。设置为no时，忽略同名⽂件的拷贝\n    group       # 设置远程⽂件的所属组\n    owner       # 设置远程⽂件的所有者\n    mode        # 设置远程⽂件的权限。使⽤数值表⽰时不能省略第⼀位，如0644。也可以使⽤'u+rwx' or 'u=rw,g=r,o=r'等⽅式设置\n    src=        # ansible控制器上Jinja2格式的模板所在位置，可以是相对或绝对路径\n    validate    # 在复制到⽬标主机后但放到⽬标位置之前，执⾏此选项指定的命令。⼀般⽤于检查配置⽂件语法，语法正确则保存到⽬标位置。\n                # 如果要引⽤⽬标⽂件名，则使⽤%s，下⾯的⽰例中的s%即表⽰⽬标机器上的/etc/nginx/nginx.conf。\n\nansible centos -m template -a \"src=/tmp/nginx.conf.j2 dest=/etc/nginx/nginx.conf mode=0770 owner=root group=root ba\nckup=yes validate='nginx -t -c %s'\" -o -f 6\n```\n\n虽然template模块可以按需求修改配置⽂件内容来复制模板到被控主机上，但是有⼀种情况它是不能解决的：不同\n被控节点所需的配置⽂件差异很⼤，并⾮修改⼏个变量就可以满⾜。例如在centos 6和centos 7上通过yum安装的\nnginx，它们的配置⽂件内容相差⾮常⼤，且centos 6上的nginx的默认就有⼀个/etc/nginx/conf .d/def ault.conf 。\n如果直接复制同⼀个模板的nginx配置⽂件到centos 6和centos 7上，很可能导致某⼀版本的nginx不能启动。\n这时就有必要在复制模板时挑选对应发⾏版的模板⽂件进⾏配对复制，例如要复制到centos 6上的源模板是\nnginx6.co nf .j2，复制到centos 7上的源模板是nginx7.conf .j2。这种⾏为可以称之为\"基于变量选择文件或模\n板\"。\n\n```bash\n- tasks:\n  - name: template file based var\n    template: src=/templates/nginx{{ ansible_distribution_major_version }}.conf.j2 dest=/etc/nginx/nginx.conf validate=\"/usr/sbin/nginx -t -c %s\"\n```\n\n还可以在⽂件内容中指定jinja2的替代变量，在ansible执⾏时⾸先会根据变量内容进⾏渲染，渲染后再执⾏相关模\n块。例如，此处的template模块，复制⼀个基于发⾏版本号的yum源配置⽂件。以下是某个repo⽂件模板\nbase.repo.j2的内容。\n\n```bash\n[epel]\nname=epel\nbaseurl=http://mirrors.aliyun.com/epel/{{ ansible_distribution_major_version }}Server/x86_64/\nenable=1\ngpgcheck=0\n```\n\n再复制即可。\n\n```bash\n- tasks:\n  - template: src=my.repo.j2 dest=/etc/yum.repos.d/my.repo\n```\n\n### file模块\n\n管理⽂件、⽬录的属性，也可以创建⽂件或⽬录。\n\n```bash\nansible-doc -s file\n- name: Sets attributes of files\n  action: file\n    group       # file/directory的所属组\n    owner       # file/directory的所有者\n    mode        # 修改权限，格式可以是0644、'u+rwx'或'u=rw,g=r,o=r'等\n    path=       # 指定待操作的⽂件，可使⽤别名'dest'或'name'来替代path\n    recurse     # (默认no)递归修改⽂件的属性信息，要求state=directory\n    src         # 创建链接时使⽤，指定链接的源⽂件\n    state       # directory:如果⽬录不存在则递归创建\n                # file:⽂件不存在时，不会被创建(默认值)\n                # touch:touch由path指定的⽂件，即创建⼀个新⽂件，或修改其mtime和atime\n                # link:修改或创建软链接\n                # hard:修改或创建硬链接\n                # absent:⽬录和其中的⽂件会被递归删除，⽂件或链接将取消链接状态\n```\n\nfile可以递归创建目录，但不能在不存在的目录中创建文件，需要先创建目录再创建文件。\n\n```bash\n创建目录，并递归修改目录属性\nansible 192.168.10.11 -m file -a 'path=/tmp/xyz state=directory owner=root group=root mode=0755 recurse=yes'\n修改目录中的属性\nansible 192.168.10.11 -m file -a 'path=/tmp/xyz state=touch mode=0644'\n创建或修改文件属性\nansible 192.168.10.11 -m file -a 'path=/tmp/xyz/a.txt state=touch mode=0644'\n```\n\n### yum模块\n\n```bash\nansible-doc -s yum\n- name: Manages packages with the `yum' package manager\n  action: yum\n    disable_gpg_check   # 安装包时禁⽌gpgcheck，仅在state=present或latest时⽣效。\n    disablerepo         # 禁⽤指定的repoid，多个repoid使⽤逗号分隔。\n    enablerepo          # 明确使⽤该repoid\n    exclude             # 排除哪些包不安装，仅在state=present或latest时⽣效。\n    list                # 类似于yum list。\n    name=               # 指定安装的包名，可带上版本号。多个包可使⽤逗号分隔。\n    state               # 状态。('present'、'installed','latest')⽤于安装包，\n                        # ('absent'、'removed')⽤于移除已安装包。\n    update_cache        # 强制更新yum的cache。\n```\n\nname需要配合state来使⽤，如果state指定为present/installed/latest将安装包，其中latest是安装最新包，默认\n为present。如果指定为absent/removed则⽤于卸载包。\n\n在ansible中，很多地⽅都会出现present和absent的状态，它们⼀般都表⽰⽬标是否应该存在还是不存在，也就是\n要进⾏的动作是创建和删除。\n\n安装本地的包，且排除某些包不安装\n\n```bash\nansible centos -m yum -a \"name=/tmp/*.rpm exclude=*unix* state=present\"\n```\n\n卸载包\n\n```bash\nansible centos -m yum -a \"name=dos2unix state=removed\" -o -f 6\n```\n\n### yum_repository\n\n用于配置yum源，可以实现完整的yum仓库配置。但是一般只需简单的yum源配置。\n\n```bash\nansible-doc -s yum_repository\n- name: Add or remove YUM repositories\n  action: yum_repository\n    baseurl         # 地址\n    mirrorlist      # 设置mirrorlist地址\n    description     # 描述信息\n    enabled         # 是否启⽤该仓库，默认为yes\n    file            # 保存此仓库的⽂件，不设置该项的话则默认以name选项中的名称命名，将⾃动以\".repo\"后缀结尾。\n    gpgcheck        # 是否要进⾏gpgcheck\n    name=           # 仓库的名称，要保证名称的唯⼀性\n    reposdir        # 保存.repo⽂件的⽬录，默认/etc/yum.repos.d/\n    state           # repo⽂件的状态，present/absent，默认present。\n```\n\n如：\n\n```bash\n- name: Add repository\n  yum_repository:\n    name: aliyun_epel\n    description: EPEL YUM repo\n    baseurl: http://mirrors.aliyun.com/epel/7/$basearch/\n\n- name: Add multiple repositories into a file\n  yum_repository:\n    name: epel\n    description: EPEL YUM repo\n    file: sohu_epel\n    baseurl: http://mirrors.sohu.com/fedora-epel/7/$basearch/\n    gpgcheck: no\n\nansible 192.168.100.63 -m yum_repository -a 'name=aliyun_epel description=\"epel repo\" baseurl=http://mirrors.aliyun\n.com/epel/7/$basearch/ gpgcheck=no enabled=yes'\n```\n\n### service模块\n\n```bash\nansible-doc -s service\n- name: Manage services.\n  action: service\n    enabled     # 设置服务为开机⾃启动，默认为no\n    name=       # 服务名\n    state       # 'started'和'stoped'分别启动和停⽌服务，它们是幂等操作，多次启动或停⽌服务的结果是⼀样的，\n                # 也就是说对于运⾏中的服务不会再执⾏启动操作，同理停⽌也是⼀样。'restarted'总是重启服务，\n                # 'reloaded'总是重读配置⽂件，如果服务是未运⾏状态，则'reloaded会启动服务。\n                # (state和enabled两者⾄少要给⼀个)\n```\n\n### systemd模块\n\n```bash\nansible-doc -s systemd\n- name: Manage services.\n  action: systemd\n    daemon_reload   # 在执⾏所有动作之前，先确定是否要reload⼀次。值为yes/no。\n    enabled         # 是否设置开机⾃启动。\n    masked          # 是否将此unit做mask(隐藏、掩盖)处理。mask后的unit将⽆法启动。\n    name=           # 待操作服务名。可以是name，也可以是name.service。\n    state           # 'started'/'stopped'具有幂等性。但restarted和reloaded总是会执⾏。\n```\n\n### user模块\n\n```bash\nansible-doc -s user\n- name: Manage user accounts\n  action: user\n    name=           # 要创建、修改、移除的⽤户名。\n    password        # 设置⽤户密码。此处只能使⽤加密密码作为值。\n    system          # 设置为yes表⽰创建⼀个系统⽤户，只能⽤于创建，不能⽤于修改已有⽤户为系统⽤户。\n    state           # 创建⽤户(present)还是删除⽤户(absent)。默认为present。\n    createhome      # 创建家⽬录，或者已有的⽤户但家⽬录不存在也会创建。设置为no则不创建家⽬录。\n    home            # 指定要创建的家⽬录路径\n    move_home       # 如果设置为yes，则\"home=\"则表⽰将家⽬录移动到此选项指定的路径下。\n    uid             # 设置⽤户的uid\n    group           # 设置⽤户的primary group\n    groups          # 将⽤户加⼊到辅助组列表中。如果设置\"groups=\"，则会将此⽤户从所有辅助组中移除。\n    shell           # 设置⽤户的shell。\n    force           # 配合'state=absent'时，等价于'userdel --force'，即强制删除⽤户、家⽬录和邮件列表。\n    remove          # 配合'state=absent'时，等价于'userdel --remove'，即删除家⽬录和邮件列表。\n    update_password # user是幂等模块，\"always\"将总是修改密码。\"on_create\"将只在创建⽤户时设置密码。\n```\n\n创建系统用户并制定shell\n\n```bash\nansible centos -m user -a \"name=longshuai system=yes shell=/sbin/nologin\"\n```\n\n指定update_password=always 将总是修改⽤户的密码，不管该⽤户是否已存在。⽽update_password=on_create 则只有新\n创建⽤户时才设置密码，如果⽤户已存在，则不会修改该⽤户的密码。默认值就是always。\n\n```bash\nopenssl passwd -1 123456\n$1$9jwmFoVU$MVz7ywscpoPS5WXC.srcP/\nansible centos -m user -a 'name=longshuai3 password=\"$1$9jwmFoVU$MVz7ywscpoPS5WXC.srcP/\" update_password=always'\n\n创建用户并制定密码，但如果用户已经存在则不修改密码。\nopenssl passwd -1 234567\n$1$J9Nt0scL$R9Db5Pi1AJ7FQv4Xzia0w/\nansible centos -m user -a 'name=longshuai3 password=\"$1$J9Nt0scL$R9Db5Pi1AJ7FQv4Xzia0w/\" update_password=on_create'\n```\n\n参考自：<https://www.cnblogs.com/f-ck-need-u/p/7576137.html#ansible>","categoryId":3,"viewCount":907,"categoryName":"Ansible","author":"球接子","authorAvatar":null,"tagIds":[3],"tagNames":["Ansible"]}}