Ansible中如何实现信息检索幂等?
How to make information retrieval idempotent in Ansible?
我正在尝试获取有关服务器上证书的信息,以便在证书即将过期时采取措施。我正在采取的步骤是:
# Does the certificate already exist?
- name: certbot | does cert already exist
stat:
path: "/etc/letsencrypt/live/{{certbot_domain}}//cert.pem"
register: certbot_certificate
# Get the expiration date for the certificate in ISO format.
- name: certbot | get cert expiration date
shell: "date --date=\"$(openssl x509 -in /etc/letsencrypt/live/{{certbot_domain}}/cert.pem -noout -enddate | cut -d= -f 2)\" --iso-8601"
register: certbot_expiration_date
when: certbot_certificate.stat.exists == True
# Convert the expiration date into the number of seconds from today.
- name: certbot | calculating expiration in seconds
shell: "echo $(($(date --date={{certbot_expiration_date.stdout}} +%s) - $(date +%s)))"
register: certbot_expires_in
when: certbot_certificate.stat.exists == True
我的问题是两个 shell 命令在 Ansible 中总是被标记为 "Changed",这意味着这个 playbook 不能是幂等的。
我明白为什么会这样,因为 Ansible 无法真正理解 shell 命令做了什么,所以说 "Changed" 是为了安全起见,但我想知道是否有实现相同结果的幂等方法?
差点写个扩展,就是……:)
谢谢。
事实证明,答案是向任务添加 changed_when 语句,例如:
- name: certbot | get cert expiration date
shell: "date --date=\"$(openssl x509 -in /etc/letsencrypt/live/{{certbot_domain}}/cert.pem -noout -enddate | cut -d= -f 2)\" --iso-8601"
register: certbot_expiration_date
changed_when: False
when: certbot_certificate.stat.exists == True
因为我知道 shell 命令没有改变任何东西,所以我可以安全地将 changed_when 设置为 false,这确保最终计数显示 Changed=0,从而使剧本幂等。
我正在尝试获取有关服务器上证书的信息,以便在证书即将过期时采取措施。我正在采取的步骤是:
# Does the certificate already exist?
- name: certbot | does cert already exist
stat:
path: "/etc/letsencrypt/live/{{certbot_domain}}//cert.pem"
register: certbot_certificate
# Get the expiration date for the certificate in ISO format.
- name: certbot | get cert expiration date
shell: "date --date=\"$(openssl x509 -in /etc/letsencrypt/live/{{certbot_domain}}/cert.pem -noout -enddate | cut -d= -f 2)\" --iso-8601"
register: certbot_expiration_date
when: certbot_certificate.stat.exists == True
# Convert the expiration date into the number of seconds from today.
- name: certbot | calculating expiration in seconds
shell: "echo $(($(date --date={{certbot_expiration_date.stdout}} +%s) - $(date +%s)))"
register: certbot_expires_in
when: certbot_certificate.stat.exists == True
我的问题是两个 shell 命令在 Ansible 中总是被标记为 "Changed",这意味着这个 playbook 不能是幂等的。
我明白为什么会这样,因为 Ansible 无法真正理解 shell 命令做了什么,所以说 "Changed" 是为了安全起见,但我想知道是否有实现相同结果的幂等方法?
差点写个扩展,就是……:)
谢谢。
事实证明,答案是向任务添加 changed_when 语句,例如:
- name: certbot | get cert expiration date
shell: "date --date=\"$(openssl x509 -in /etc/letsencrypt/live/{{certbot_domain}}/cert.pem -noout -enddate | cut -d= -f 2)\" --iso-8601"
register: certbot_expiration_date
changed_when: False
when: certbot_certificate.stat.exists == True
因为我知道 shell 命令没有改变任何东西,所以我可以安全地将 changed_when 设置为 false,这确保最终计数显示 Changed=0,从而使剧本幂等。